{"version":3,"file":"assets/js/app.js","mappings":";wCAgBA,IAAIA,EAAa,EAAQ,KACrBC,EAAc,EAAQ,MAEtBC,EAAgB,EAAQ,KACxBC,EAAiB,EAAQ,MACzBC,EAAe,EAAQ,MACvBC,EAAiB,EAAQ,MACzBC,EAAc,EAAQ,MACtBC,EAAgB,EAAQ,MACxBC,EAAU,EAAQ,MAClBC,EAAkB,EAAQ,MAC1BC,EAAY,EAAQ,MACpBC,EAAiB,EAAQ,MACzBC,EAAgB,EAAQ,MACxBC,EAAmB,EAAQ,MAC3BC,EAAY,EAAQ,MACpBC,EAAc,EAAQ,MACtBC,EAAc,EAAQ,MACtBC,EAAe,EAAQ,MACvBC,EAAQ,EAAQ,MAChBC,EAAO,EAAQ,MACfC,EAAY,EAAQ,MACpBC,EAAU,EAAQ,MAClBC,EAAO,EAAQ,MACfC,EAAkB,EAAQ,MAC1BC,EAAgB,EAAQ,MACxBC,EAAU,EAAQ,MAClBC,EAAkB,EAAQ,MAC1BC,EAAY,EAAQ,KACpBC,EAAkB,EAAQ,MAc1BC,EAAU,WAOZC,KAAKC,SAAW,uCAAuCC,QAAQ,OAAQ,IAOvEF,KAAKG,OAAS,CACZC,OAAQ,GACRC,YAAa,GACbC,OAAQ,kBAQVN,KAAKO,eAAiB,CAAC,EAMvBP,KAAKQ,QAAU,KAQfR,KAAKS,OAAQ,EAObT,KAAKU,eAAgB,EAMC,oBAAXC,SACTX,KAAKY,MAAQ,IAAI1C,EAAW0C,OAI9BZ,KAAKa,cAAgB,IAAIzC,EAAc4B,MACvCA,KAAKc,eAAiB,IAAIzC,EAAe2B,MACzCA,KAAKe,aAAe,IAAIzC,EAAa0B,MACrCA,KAAKgB,eAAiB,IAAIzC,EAAeyB,MACzCA,KAAKiB,YAAc,IAAIzC,EAAYwB,MACnCA,KAAKkB,cAAgB,IAAIzC,EAAcuB,MACvCA,KAAKmB,QAAU,IAAIzC,EAAQsB,MAC3BA,KAAKoB,gBAAkB,IAAIzC,EAAgBqB,MAC3CA,KAAKqB,UAAY,IAAIzC,EAAUoB,MAC/BA,KAAKsB,eAAiB,IAAIzC,EAAemB,MACzCA,KAAKuB,cAAgB,IAAIzC,EAAckB,MACvCA,KAAKwB,iBAAmB,IAAIzC,EAAiBiB,MAC7CA,KAAKyB,UAAY,IAAIzC,EAAUgB,MAC/BA,KAAK0B,YAAc,IAAIzC,EAAYe,MACnCA,KAAK2B,YAAc,IAAIzC,EAAYc,MACnCA,KAAK4B,aAAe,IAAIzC,EAAaa,MACrCA,KAAK6B,MAAQ,IAAIzC,EAAMY,MACvBA,KAAK8B,KAAO,IAAIzC,EAAKW,MACrBA,KAAK+B,UAAY,IAAIzC,EAAUU,MAC/BA,KAAKgC,QAAU,IAAIzC,EAAQS,MAC3BA,KAAKiC,KAAO,IAAIzC,EAAKQ,MACrBA,KAAKkC,gBAAkB,IAAIzC,EAAgBO,MAC3CA,KAAKmC,cAAgB,IAAIzC,EAAcM,MACvCA,KAAKL,QAAU,IAAIA,EAAQK,MAC3BA,KAAKoC,gBAAkB,IAAIxC,EAAgBI,MAC3CA,KAAKqC,UAAY,IAAIxC,EAAUG,MAC/BA,KAAKsC,gBAAkB,IAAIxC,EAAgBE,KAC7C,EAMAD,EAAQwC,UAAUC,UAAY,SAASrC,EAAS,CAAC,GAE/CH,KAAKG,OAASA,CAChB,EAOAJ,EAAQwC,UAAUE,cAAgB,SAASC,GACzC,OAAaC,MAATD,GAA+B,MAATA,EACjB,GAELA,aAAiBE,KACZF,EAAMG,SAERH,EAAMI,UACf,EASA/C,EAAQwC,UAAUQ,SAAW,SAASC,EAAMC,GACrCD,EAAKE,MAAM,SACdF,EAAO,IAAMA,GAEf,IAAIG,EAAMnD,KAAKC,SAAW+C,EACtBI,EAAQpD,KAgBZ,OAfAmD,EAAMA,EAAIjD,QAAQ,iBAAiB,SAASmD,EAAWC,GACrD,IAAIC,EAMJ,OAJEA,EADEN,EAAWO,eAAeF,GACpBF,EAAMX,cAAcQ,EAAWK,IAE/BD,EAEHI,mBAAmBF,EAC5B,SAGkC,IAAvBvD,KAAKG,OAAOG,SACrB6C,EAAMA,EAAIjD,QAAQ,SAAUF,KAAKG,OAAOG,SAGnC6C,CACT,EAaApD,EAAQwC,UAAUmB,WAAa,SAASC,GACtC,OAAOC,QAAuB,MAAfD,GAAuBA,EAAYT,MAAM,8BAC1D,EAOAnD,EAAQwC,UAAUsB,kBAAoB,SAASC,GAC7C,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAaE,OAAQD,IACvC,GAAI/D,KAAK0D,WAAWI,EAAaC,IAC/B,OAAOD,EAAaC,GAGxB,OAAOD,EAAa,EACtB,EAOA/D,EAAQwC,UAAU0B,YAAc,SAASvB,GAGrC,IAAIwB,EACJ,IACEA,EAAK,EAAQ,KACf,CAAE,MAAOC,GAAM,CACf,SAAID,GAAMA,EAAGE,YAAc1B,aAAiBwB,EAAGE,cAK3B,mBAAXC,QAAyB3B,aAAiB2B,SAIjC,mBAATC,MAAuB5B,aAAiB4B,MAI/B,mBAATC,MAAuB7B,aAAiB6B,MAIrD,EAYAxE,EAAQwC,UAAUiC,gBAAkB,SAASC,GAC3C,IAAIC,EAAY,CAAC,EACjB,IAAK,IAAIpB,KAAOmB,EACd,GAAIA,EAAOjB,eAAeF,IAAuBX,MAAf8B,EAAOnB,IAAoC,MAAfmB,EAAOnB,GAAc,CACjF,IAAIC,EAAQkB,EAAOnB,GACftD,KAAKiE,YAAYV,IAAUoB,MAAMC,QAAQrB,GAC3CmB,EAAUpB,GAAOC,EAEjBmB,EAAUpB,GAAOtD,KAAKyC,cAAcc,EAExC,CAEF,OAAOmB,CACT,EAOA3E,EAAQ8E,qBAAuB,CAK7BC,IAAK,IAKLC,IAAK,IAKLC,IAAK,KAKLC,MAAO,IAKPC,MAAO,SAUTnF,EAAQwC,UAAU4C,qBAAuB,SAA8BzC,EAAO0C,GAC5E,GAAa,MAAT1C,EACF,OAAO,KAET,OAAQ0C,GACN,IAAK,MACH,OAAO1C,EAAM2C,IAAIrF,KAAKyC,eAAe6C,KAAK,KAC5C,IAAK,MACH,OAAO5C,EAAM2C,IAAIrF,KAAKyC,eAAe6C,KAAK,KAC5C,IAAK,MACH,OAAO5C,EAAM2C,IAAIrF,KAAKyC,eAAe6C,KAAK,MAC5C,IAAK,QACH,OAAO5C,EAAM2C,IAAIrF,KAAKyC,eAAe6C,KAAK,KAC5C,IAAK,QAEH,OAAO5C,EAAM2C,IAAIrF,KAAKyC,eACxB,QACE,MAAM,IAAI8C,MAAM,8BAAgCH,GAEtD,EAWArF,EAAQwC,UAAUiD,YAAc,SAAqBC,EAAUC,GAC7D,GAAgB,MAAZD,GAAkC,MAAdC,GAAyC,KAAnBD,EAASE,OACrD,OAAO,KAIT,IAAIC,EAAOH,EAASI,KAKpB,OAJY,MAARD,GAAiC,iBAATA,QAA4C,IAAhBA,EAAK5B,SAA2B8B,OAAOC,KAAKH,GAAM5B,UAExG4B,EAAOH,EAASO,MAEXjG,EAAQkG,cAAcL,EAAMF,EACrC,EAkBA3F,EAAQwC,UAAU2D,QAAU,SAAiBlD,EAAMmD,EAAYlD,EAC3DmD,EAAaC,EAAcC,EAAYC,EAAWC,EAAW1C,EAAc2C,EAC3Ef,GAEF,IAAItC,EAAQpD,KACRmD,EAAMnD,KAAK+C,SAASC,EAAMC,GAC1ByD,EAAUxI,EAAWiI,EAAYhD,QAGVR,IAAvB3C,KAAKG,OAAOC,QAA+C,KAAvBJ,KAAKG,OAAOC,OAClDsG,EAAQC,KAAK,OAAQ3G,KAAKG,OAAOC,aAIEuC,IAA5B3C,KAAKG,OAAOE,aAAyD,KAA5BL,KAAKG,OAAOE,aAC5DqG,EAAQE,IAAI,CAAC,cAAiB,UAAY5G,KAAKG,OAAOE,cAIvB,QAA7B8F,EAAWU,gBAA0C,IAAf7G,KAAKS,QAC7C2F,EAAe,GAAI,IAAIxD,MAAOkE,WAEhCJ,EAAQK,MAAM/G,KAAKwE,gBAAgB4B,IAGnCM,EAAQE,IAAI5G,KAAKO,gBAAgBqG,IAAI5G,KAAKwE,gBAAgB6B,IAG1DK,EAAQlG,QAAQR,KAAKQ,SAErB,IAAImD,EAAc3D,KAAK6D,kBAAkBC,GAUzC,GATIH,EAEgB,uBAAfA,GACD+C,EAAQM,KAAKrD,GAELsD,YAAYC,mBAAmBR,EAAQS,OAAQ,iBACzDT,EAAQM,KAAK,oBAGK,sCAAhBrD,EACF+C,EAAQU,KAAKjJ,EAAYkJ,UAAUrH,KAAKwE,gBAAgB8B,UACnD,GAAmB,uBAAf3C,EAAsC,CAC/C,IAAI2D,EAActH,KAAKwE,gBAAgB8B,GACvC,IAAK,IAAIhD,KAAOgE,EACVA,EAAY9D,eAAeF,KACzBtD,KAAKiE,YAAYqD,EAAYhE,IAE/BoD,EAAQa,OAAOjE,EAAKgE,EAAYhE,IAEhCoD,EAAQc,MAAMlE,EAAKgE,EAAYhE,IAIvC,MAAWiD,GACTG,EAAQU,KAAKb,GAGf,IAAIkB,EAASzH,KAAK6D,kBAAkB4C,GAqBpC,OApBIgB,GACFf,EAAQe,OAAOA,GAGE,SAAf/B,EACFgB,EAAQgB,aAAa,QACG,WAAfhC,GACTgB,EAAQgB,aAAa,UAInB1H,KAAKU,gBACe,oBAAXC,OACTX,KAAKY,MAAM+G,cAAcjB,GAGzBA,EAAQkB,mBAIL,IAAIC,SAAQ,SAASC,EAASC,GACnCrB,EAAQsB,KAAI,SAASC,EAAOxC,GAC1B,GAAIwC,EACFF,EAAOE,QAEP,IACE,IAAIrC,EAAOxC,EAAMoC,YAAYC,EAAUC,GACnCtC,EAAM1C,eAAmC,oBAAXC,QAChCyC,EAAMxC,MAAMsH,YAAYzC,GAE1BqC,EAAQ,CAAClC,KAAMA,EAAMH,SAAUA,GACjC,CAAE,MAAOtB,GACP4D,EAAO5D,EACT,CAEJ,GACF,GACA,EAOFpE,EAAQoI,UAAY,SAASC,GAC3B,OAAO,IAAIxF,KAAKwF,EAAIlI,QAAQ,KAAM,KACpC,EAWAH,EAAQkG,cAAgB,SAASL,EAAMoB,GACrC,GAAIpB,QACF,OAAOA,EAET,OAAQoB,GACN,IAAK,UACH,OAAOpD,QAAQgC,GACjB,IAAK,UACH,OAAOyC,SAASzC,EAAM,IACxB,IAAK,SACH,OAAO0C,WAAW1C,GACpB,IAAK,SACH,OAAO2C,OAAO3C,GAChB,IAAK,OACH,OAAO5F,KAAKmI,UAAUI,OAAO3C,IAC/B,IAAK,OACH,OAAOA,EACT,QACE,GAAIoB,IAASlB,OAEX,OAAOF,EACF,GAAoB,mBAAToB,EAEhB,OAAOA,EAAKwB,oBAAoB5C,GAC3B,GAAIjB,MAAMC,QAAQoC,GAAO,CAE9B,IAAIyB,EAAWzB,EAAK,GACpB,OAAOpB,EAAKP,KAAI,SAASqD,GACvB,OAAO3I,EAAQkG,cAAcyC,EAAMD,EACrC,GACF,CAAO,GAAoB,iBAATzB,EAAmB,CAEnC,IAAI2B,EAASC,EACb,IAAK,IAAIC,KAAK7B,EACZ,GAAIA,EAAKxD,eAAeqF,GAAI,CAC1BF,EAAUE,EACVD,EAAY5B,EAAK6B,GACjB,KACF,CAEF,IAAIC,EAAS,CAAC,EACd,IAAK,IAAID,KAAKjD,EACZ,GAAIA,EAAKpC,eAAeqF,GAAI,CAC1B,IAAIvF,EAAMvD,EAAQkG,cAAc4C,EAAGF,GAC/BpF,EAAQxD,EAAQkG,cAAcL,EAAKiD,GAAID,GAC3CE,EAAOxF,GAAOC,CAChB,CAEF,OAAOuF,CACT,CAEE,OAAOlD,EAGf,EAOA7F,EAAQyI,oBAAsB,SAAS5C,EAAMmD,EAAKN,GAChD,GAAI9D,MAAMC,QAAQgB,GAChB,IAAK,IAAI7B,EAAI,EAAGA,EAAI6B,EAAK5B,OAAQD,IAC3B6B,EAAKpC,eAAeO,KACtBgF,EAAIhF,GAAKhE,EAAQkG,cAAcL,EAAK7B,GAAI0E,SAG5C,IAAK,IAAII,KAAKjD,EACRA,EAAKpC,eAAeqF,KACtBE,EAAIF,GAAK9I,EAAQkG,cAAcL,EAAKiD,GAAIJ,GAGhD,EAMA1I,EAAQiJ,SAAW,IAAIjJ,EAEvBkJ,EAAOlJ,QAAUA,uBCpjBjB,IAAImJ,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAWxChJ,KAAKoJ,8BAAgC,SAASC,EAAUC,GACtDA,EAAOA,GAAQ,CAAC,EAIhB,GAAID,QACF,MAAM,IAAI9D,MAAM,2DAGlB,IAAItC,EAAa,CACf,UAAaoG,GAQXjD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,+BAAgC,MAChCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKuJ,kBAAoB,SAASF,EAAUC,GAC1C,OAAOtJ,KAAKoJ,8BAA8BC,EAAUC,GACjDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBChFA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAYxChJ,KAAK0J,+BAAiC,SAASJ,GAC7CA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mBAAoB,MA1BL,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK2J,mBAAqB,SAASL,GACjC,OAAOtJ,KAAK0J,+BAA+BJ,GACxCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK4J,gCAAkC,SAAS/D,GAC9C,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,mBAAoB,OAtBL,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK8J,oBAAsB,SAASjE,GAClC,OAAO7F,KAAK4J,gCAAgC/D,GACzC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCpIA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAUxChJ,KAAK+J,4BAA8B,SAAST,GAE1C,IAUIlD,EAAc,CAChB,QAZFkD,EAAOA,GAAQ,CAAC,GAYS,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,+BAAgC,MAxBjB,CACjB,EAwBcE,EAbK,CACnB,EAEiB,CACjB,EAlBe,KAoBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASApG,KAAKgK,gBAAkB,SAASV,GAC9B,OAAOtJ,KAAK+J,4BAA4BT,GACrCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCxEA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAYxChJ,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mBAAoB,MA1BL,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmK,gBAAkB,SAASC,EAAOd,GACrCA,EAAOA,GAAQ,CAAC,EAIhB,GAAIc,QACF,MAAM,IAAI7E,MAAM,wDAGlB,IAAItC,EAAa,CACf,OAAUmH,GAQRhE,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,4BAA6B,MAC7BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqK,IAAM,SAASD,EAAOd,GACzB,OAAOtJ,KAAKmK,gBAAgBC,EAAOd,GAChCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBC9IA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKsK,oBAAsB,SAASC,GAIlC,GAAIA,QACF,MAAM,IAAIhF,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAesH,GAqBjB,OAAOvK,KAAKmJ,UAAUjD,QACpB,6CAA8C,OAC9CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKwK,QAAU,SAASD,GACtB,OAAOvK,KAAKsK,oBAAoBC,GAC7Bf,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKyK,gCAAkC,SAASF,EAAYG,GAI1D,GAAIH,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAImF,QACF,MAAM,IAAInF,MAAM,kEAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,kBAAqBG,GAqBvB,OAAO1K,KAAKmJ,UAAUjD,QACpB,wDAAyD,SACzDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAK2K,oBAAsB,SAASJ,EAAYG,GAC9C,OAAO1K,KAAKyK,gCAAgCF,EAAYG,GACrDlB,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAiBA5F,KAAKiK,iBAAmB,SAASX,GAE/B,IAUIlD,EAAc,CAChB,QAZFkD,EAAOA,GAAQ,CAAC,GAYS,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,OAAUtJ,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,mBAAwBA,EAAuB,iBAAIA,EAAuB,iBAAIA,EAAyB,mBACvG,kBAAuBA,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAwB,kBACnG,kBAAuBA,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAwB,kBACnG,iBAAsBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAuB,iBAC/F,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,eAAgB,MA/BD,CACjB,EA+BcE,EAbK,CACnB,EAEiB,CACjB,EAzBe,KA2BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAgBApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmK,gBAAkB,SAASI,EAAYjB,GAC1CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIiB,QACF,MAAM,IAAIhF,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAesH,GAQbnE,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6BAA8B,MAC9BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqK,IAAM,SAASE,EAAYjB,GAC9B,OAAOtJ,KAAKmK,gBAAgBI,EAAYjB,GACrCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK4K,kCAAoC,SAASL,GAIhD,GAAIA,QACF,MAAM,IAAIhF,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAesH,GAqBjB,OAAOvK,KAAKmJ,UAAUjD,QACpB,oCAAqC,MACrCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK6K,sBAAwB,SAASN,GACpC,OAAOvK,KAAK4K,kCAAkCL,GAC3Cf,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK8K,6BAA+B,SAASP,EAAYG,GAIvD,GAAIH,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAImF,QACF,MAAM,IAAInF,MAAM,kEAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,kBAAqBG,GAqBvB,OAAO1K,KAAKmJ,UAAUjD,QACpB,wDAAyD,MACzDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAK+K,iBAAmB,SAASR,EAAYG,GAC3C,OAAO1K,KAAK8K,6BAA6BP,EAAYG,GAClDlB,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKgL,4CAA8C,SAAST,EAAYG,GAItE,GAAIH,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAImF,QACF,MAAM,IAAInF,MAAM,kEAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,kBAAqBG,GAqBvB,OAAO1K,KAAKmJ,UAAUjD,QACpB,8DAA+D,MAC/DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKiL,gCAAkC,SAASV,EAAYG,GAC1D,OAAO1K,KAAKgL,4CAA4CT,EAAYG,GACjElB,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKkL,uCAAyC,SAASX,EAAYG,EAAiBS,GAIlF,GAAIZ,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAImF,QACF,MAAM,IAAInF,MAAM,kEAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,kBAAqBG,EACrB,gBAAmBS,GAqBrB,OAAOnL,KAAKmJ,UAAUjD,QACpB,gFAAiF,MACjFjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAKoL,2BAA6B,SAASb,EAAYG,EAAiBS,GACtE,OAAOnL,KAAKkL,uCAAuCX,EAAYG,EAAiBS,GAC7E3B,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKqL,gDAAkD,SAASd,GAI9D,GAAIA,QACF,MAAM,IAAIhF,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAesH,GAqBjB,OAAOvK,KAAKmJ,UAAUjD,QACpB,iDAAkD,MAClDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKsL,oCAAsC,SAASf,GAClD,OAAOvK,KAAKqL,gDAAgDd,GACzDf,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKuL,8CAAgD,SAAShB,EAAYY,GAIxE,GAAIZ,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,gBAAmBY,GAqBrB,OAAOnL,KAAKmJ,UAAUjD,QACpB,mEAAoE,MACpEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKwL,kCAAoC,SAASjB,EAAYY,GAC5D,OAAOnL,KAAKuL,8CAA8ChB,EAAYY,GACnE3B,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKyL,gCAAkC,SAASlB,EAAYG,EAAiB7E,GAC3E,IAAIgE,EAAWhE,EAGf,GAAI0E,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAImF,QACF,MAAM,IAAInF,MAAM,kEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,kBAAqBG,GAqBvB,OAAO1K,KAAKmJ,UAAUjD,QACpB,wDAAyD,QACzDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK0L,oBAAsB,SAASnB,EAAYG,EAAiB7E,GAC/D,OAAO7F,KAAKyL,gCAAgClB,EAAYG,EAAiB7E,GACtE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2L,mBAAqB,SAAS9F,GACjC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,eAAgB,OAtBD,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK4L,OAAS,SAAS/F,GACrB,OAAO7F,KAAK2L,mBAAmB9F,GAC5B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK6L,2BAA6B,SAAStB,GAIzC,GAAIA,QACF,MAAM,IAAIhF,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAesH,GAqBjB,OAAOvK,KAAKmJ,UAAUjD,QACpB,sDAAuD,OACvDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK8L,eAAiB,SAASvB,GAC7B,OAAOvK,KAAK6L,2BAA2BtB,GACpCf,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK+L,2BAA6B,SAASxB,GAIzC,GAAIA,QACF,MAAM,IAAIhF,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAesH,GAqBjB,OAAOvK,KAAKmJ,UAAUjD,QACpB,sDAAuD,OACvDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKgM,eAAiB,SAASzB,GAC7B,OAAOvK,KAAK+L,2BAA2BxB,GACpCf,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKiM,+BAAiC,SAAS1B,EAAYG,GAIzD,GAAIH,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAImF,QACF,MAAM,IAAInF,MAAM,kEAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,kBAAqBG,GAqBvB,OAAO1K,KAAKmJ,UAAUjD,QACpB,sEAAuE,OACvEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKkM,mBAAqB,SAAS3B,EAAYG,GAC7C,OAAO1K,KAAKiM,+BAA+B1B,EAAYG,GACpDlB,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKmM,+BAAiC,SAAS5B,EAAYG,GAIzD,GAAIH,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAImF,QACF,MAAM,IAAInF,MAAM,kEAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,kBAAqBG,GAqBvB,OAAO1K,KAAKmJ,UAAUjD,QACpB,sEAAuE,OACvEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKoM,mBAAqB,SAAS7B,EAAYG,GAC7C,OAAO1K,KAAKmM,+BAA+B5B,EAAYG,GACpDlB,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKqM,uCAAyC,SAAS9B,EAAYG,EAAiB7E,GAClF,IAAIgE,EAAWhE,EAGf,GAAI0E,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAImF,QACF,MAAM,IAAInF,MAAM,kEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAesH,EACf,kBAAqBG,GAqBvB,OAAO1K,KAAKmJ,UAAUjD,QACpB,8DAA+D,OAC/DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKsM,2BAA6B,SAAS/B,EAAYG,EAAiB7E,GACtE,OAAO7F,KAAKqM,uCAAuC9B,EAAYG,EAAiB7E,GAC7E2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKuM,0CAA4C,SAAShC,EAAY1E,GACpE,IAAIgE,EAAWhE,EAGf,GAAI0E,QACF,MAAM,IAAIhF,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAesH,GAqBjB,OAAOvK,KAAKmJ,UAAUjD,QACpB,iDAAkD,OAClDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKwM,8BAAgC,SAASjC,EAAY1E,GACxD,OAAO7F,KAAKuM,0CAA0ChC,EAAY1E,GAC/D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCjnCA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKyM,mBAAqB,SAASC,GAIjC,GAAIA,QACF,MAAM,IAAInH,MAAM,iEAGlB,IAAItC,EAAa,CACf,iBAAoByJ,GAqBtB,OAAO1M,KAAKmJ,UAAUjD,QACpB,qCAAsC,SACtCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK2M,OAAS,SAASD,GACrB,OAAO1M,KAAKyM,mBAAmBC,GAC5BlD,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmK,gBAAkB,SAASuC,EAAgBpD,GAC9CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIoD,QACF,MAAM,IAAInH,MAAM,iEAGlB,IAAItC,EAAa,CACf,iBAAoByJ,GAQlBtG,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,qCAAsC,MACtCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqK,IAAM,SAASqC,EAAgBpD,GAClC,OAAOtJ,KAAKmK,gBAAgBuC,EAAgBpD,GACzCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,kBAAmB,MA1BJ,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK4M,mBAAqB,SAASF,EAAgB7G,GACjD,IAAIgE,EAAWhE,EAGf,GAAI6G,QACF,MAAM,IAAInH,MAAM,iEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,iBAAoByJ,GAqBtB,OAAO1M,KAAKmJ,UAAUjD,QACpB,qCAAsC,QACtCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK6M,OAAS,SAASH,EAAgB7G,GACrC,OAAO7F,KAAK4M,mBAAmBF,EAAgB7G,GAC5C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2L,mBAAqB,SAAS9F,GACjC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,kBAAmB,OAtBJ,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK4L,OAAS,SAAS/F,GACrB,OAAO7F,KAAK2L,mBAAmB9F,GAC5B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCzTA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAK8M,0BAA4B,SAASC,GAIxC,GAAIA,QACF,MAAM,IAAIxH,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAY8J,GAqBd,OAAO/M,KAAKmJ,UAAUjD,QACpB,sBAAuB,SACvBjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKgN,cAAgB,SAASD,GAC5B,OAAO/M,KAAK8M,0BAA0BC,GACnCvD,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,WAAY,MA1BG,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKiN,mBAAqB,SAASF,EAASzD,GAC1CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIyD,QACF,MAAM,IAAIxH,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAY8J,GAQV3G,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,sBAAuB,MACvBjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK2F,OAAS,SAASoH,EAASzD,GAC9B,OAAOtJ,KAAKiN,mBAAmBF,EAASzD,GACrCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKkN,kBAAoB,SAASrH,GAChC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,WAAY,OAtBG,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAKmN,MAAQ,SAAStH,GACpB,OAAO7F,KAAKkN,kBAAkBrH,GAC3B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBC3PA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKyM,mBAAqB,SAASW,GAIjC,GAAIA,QACF,MAAM,IAAI7H,MAAM,2DAGlB,IAAItC,EAAa,CACf,UAAamK,GAqBf,OAAOpN,KAAKmJ,UAAUjD,QACpB,gCAAiC,SACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK2M,OAAS,SAASS,GACrB,OAAOpN,KAAKyM,mBAAmBW,GAC5B5D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,oBAAqB,MA1BN,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmK,gBAAkB,SAASiD,EAAU9D,GACxCA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8D,QACF,MAAM,IAAI7H,MAAM,2DAGlB,IAAItC,EAAa,CACf,UAAamK,GAQXhH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,gCAAiC,MACjCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqK,IAAM,SAAS+C,EAAU9D,GAC5B,OAAOtJ,KAAKmK,gBAAgBiD,EAAU9D,GACnCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK4M,mBAAqB,SAASQ,EAAUvH,GAC3C,IAAIgE,EAAWhE,EAGf,GAAIuH,QACF,MAAM,IAAI7H,MAAM,2DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,UAAamK,GAqBf,OAAOpN,KAAKmJ,UAAUjD,QACpB,gCAAiC,QACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK6M,OAAS,SAASO,EAAUvH,GAC/B,OAAO7F,KAAK4M,mBAAmBQ,EAAUvH,GACtC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2L,mBAAqB,SAAS9F,GACjC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,oBAAqB,OAtBN,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK4L,OAAS,SAAS/F,GACrB,OAAO7F,KAAK2L,mBAAmB9F,GAC5B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCzTA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKyM,mBAAqB,SAASY,GAIjC,GAAIA,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,2BAA4B,SAC5BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK2M,OAAS,SAASU,GACrB,OAAOrN,KAAKyM,mBAAmBY,GAC5B7D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKsN,kCAAoC,SAASD,EAAYE,GAI5D,GAAIF,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIgI,QACF,MAAM,IAAIhI,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,YAAeE,GAqBjB,OAAOvN,KAAKmJ,UAAUjD,QACpB,kDAAmD,SACnDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKwN,sBAAwB,SAASH,EAAYE,GAChD,OAAOvN,KAAKsN,kCAAkCD,EAAYE,GACvD/D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAuBA5F,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,MAAUA,EAAW,KAAIA,EAAW,MACpC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,iBAAsBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAuB,iBAC/F,gBAAqBA,EAAoB,cAAIA,EAAoB,cAAIA,EAAsB,gBAC3F,mBAAwBA,EAAuB,iBAAIA,EAAuB,iBAAIA,EAAyB,mBACvG,kBAAuBA,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAwB,kBACnG,QAAaA,EAAa,OAAIA,EAAa,OAAIA,EAAc,QAC7D,UAAeA,EAAe,SAAIA,EAAe,SAAIA,EAAgB,UACrE,UAAeA,EAAe,SAAIA,EAAe,SAAIA,EAAgB,UACrE,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,UAanE,OAAOtJ,KAAKmJ,UAAUjD,QACpB,aAAc,MArCC,CACjB,EAqCcE,EAbK,CACnB,EAEiB,CACjB,EA/Be,KAiCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAsBApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmK,gBAAkB,SAASkD,EAAY/D,GAC1CA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2BAA4B,MAC5BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqK,IAAM,SAASgD,EAAY/D,GAC9B,OAAOtJ,KAAKmK,gBAAgBkD,EAAY/D,GACrCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKyN,uBAAyB,SAASJ,EAAY/D,GACjDA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mCAAoC,MACpCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK0N,WAAa,SAASL,EAAY/D,GACrC,OAAOtJ,KAAKyN,uBAAuBJ,EAAY/D,GAC5CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK2N,wBAA0B,SAASN,EAAY/D,GAClDA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,oCAAqC,MACrCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK4N,YAAc,SAASP,EAAY/D,GACtC,OAAOtJ,KAAK2N,wBAAwBN,EAAY/D,GAC7CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK6N,+BAAiC,SAASR,EAAYE,EAAYjE,GACrEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIgI,QACF,MAAM,IAAIhI,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,YAAeE,GAQbnH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,kDAAmD,MACnDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK8N,mBAAqB,SAAST,EAAYE,EAAYjE,GACzD,OAAOtJ,KAAK6N,+BAA+BR,EAAYE,EAAYjE,GAChEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK+N,6BAA+B,SAASV,EAAY/D,GACvDA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,0CAA2C,MAC3CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKgO,iBAAmB,SAASX,EAAY/D,GAC3C,OAAOtJ,KAAK+N,6BAA6BV,EAAY/D,GAClDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK4M,mBAAqB,SAASS,EAAYxH,GAC7C,IAAIgE,EAAWhE,EAGf,GAAIwH,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,2BAA4B,QAC5BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK6M,OAAS,SAASQ,EAAYxH,GACjC,OAAO7F,KAAK4M,mBAAmBS,EAAYxH,GACxC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKiO,kCAAoC,SAASZ,EAAYE,EAAY1H,GACxE,IAAIgE,EAAWhE,EAGf,GAAIwH,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIgI,QACF,MAAM,IAAIhI,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,YAAeE,GAqBjB,OAAOvN,KAAKmJ,UAAUjD,QACpB,kDAAmD,QACnDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKkO,sBAAwB,SAASb,EAAYE,EAAY1H,GAC5D,OAAO7F,KAAKiO,kCAAkCZ,EAAYE,EAAY1H,GACnE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2L,mBAAqB,SAAS9F,GACjC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,aAAc,OAtBC,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK4L,OAAS,SAAS/F,GACrB,OAAO7F,KAAK2L,mBAAmB9F,GAC5B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKmO,uBAAyB,SAASd,GAIrC,GAAIA,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,+CAAgD,OAChDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKoO,WAAa,SAASf,GACzB,OAAOrN,KAAKmO,uBAAuBd,GAChC7D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKqO,yBAA2B,SAAShB,GAIvC,GAAIA,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,iDAAkD,OAClDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKsO,aAAe,SAASjB,GAC3B,OAAOrN,KAAKqO,yBAAyBhB,GAClC7D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKuO,kBAAoB,SAASlB,GAIhC,GAAIA,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,yCAA0C,OAC1CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKwO,MAAQ,SAASnB,GACpB,OAAOrN,KAAKuO,kBAAkBlB,GAC3B7D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKyO,sBAAwB,SAASpB,GAIpC,GAAIA,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,6CAA8C,OAC9CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK0O,UAAY,SAASrB,GACxB,OAAOrN,KAAKyO,sBAAsBpB,GAC/B7D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2O,mBAAqB,SAAStB,GAIjC,GAAIA,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,0CAA2C,OAC3CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK4O,OAAS,SAASvB,GACrB,OAAOrN,KAAK2O,mBAAmBtB,GAC5B7D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK6O,qBAAuB,SAASxB,EAAYxH,GAC/C,IAAIgE,EAAWhE,EAGf,GAAIwH,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,4CAA6C,OAC7CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK8O,SAAW,SAASzB,EAAYxH,GACnC,OAAO7F,KAAK6O,qBAAqBxB,EAAYxH,GAC1C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK+O,iBAAmB,SAAS1B,GAI/B,GAAIA,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,wCAAyC,OACzCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKoH,KAAO,SAASiG,GACnB,OAAOrN,KAAK+O,iBAAiB1B,GAC1B7D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKgP,0BAA4B,SAAS3B,EAAYxH,GACpD,IAAIgE,EAAWhE,EAGf,GAAIwH,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,wCAAyC,OACzCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKiP,cAAgB,SAAS5B,EAAYxH,GACxC,OAAO7F,KAAKgP,0BAA0B3B,EAAYxH,GAC/C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKkP,uBAAyB,SAAS7B,GAIrC,GAAIA,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,8CAA+C,OAC/CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKmP,WAAa,SAAS9B,GACzB,OAAOrN,KAAKkP,uBAAuB7B,GAChC7D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKoP,wBAA0B,SAAS/B,EAAYxH,GAClD,IAAIgE,EAAWhE,EAGf,GAAIwH,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,oCAAqC,OACrCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKqP,YAAc,SAAShC,EAAYxH,GACtC,OAAO7F,KAAKoP,wBAAwB/B,EAAYxH,GAC7C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKsP,uBAAyB,SAASjC,EAAYxH,GACjD,IAAIgE,EAAWhE,EAGf,GAAIwH,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAeoK,GAqBjB,OAAOrN,KAAKmJ,UAAUjD,QACpB,mCAAoC,MACpCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKuP,WAAa,SAASlC,EAAYxH,GACrC,OAAO7F,KAAKsP,uBAAuBjC,EAAYxH,GAC5C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCh2CA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKyM,mBAAqB,SAAS+C,GAIjC,GAAIA,QACF,MAAM,IAAIjK,MAAM,kEAGlB,IAAItC,EAAa,CACf,kBAAqBuM,GAqBvB,OAAOxP,KAAKmJ,UAAUjD,QACpB,uCAAwC,SACxCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK2M,OAAS,SAAS6C,GACrB,OAAOxP,KAAKyM,mBAAmB+C,GAC5BhG,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mBAAoB,MA1BL,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmK,gBAAkB,SAASqF,EAAiBlG,GAC/CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIkG,QACF,MAAM,IAAIjK,MAAM,kEAGlB,IAAItC,EAAa,CACf,kBAAqBuM,GAQnBpJ,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uCAAwC,MACxCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqK,IAAM,SAASmF,EAAiBlG,GACnC,OAAOtJ,KAAKmK,gBAAgBqF,EAAiBlG,GAC1CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2L,mBAAqB,SAAS9F,GACjC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,mBAAoB,OAtBL,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK4L,OAAS,SAAS/F,GACrB,OAAO7F,KAAK2L,mBAAmB9F,GAC5B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKyP,qCAAuC,SAASD,GAInD,GAAIA,QACF,MAAM,IAAIjK,MAAM,kEAGlB,IAAItC,EAAa,CACf,kBAAqBuM,GAqBvB,OAAOxP,KAAKmJ,UAAUjD,QACpB,0EAA2E,OAC3EjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK0P,yBAA2B,SAASF,GACvC,OAAOxP,KAAKyP,qCAAqCD,GAC9ChG,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBClTA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAexChJ,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,oBAAyBA,EAAwB,kBAAIA,EAAwB,kBAAIA,EAA0B,oBAC3G,QAAaA,EAAa,OAAIA,EAAa,OAAIA,EAAc,QAC7D,YAAiBA,EAAiB,WAAIA,EAAiB,WAAIA,EAAkB,aAa/E,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iBAAkB,MA7BH,CACjB,EA6BcE,EAbK,CACnB,EAEiB,CACjB,EAvBe,KAyBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAcApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmK,gBAAkB,SAASwF,EAAgBrG,GAC9CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqG,QACF,MAAM,IAAIpK,MAAM,iEAGlB,IAAItC,EAAa,CACf,gBAAmB0M,GAQjBvJ,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mCAAoC,MACpCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqK,IAAM,SAASsF,EAAgBrG,GAClC,OAAOtJ,KAAKmK,gBAAgBwF,EAAgBrG,GACzCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK4P,oCAAsC,SAASD,EAAgBrG,GAClEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqG,QACF,MAAM,IAAIpK,MAAM,iEAGlB,IAAItC,EAAa,CACf,gBAAmB0M,GAQjBvJ,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,QAAaA,EAAa,OAAIA,EAAa,OAAIA,EAAc,QAC7D,iBAAsBA,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAuB,iBACjG,gBAAqBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAsB,iBAa/F,OAAOtJ,KAAKmJ,UAAUjD,QACpB,4CAA6C,MAC7CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA3Be,KA6BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK6P,wBAA0B,SAASF,EAAgBrG,GACtD,OAAOtJ,KAAK4P,oCAAoCD,EAAgBrG,GAC7DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK8P,mCAAqC,SAASH,EAAgBI,EAAWzG,GAC5EA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqG,QACF,MAAM,IAAIpK,MAAM,iEAIlB,GAAIwK,QACF,MAAM,IAAIxK,MAAM,4DAGlB,IAAItC,EAAa,CACf,gBAAmB0M,EACnB,WAAcI,GAQZ3J,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,yDAA0D,MAC1DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKgQ,uBAAyB,SAASL,EAAgBI,EAAWzG,GAChE,OAAOtJ,KAAK8P,mCAAmCH,EAAgBI,EAAWzG,GACvEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCxSA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAUxChJ,KAAKiQ,oBAAsB,SAASC,EAAWC,EAAQtK,GACrD,IAAIgE,EAAWhE,EAGf,GAAIqK,QACF,MAAM,IAAI3K,MAAM,4DAIlB,GAAI4K,QACF,MAAM,IAAI5K,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,WAAciN,EACd,QAAWC,GAqBb,OAAOnQ,KAAKmJ,UAAUjD,QACpB,2EAA4E,OAC5EjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKoQ,QAAU,SAASF,EAAWC,EAAQtK,GACzC,OAAO7F,KAAKiQ,oBAAoBC,EAAWC,EAAQtK,GAChD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCtFA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKqQ,wBAA0B,SAASC,GAItC,GAAIA,QACF,MAAM,IAAI/K,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,GAqBd,OAAOtQ,KAAKmJ,UAAUjD,QACpB,+BAAgC,SAChCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKuQ,YAAc,SAASD,GAC1B,OAAOtQ,KAAKqQ,wBAAwBC,GACjC9G,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKwQ,4BAA8B,SAASF,EAASG,GAInD,GAAIH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIkL,QACF,MAAM,IAAIlL,MAAM,yDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,QAAWG,GAqBb,OAAOzQ,KAAKmJ,UAAUjD,QACpB,+CAAgD,SAChDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAK0Q,gBAAkB,SAASJ,EAASG,GACvC,OAAOzQ,KAAKwQ,4BAA4BF,EAASG,GAC9CjH,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK2Q,+BAAiC,SAASL,EAASG,EAAQG,GAI9D,GAAIN,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIkL,QACF,MAAM,IAAIlL,MAAM,yDAIlB,GAAIqL,QACF,MAAM,IAAIrL,MAAM,yDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,QAAWG,EACX,QAAWG,GAqBb,OAAO5Q,KAAKmJ,UAAUjD,QACpB,+DAAgE,SAChEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAK6Q,mBAAqB,SAASP,EAASG,EAAQG,GAClD,OAAO5Q,KAAK2Q,+BAA+BL,EAASG,EAAQG,GACzDpH,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK8Q,gCAAkC,SAASR,EAASS,GAIvD,GAAIT,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIwL,QACF,MAAM,IAAIxL,MAAM,6DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,YAAeS,GAqBjB,OAAO/Q,KAAKmJ,UAAUjD,QACpB,uDAAwD,SACxDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKgR,oBAAsB,SAASV,EAASS,GAC3C,OAAO/Q,KAAK8Q,gCAAgCR,EAASS,GAClDvH,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKiR,wBAA0B,SAASX,EAASY,GAI/C,GAAIZ,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAI2L,QACF,MAAM,IAAI3L,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,SAAYY,GAqBd,OAAOlR,KAAKmJ,UAAUjD,QACpB,iDAAkD,SAClDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKmR,YAAc,SAASb,EAASY,GACnC,OAAOlR,KAAKiR,wBAAwBX,EAASY,GAC1C1H,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKoR,gCAAkC,SAASd,EAASY,EAASN,GAIhE,GAAIN,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAI2L,QACF,MAAM,IAAI3L,MAAM,0DAIlB,GAAIqL,QACF,MAAM,IAAIrL,MAAM,yDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,SAAYY,EACZ,QAAWN,GAqBb,OAAO5Q,KAAKmJ,UAAUjD,QACpB,iEAAkE,SAClEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAKqR,oBAAsB,SAASf,EAASY,EAASN,GACpD,OAAO5Q,KAAKoR,gCAAgCd,EAASY,EAASN,GAC3DpH,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKsR,+BAAiC,SAAShB,EAASiB,GAItD,GAAIjB,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,GAqBhB,OAAOvR,KAAKmJ,UAAUjD,QACpB,qDAAsD,SACtDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKwR,mBAAqB,SAASlB,EAASiB,GAC1C,OAAOvR,KAAKsR,+BAA+BhB,EAASiB,GACjD/H,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKyR,+BAAiC,SAASnB,EAASiB,EAAWG,GAIjE,GAAIpB,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAImM,QACF,MAAM,IAAInM,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,EACd,SAAYG,GAqBd,OAAO1R,KAAKmJ,UAAUjD,QACpB,uEAAwE,SACxEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAK2R,mBAAqB,SAASrB,EAASiB,EAAWG,GACrD,OAAO1R,KAAKyR,+BAA+BnB,EAASiB,EAAWG,GAC5DlI,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK4R,iCAAmC,SAAStB,EAASiB,EAAWM,GAInE,GAAIvB,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAIsM,QACF,MAAM,IAAItM,MAAM,4DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,EACd,WAAcM,GAqBhB,OAAO7R,KAAKmJ,UAAUjD,QACpB,2EAA4E,SAC5EjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAK8R,qBAAuB,SAASxB,EAASiB,EAAWM,GACvD,OAAO7R,KAAK4R,iCAAiCtB,EAASiB,EAAWM,GAC9DrI,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK+R,4BAA8B,SAASzB,EAAS0B,EAAaC,GAIhE,GAAI3B,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIyM,QACF,MAAM,IAAIzM,MAAM,8DAIlB,GAAI0M,QACF,MAAM,IAAI1M,MAAM,8DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,cAAiB0B,EACjB,cAAiBC,GAqBnB,OAAOjS,KAAKmJ,UAAUjD,QACpB,uFAAwF,SACxFjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAKkS,gBAAkB,SAAS5B,EAAS0B,EAAaC,GACpD,OAAOjS,KAAK+R,4BAA4BzB,EAAS0B,EAAaC,GAC3DzI,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKmS,4BAA8B,SAAS7B,EAAS0B,GAInD,GAAI1B,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIyM,QACF,MAAM,IAAIzM,MAAM,8DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,cAAiB0B,GAqBnB,OAAOhS,KAAKmJ,UAAUjD,QACpB,2DAA4D,SAC5DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKoS,gBAAkB,SAAS9B,EAAS0B,GACvC,OAAOhS,KAAKmS,4BAA4B7B,EAAS0B,GAC9CxI,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAgBA5F,KAAKqS,mBAAqB,SAAS/I,GACjCA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,YAAiBA,EAAiB,WAAIA,EAAiB,WAAIA,EAAkB,YAC7E,YAAiBA,EAAiB,WAAIA,EAAiB,WAAIA,EAAkB,YAC7E,YAAiBA,EAAiB,WAAIA,EAAiB,WAAIA,EAAkB,YAC7E,aAAkBA,EAAkB,YAAIA,EAAkB,YAAIA,EAAmB,cAanF,OAAOtJ,KAAKmJ,UAAUjD,QACpB,oBAAqB,MA9BN,CACjB,EA8BcE,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAeApG,KAAKsS,OAAS,SAAShJ,GACrB,OAAOtJ,KAAKqS,mBAAmB/I,GAC5BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKuS,mBAAqB,SAASjJ,GACjCA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,oBAAqB,MA1BN,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKwS,OAAS,SAASlJ,GACrB,OAAOtJ,KAAKuS,mBAAmBjJ,GAC5BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKyS,qBAAuB,SAASnC,EAAShH,GAC5CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,GAQVlK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,+BAAgC,MAChCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK0S,SAAW,SAASpC,EAAShH,GAChC,OAAOtJ,KAAKyS,qBAAqBnC,EAAShH,GACvCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK2S,0BAA4B,SAASrC,EAAShH,GACjDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,GAQVlK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,qCAAsC,MACtCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK4S,cAAgB,SAAStC,EAAShH,GACrC,OAAOtJ,KAAK2S,0BAA0BrC,EAAShH,GAC5CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK6S,yBAA2B,SAASvC,EAASG,EAAQnH,GACxDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIkL,QACF,MAAM,IAAIlL,MAAM,yDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,QAAWG,GAQTrK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,+CAAgD,MAChDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK8S,aAAe,SAASxC,EAASG,EAAQnH,GAC5C,OAAOtJ,KAAK6S,yBAAyBvC,EAASG,EAAQnH,GACnDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK+S,gCAAkC,SAASzC,EAASG,EAAQnH,GAC/DA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIkL,QACF,MAAM,IAAIlL,MAAM,yDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,QAAWG,GAQTrK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,qDAAsD,MACtDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKgT,oBAAsB,SAAS1C,EAASG,EAAQnH,GACnD,OAAOtJ,KAAK+S,gCAAgCzC,EAASG,EAAQnH,GAC1DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAKiT,4BAA8B,SAAS3C,EAASG,EAAQG,EAAQtH,GACnEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIkL,QACF,MAAM,IAAIlL,MAAM,yDAIlB,GAAIqL,QACF,MAAM,IAAIrL,MAAM,yDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,QAAWG,EACX,QAAWG,GAQTxK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,+DAAgE,MAChEjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EApCe,KAsCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKkT,gBAAkB,SAAS5C,EAASG,EAAQG,EAAQtH,GACvD,OAAOtJ,KAAKiT,4BAA4B3C,EAASG,EAAQG,EAAQtH,GAC9DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKmT,iCAAmC,SAAS7C,EAAShH,GACxDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,GAQVlK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,cAAmBA,EAAmB,aAAIA,EAAmB,aAAIA,EAAoB,eAavF,OAAOtJ,KAAKmJ,UAAUjD,QACpB,yCAA0C,MAC1CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA3Be,KA6BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKoT,qBAAuB,SAAS9C,EAAShH,GAC5C,OAAOtJ,KAAKmT,iCAAiC7C,EAAShH,GACnDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKqT,6BAA+B,SAAS/C,EAASS,EAAYzH,GAChEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIwL,QACF,MAAM,IAAIxL,MAAM,6DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,YAAeS,GAQb3K,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uDAAwD,MACxDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKsT,iBAAmB,SAAShD,EAASS,EAAYzH,GACpD,OAAOtJ,KAAKqT,6BAA6B/C,EAASS,EAAYzH,GAC3DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAiBA5F,KAAKuT,2BAA6B,SAASjD,EAAShH,GAClDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,GAQVlK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,YAAiBA,EAAiB,WAAIA,EAAiB,WAAIA,EAAkB,YAC7E,aAAkBA,EAAkB,YAAIA,EAAkB,YAAIA,EAAmB,aACjF,YAAiBA,EAAiB,WAAIA,EAAiB,WAAIA,EAAkB,YAC7E,YAAiBA,EAAiB,WAAIA,EAAiB,WAAIA,EAAkB,aAa/E,OAAOtJ,KAAKmJ,UAAUjD,QACpB,sCAAuC,MACvCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAgBApG,KAAKwT,eAAiB,SAASlD,EAAShH,GACtC,OAAOtJ,KAAKuT,2BAA2BjD,EAAShH,GAC7CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKyT,qBAAuB,SAASnD,EAASY,EAAS5H,GACrDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAI2L,QACF,MAAM,IAAI3L,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,SAAYY,GAQV9K,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iDAAkD,MAClDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK0T,SAAW,SAASpD,EAASY,EAAS5H,GACzC,OAAOtJ,KAAKyT,qBAAqBnD,EAASY,EAAS5H,GAChDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK2T,iCAAmC,SAASrD,EAASY,EAAS5H,GACjEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAI2L,QACF,MAAM,IAAI3L,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,SAAYY,GAQV9K,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uDAAwD,MACxDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK4T,qBAAuB,SAAStD,EAASY,EAAS5H,GACrD,OAAOtJ,KAAK2T,iCAAiCrD,EAASY,EAAS5H,GAC5DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK6T,6BAA+B,SAASvD,EAASY,EAASN,EAAQtH,GACrEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAI2L,QACF,MAAM,IAAI3L,MAAM,0DAIlB,GAAIqL,QACF,MAAM,IAAIrL,MAAM,yDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,SAAYY,EACZ,QAAWN,GAQTxK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iEAAkE,MAClEjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EApCe,KAsCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK8T,iBAAmB,SAASxD,EAASY,EAASN,EAAQtH,GACzD,OAAOtJ,KAAK6T,6BAA6BvD,EAASY,EAASN,EAAQtH,GAChEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK+T,gCAAkC,SAASzD,EAAShH,GACvDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,GAQVlK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,wCAAyC,MACzCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKgU,oBAAsB,SAAS1D,EAAShH,GAC3C,OAAOtJ,KAAK+T,gCAAgCzD,EAAShH,GAClDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKiU,4BAA8B,SAAS3D,EAASiB,EAAWjI,GAC9DA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,GAQZnL,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,qDAAsD,MACtDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkU,gBAAkB,SAAS5D,EAASiB,EAAWjI,GAClD,OAAOtJ,KAAKiU,4BAA4B3D,EAASiB,EAAWjI,GACzDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKmU,6BAA+B,SAAS7D,EAASiB,EAAWjI,GAC/DA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,GAQZnL,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,4DAA6D,MAC7DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKoU,iBAAmB,SAAS9D,EAASiB,EAAWjI,GACnD,OAAOtJ,KAAKmU,6BAA6B7D,EAASiB,EAAWjI,GAC1DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAKqU,4BAA8B,SAAS/D,EAASiB,EAAWG,EAASpI,GACvEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAImM,QACF,MAAM,IAAInM,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,EACd,SAAYG,GAQVtL,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uEAAwE,MACxEjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EApCe,KAsCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKsU,gBAAkB,SAAShE,EAASiB,EAAWG,EAASpI,GAC3D,OAAOtJ,KAAKqU,4BAA4B/D,EAASiB,EAAWG,EAASpI,GAClEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKuU,+BAAiC,SAASjE,EAASiB,EAAWjI,GACjEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,GAQZnL,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,8DAA+D,MAC/DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKwU,mBAAqB,SAASlE,EAASiB,EAAWjI,GACrD,OAAOtJ,KAAKuU,+BAA+BjE,EAASiB,EAAWjI,GAC5DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAKyU,8BAAgC,SAASnE,EAASiB,EAAWM,EAAWvI,GAC3EA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAIsM,QACF,MAAM,IAAItM,MAAM,4DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,EACd,WAAcM,GAQZzL,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2EAA4E,MAC5EjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EApCe,KAsCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK0U,kBAAoB,SAASpE,EAASiB,EAAWM,EAAWvI,GAC/D,OAAOtJ,KAAKyU,8BAA8BnE,EAASiB,EAAWM,EAAWvI,GACtEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK2U,0BAA4B,SAAS3C,EAAa1B,EAAShH,GAC9DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI0I,QACF,MAAM,IAAIzM,MAAM,8DAIlB,GAAI+K,QACF,MAAM,IAAI/K,MAAM,0DAGlB,IAAItC,EAAa,CACf,cAAiB+O,EACjB,SAAY1B,GAQVlK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uEAAwE,MACxEjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK4U,cAAgB,SAAS5C,EAAa1B,EAAShH,GAClD,OAAOtJ,KAAK2U,0BAA0B3C,EAAa1B,EAAShH,GACzDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK6U,yBAA2B,SAASvE,EAAS0B,EAAaC,EAAa3I,GAC1EA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIyM,QACF,MAAM,IAAIzM,MAAM,8DAIlB,GAAI0M,QACF,MAAM,IAAI1M,MAAM,8DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,cAAiB0B,EACjB,cAAiBC,GAQf7L,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uFAAwF,MACxFjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EApCe,KAsCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK8U,aAAe,SAASxE,EAAS0B,EAAaC,EAAa3I,GAC9D,OAAOtJ,KAAK6U,yBAAyBvE,EAAS0B,EAAaC,EAAa3I,GACrEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK+U,2BAA6B,SAASzE,EAAShH,GAClDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAGlB,IAAItC,EAAa,CACf,SAAYqN,GAQVlK,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2CAA4C,MAC5CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKgV,eAAiB,SAAS1E,EAAShH,GACtC,OAAOtJ,KAAK+U,2BAA2BzE,EAAShH,GAC7CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKiV,yBAA2B,SAAS3E,EAAS0B,EAAa1I,GAC7DA,EAAOA,GAAQ,CAAC,EAIhB,GAAIgH,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIyM,QACF,MAAM,IAAIzM,MAAM,8DAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,cAAiB0B,GAQf5L,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2DAA4D,MAC5DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkV,aAAe,SAAS5E,EAAS0B,EAAa1I,GACjD,OAAOtJ,KAAKiV,yBAAyB3E,EAAS0B,EAAa1I,GACxDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKmV,wBAA0B,SAAS7E,EAASzK,GAC/C,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,GAqBd,OAAOtQ,KAAKmJ,UAAUjD,QACpB,+BAAgC,QAChCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKoV,YAAc,SAAS9E,EAASzK,GACnC,OAAO7F,KAAKmV,wBAAwB7E,EAASzK,GAC1C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKqV,4BAA8B,SAAS/E,EAASG,EAAQ5K,GAC3D,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIkL,QACF,MAAM,IAAIlL,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,QAAWG,GAqBb,OAAOzQ,KAAKmJ,UAAUjD,QACpB,+CAAgD,QAChDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKsV,gBAAkB,SAAShF,EAASG,EAAQ5K,GAC/C,OAAO7F,KAAKqV,4BAA4B/E,EAASG,EAAQ5K,GACtD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKuV,+BAAiC,SAASjF,EAASG,EAAQG,EAAQ/K,GACtE,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIkL,QACF,MAAM,IAAIlL,MAAM,yDAIlB,GAAIqL,QACF,MAAM,IAAIrL,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,QAAWG,EACX,QAAWG,GAqBb,OAAO5Q,KAAKmJ,UAAUjD,QACpB,+DAAgE,QAChEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAKwV,mBAAqB,SAASlF,EAASG,EAAQG,EAAQ/K,GAC1D,OAAO7F,KAAKuV,+BAA+BjF,EAASG,EAAQG,EAAQ/K,GACjE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKyV,gCAAkC,SAASnF,EAASS,EAAYlL,GACnE,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIwL,QACF,MAAM,IAAIxL,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,YAAeS,GAqBjB,OAAO/Q,KAAKmJ,UAAUjD,QACpB,uDAAwD,QACxDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK0V,oBAAsB,SAASpF,EAASS,EAAYlL,GACvD,OAAO7F,KAAKyV,gCAAgCnF,EAASS,EAAYlL,GAC9D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK2V,wBAA0B,SAASrF,EAASY,EAASrL,GACxD,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAI2L,QACF,MAAM,IAAI3L,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,SAAYY,GAqBd,OAAOlR,KAAKmJ,UAAUjD,QACpB,iDAAkD,QAClDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK4V,YAAc,SAAStF,EAASY,EAASrL,GAC5C,OAAO7F,KAAK2V,wBAAwBrF,EAASY,EAASrL,GACnD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK6V,gCAAkC,SAASvF,EAASY,EAASN,EAAQ/K,GACxE,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAI2L,QACF,MAAM,IAAI3L,MAAM,0DAIlB,GAAIqL,QACF,MAAM,IAAIrL,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,SAAYY,EACZ,QAAWN,GAqBb,OAAO5Q,KAAKmJ,UAAUjD,QACpB,iEAAkE,QAClEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAK8V,oBAAsB,SAASxF,EAASY,EAASN,EAAQ/K,GAC5D,OAAO7F,KAAK6V,gCAAgCvF,EAASY,EAASN,EAAQ/K,GACnE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK+V,+BAAiC,SAASzF,EAASiB,EAAW1L,GACjE,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,GAqBhB,OAAOvR,KAAKmJ,UAAUjD,QACpB,qDAAsD,QACtDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKgW,mBAAqB,SAAS1F,EAASiB,EAAW1L,GACrD,OAAO7F,KAAK+V,+BAA+BzF,EAASiB,EAAW1L,GAC5D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKiW,+BAAiC,SAAS3F,EAASiB,EAAWG,EAAS7L,GAC1E,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAImM,QACF,MAAM,IAAInM,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,EACd,SAAYG,GAqBd,OAAO1R,KAAKmJ,UAAUjD,QACpB,uEAAwE,QACxEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAKkW,mBAAqB,SAAS5F,EAASiB,EAAWG,EAAS7L,GAC9D,OAAO7F,KAAKiW,+BAA+B3F,EAASiB,EAAWG,EAAS7L,GACrE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmW,iCAAmC,SAAS7F,EAASiB,EAAWM,EAAWhM,GAC9E,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAIsM,QACF,MAAM,IAAItM,MAAM,4DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,EACd,WAAcM,GAqBhB,OAAO7R,KAAKmJ,UAAUjD,QACpB,2EAA4E,QAC5EjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAKoW,qBAAuB,SAAS9F,EAASiB,EAAWM,EAAWhM,GAClE,OAAO7F,KAAKmW,iCAAiC7F,EAASiB,EAAWM,EAAWhM,GACzE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKqW,4BAA8B,SAAS/F,EAAS0B,EAAaC,EAAapM,GAC7E,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIyM,QACF,MAAM,IAAIzM,MAAM,8DAIlB,GAAI0M,QACF,MAAM,IAAI1M,MAAM,8DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,cAAiB0B,EACjB,cAAiBC,GAqBnB,OAAOjS,KAAKmJ,UAAUjD,QACpB,uFAAwF,QACxFjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAKsW,gBAAkB,SAAShG,EAAS0B,EAAaC,EAAapM,GACjE,OAAO7F,KAAKqW,4BAA4B/F,EAAS0B,EAAaC,EAAapM,GACxE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKuW,4BAA8B,SAASjG,EAAS0B,EAAanM,GAChE,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIyM,QACF,MAAM,IAAIzM,MAAM,8DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,cAAiB0B,GAqBnB,OAAOhS,KAAKmJ,UAAUjD,QACpB,2DAA4D,QAC5DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKwW,gBAAkB,SAASlG,EAAS0B,EAAanM,GACpD,OAAO7F,KAAKuW,4BAA4BjG,EAAS0B,EAAanM,GAC3D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKyW,qBAAuB,SAAS5Q,GACnC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,oBAAqB,OAtBN,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK0W,SAAW,SAAS7Q,GACvB,OAAO7F,KAAKyW,qBAAqB5Q,GAC9B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK2W,yBAA2B,SAASrG,EAASzK,GAChD,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,GAqBd,OAAOtQ,KAAKmJ,UAAUjD,QACpB,qCAAsC,OACtCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK4W,aAAe,SAAStG,EAASzK,GACpC,OAAO7F,KAAK2W,yBAAyBrG,EAASzK,GAC3C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK6W,4BAA8B,SAASvG,EAASG,EAAQ5K,GAC3D,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIkL,QACF,MAAM,IAAIlL,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,QAAWG,GAqBb,OAAOzQ,KAAKmJ,UAAUjD,QACpB,qDAAsD,OACtDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK8W,gBAAkB,SAASxG,EAASG,EAAQ5K,GAC/C,OAAO7F,KAAK6W,4BAA4BvG,EAASG,EAAQ5K,GACtD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK+W,6BAA+B,SAASzG,EAASzK,GACpD,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,GAqBd,OAAOtQ,KAAKmJ,UAAUjD,QACpB,yCAA0C,OAC1CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKgX,iBAAmB,SAAS1G,EAASzK,GACxC,OAAO7F,KAAK+W,6BAA6BzG,EAASzK,GAC/C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKiX,0BAA4B,SAAS3G,EAASzK,GACjD,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,GAqBd,OAAOtQ,KAAKmJ,UAAUjD,QACpB,sCAAuC,OACvCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKkX,cAAgB,SAAS5G,EAASzK,GACrC,OAAO7F,KAAKiX,0BAA0B3G,EAASzK,GAC5C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKmX,6BAA+B,SAAS7G,EAASY,EAASrL,GAC7D,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAI2L,QACF,MAAM,IAAI3L,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,SAAYY,GAqBd,OAAOlR,KAAKmJ,UAAUjD,QACpB,uDAAwD,OACxDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKoX,iBAAmB,SAAS9G,EAASY,EAASrL,GACjD,OAAO7F,KAAKmX,6BAA6B7G,EAASY,EAASrL,GACxD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKqX,4BAA8B,SAAS/G,EAASzK,GACnD,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,GAqBd,OAAOtQ,KAAKmJ,UAAUjD,QACpB,wCAAyC,OACzCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKsX,gBAAkB,SAAShH,EAASzK,GACvC,OAAO7F,KAAKqX,4BAA4B/G,EAASzK,GAC9C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKuX,4BAA8B,SAASjH,EAASiB,EAAW1L,GAC9D,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,GAqBhB,OAAOvR,KAAKmJ,UAAUjD,QACpB,4DAA6D,OAC7DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKwX,gBAAkB,SAASlH,EAASiB,EAAW1L,GAClD,OAAO7F,KAAKuX,4BAA4BjH,EAASiB,EAAW1L,GACzD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKyX,+BAAiC,SAASnH,EAASiB,EAAW1L,GACjE,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,GAqBhB,OAAOvR,KAAKmJ,UAAUjD,QACpB,8DAA+D,OAC/DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK0X,mBAAqB,SAASpH,EAASiB,EAAW1L,GACrD,OAAO7F,KAAKyX,+BAA+BnH,EAASiB,EAAW1L,GAC5D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK2X,yBAA2B,SAASrH,EAAS0B,EAAanM,GAC7D,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIyM,QACF,MAAM,IAAIzM,MAAM,8DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,cAAiB0B,GAqBnB,OAAOhS,KAAKmJ,UAAUjD,QACpB,uEAAwE,OACxEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK4X,aAAe,SAAStH,EAAS0B,EAAanM,GACjD,OAAO7F,KAAK2X,yBAAyBrH,EAAS0B,EAAanM,GACxD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK6X,0BAA4B,SAASvH,EAASzK,GACjD,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,GAqBd,OAAOtQ,KAAKmJ,UAAUjD,QACpB,2CAA4C,OAC5CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK8X,cAAgB,SAASxH,EAASzK,GACrC,OAAO7F,KAAK6X,0BAA0BvH,EAASzK,GAC5C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK+X,6BAA+B,SAASzH,EAASS,EAAYlL,GAChE,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIwL,QACF,MAAM,IAAIxL,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,YAAeS,GAqBjB,OAAO/Q,KAAKmJ,UAAUjD,QACpB,uDAAwD,MACxDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKgY,iBAAmB,SAAS1H,EAASS,EAAYlL,GACpD,OAAO7F,KAAK+X,6BAA6BzH,EAASS,EAAYlL,GAC3D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKiY,8BAAgC,SAAS3H,EAASiB,EAAWM,EAAWhM,GAC3E,IAAIgE,EAAWhE,EAGf,GAAIyK,QACF,MAAM,IAAI/K,MAAM,0DAIlB,GAAIgM,QACF,MAAM,IAAIhM,MAAM,4DAIlB,GAAIsM,QACF,MAAM,IAAItM,MAAM,4DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,SAAYqN,EACZ,WAAciB,EACd,WAAcM,GAqBhB,OAAO7R,KAAKmJ,UAAUjD,QACpB,2EAA4E,MAC5EjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAKkY,kBAAoB,SAAS5H,EAASiB,EAAWM,EAAWhM,GAC/D,OAAO7F,KAAKiY,8BAA8B3H,EAASiB,EAAWM,EAAWhM,GACtE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCxhIA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAcxChJ,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,UAanE,OAAOtJ,KAAKmJ,UAAUjD,QACpB,gBAAiB,MA5BF,CACjB,EA4BcE,EAbK,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmY,kBAAoB,SAASC,EAAY9O,GAC5CA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,GAQbhS,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,8BAA+B,MAC/BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqY,MAAQ,SAASD,EAAY9O,GAChC,OAAOtJ,KAAKmY,kBAAkBC,EAAY9O,GACvCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCpJA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKsY,uBAAyB,SAASC,GAIrC,GAAIA,QACF,MAAM,IAAIhT,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAWsV,GAqBb,OAAOvY,KAAKmJ,UAAUjD,QACpB,gCAAiC,SACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKwY,WAAa,SAASD,GACzB,OAAOvY,KAAKsY,uBAAuBC,GAChC/O,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKyY,yBAA2B,SAASrL,GAIvC,GAAIA,QACF,MAAM,IAAI7H,MAAM,2DAGlB,IAAItC,EAAa,CACf,UAAamK,GAqBf,OAAOpN,KAAKmJ,UAAUjD,QACpB,oCAAqC,SACrCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK0Y,aAAe,SAAStL,GAC3B,OAAOpN,KAAKyY,yBAAyBrL,GAClC5D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAkBA5F,KAAK2Y,kBAAoB,SAASrP,GAChCA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,MAAUA,EAAW,KAAIA,EAAW,MACpC,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,kBAAuBA,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAwB,kBACnG,iBAAsBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAuB,iBAC/F,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,UAanE,OAAOtJ,KAAKmJ,UAAUjD,QACpB,sBAAuB,MAhCR,CACjB,EAgCcE,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAiBApG,KAAK4Y,MAAQ,SAAStP,GACpB,OAAOtJ,KAAK2Y,kBAAkBrP,GAC3BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK6Y,oBAAsB,SAASN,EAAQjP,GAC1CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIiP,QACF,MAAM,IAAIhT,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAWsV,GAQTnS,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,gCAAiC,MACjCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK8Y,QAAU,SAASP,EAAQjP,GAC9B,OAAOtJ,KAAK6Y,oBAAoBN,EAAQjP,GACrCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAeA5F,KAAK+Y,wBAA0B,SAASzP,GACtCA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,kBAAuBA,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAwB,kBACnG,iBAAsBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAuB,kBAajG,OAAOtJ,KAAKmJ,UAAUjD,QACpB,wBAAyB,MA7BV,CACjB,EA6BcE,EAbK,CACnB,EAEiB,CACjB,EAvBe,KAyBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAcApG,KAAKgZ,YAAc,SAAS1P,GAC1B,OAAOtJ,KAAK+Y,wBAAwBzP,GACjCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKiZ,sBAAwB,SAAS7L,EAAU9D,GAC9CA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8D,QACF,MAAM,IAAI7H,MAAM,2DAGlB,IAAItC,EAAa,CACf,UAAamK,GAQXhH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,oCAAqC,MACrCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKkZ,UAAY,SAAS9L,EAAU9D,GAClC,OAAOtJ,KAAKiZ,sBAAsB7L,EAAU9D,GACzCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKmZ,uBAAyB,SAASZ,EAAQ1S,GAC7C,IAAIgE,EAAWhE,EAGf,GAAI0S,QACF,MAAM,IAAIhT,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAWsV,GAqBb,OAAOvY,KAAKmJ,UAAUjD,QACpB,gCAAiC,QACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKoZ,WAAa,SAASb,EAAQ1S,GACjC,OAAO7F,KAAKmZ,uBAAuBZ,EAAQ1S,GACxC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKqZ,yBAA2B,SAASjM,EAAUvH,GACjD,IAAIgE,EAAWhE,EAGf,GAAIuH,QACF,MAAM,IAAI7H,MAAM,2DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,UAAamK,GAqBf,OAAOpN,KAAKmJ,UAAUjD,QACpB,oCAAqC,QACrCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKsZ,aAAe,SAASlM,EAAUvH,GACrC,OAAO7F,KAAKqZ,yBAAyBjM,EAAUvH,GAC5C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKuZ,mBAAqB,SAAS1T,GACjC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,sBAAuB,OAtBR,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAKwZ,OAAS,SAAS3T,GACrB,OAAO7F,KAAKuZ,mBAAmB1T,GAC5B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKyZ,yBAA2B,SAAS5T,GACvC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,wBAAyB,OAtBV,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK0Z,aAAe,SAAS7T,GAC3B,OAAO7F,KAAKyZ,yBAAyB5T,GAClC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBC7nBA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAK2Z,uBAAyB,SAASC,GAIrC,GAAIA,QACF,MAAM,IAAIrU,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW2W,GAqBb,OAAO5Z,KAAKmJ,UAAUjD,QACpB,2BAA4B,SAC5BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK6Z,WAAa,SAASD,GACzB,OAAO5Z,KAAK2Z,uBAAuBC,GAChCpQ,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK8Z,mBAAqB,SAASxQ,GAEjC,IAUIlD,EAAc,CAChB,UAZFkD,EAAOA,GAAQ,CAAC,GAYc,QAAIA,EAAc,QAAIA,EAAe,SACjE,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,OAAUtJ,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,QAazC,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iBAAkB,MA3BH,CACjB,EA2BcE,EAbK,CACnB,EAEiB,CACjB,EArBe,KAuBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK+Z,OAAS,SAASzQ,GACrB,OAAOtJ,KAAK8Z,mBAAmBxQ,GAC5BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKga,oBAAsB,SAASJ,EAAQtQ,GAC1CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIsQ,QACF,MAAM,IAAIrU,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW2W,GAQTxT,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2BAA4B,MAC5BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKia,QAAU,SAASL,EAAQtQ,GAC9B,OAAOtJ,KAAKga,oBAAoBJ,EAAQtQ,GACrCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKka,2BAA6B,SAASN,EAAQtQ,GACjDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIsQ,QACF,MAAM,IAAIrU,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW2W,GAQTxT,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mCAAoC,MACpCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKma,eAAiB,SAASP,EAAQtQ,GACrC,OAAOtJ,KAAKka,2BAA2BN,EAAQtQ,GAC5CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKoa,uBAAyB,SAASR,EAAQ/T,GAC7C,IAAIgE,EAAWhE,EAGf,GAAI+T,QACF,MAAM,IAAIrU,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW2W,GAqBb,OAAO5Z,KAAKmJ,UAAUjD,QACpB,2BAA4B,QAC5BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKqa,WAAa,SAAST,EAAQ/T,GACjC,OAAO7F,KAAKoa,uBAAuBR,EAAQ/T,GACxC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK2L,mBAAqB,SAAS9F,EAAMyD,GACvCA,EAAOA,GAAQ,CAAC,EAChB,IAAIO,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAQIa,EAAc,CAChB,iBAAsBkD,EAAqB,eAAIA,EAAqB,eAAIA,EAAuB,kBAajG,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iBAAkB,OAvBH,CACjB,EAuBcE,EAbK,CACnB,EAEiB,CACjB,EASqDyD,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK4L,OAAS,SAAS/F,EAAMyD,GAC3B,OAAOtJ,KAAK2L,mBAAmB9F,EAAMyD,GAClCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKsa,wBAA0B,SAASV,GAItC,GAAIA,QACF,MAAM,IAAIrU,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW2W,GAqBb,OAAO5Z,KAAKmJ,UAAUjD,QACpB,2CAA4C,OAC5CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKua,YAAc,SAASX,GAC1B,OAAO5Z,KAAKsa,wBAAwBV,GACjCpQ,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKwa,0BAA4B,SAASZ,GAIxC,GAAIA,QACF,MAAM,IAAIrU,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW2W,GAqBb,OAAO5Z,KAAKmJ,UAAUjD,QACpB,6CAA8C,OAC9CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKya,cAAgB,SAASb,GAC5B,OAAO5Z,KAAKwa,0BAA0BZ,GACnCpQ,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBChfA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAK0a,uBAAyB,SAASC,GAIrC,GAAIA,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,mBAAoB,SACpBjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK4a,WAAa,SAASD,GACzB,OAAO3a,KAAK0a,uBAAuBC,GAChCnR,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK6a,mCAAqC,SAASF,EAAQG,GAIzD,GAAIH,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIuV,QACF,MAAM,IAAIvV,MAAM,qEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,qBAAwBG,GAqB1B,OAAO9a,KAAKmJ,UAAUjD,QACpB,8DAA+D,SAC/DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAK+a,uBAAyB,SAASJ,EAAQG,GAC7C,OAAO9a,KAAK6a,mCAAmCF,EAAQG,GACpDtR,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKgb,2CAA6C,SAASL,EAAQG,EAAoBG,GAIrF,GAAIN,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIuV,QACF,MAAM,IAAIvV,MAAM,qEAIlB,GAAI0V,QACF,MAAM,IAAI1V,MAAM,6DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,qBAAwBG,EACxB,YAAeG,GAqBjB,OAAOjb,KAAKmJ,UAAUjD,QACpB,sFAAuF,SACvFjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAKkb,+BAAiC,SAASP,EAAQG,EAAoBG,GACzE,OAAOjb,KAAKgb,2CAA2CL,EAAQG,EAAoBG,GAChFzR,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKmb,6BAA+B,SAASR,EAAQxP,GAInD,GAAIwP,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAqBrB,OAAOnL,KAAKmJ,UAAUjD,QACpB,6CAA8C,SAC9CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKob,iBAAmB,SAAST,EAAQxP,GACvC,OAAOnL,KAAKmb,6BAA6BR,EAAQxP,GAC9C3B,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKqb,iCAAmC,SAASV,EAAQxP,EAAgBmQ,GAIvE,GAAIX,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAIlB,GAAI+V,QACF,MAAM,IAAI/V,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,EACnB,QAAWmQ,GAqBb,OAAOtb,KAAKmJ,UAAUjD,QACpB,6DAA8D,SAC9DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAKub,qBAAuB,SAASZ,EAAQxP,EAAgBmQ,GAC3D,OAAOtb,KAAKqb,iCAAiCV,EAAQxP,EAAgBmQ,GAClE9R,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKwb,iCAAmC,SAASb,EAAQc,GAIvD,GAAId,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIkW,QACF,MAAM,IAAIlW,MAAM,0DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,SAAYc,GAqBd,OAAOzb,KAAKmJ,UAAUjD,QACpB,2CAA4C,SAC5CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAK0b,qBAAuB,SAASf,EAAQc,GAC3C,OAAOzb,KAAKwb,iCAAiCb,EAAQc,GAClDjS,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK2b,0BAA4B,SAAShB,EAAQiB,GAIhD,GAAIjB,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIqW,QACF,MAAM,IAAIrW,MAAM,4DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAciB,GAqBhB,OAAO5b,KAAKmJ,UAAUjD,QACpB,yCAA0C,SAC1CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAK6b,cAAgB,SAASlB,EAAQiB,GACpC,OAAO5b,KAAK2b,0BAA0BhB,EAAQiB,GAC3CpS,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK8b,gCAAkC,SAASnB,EAAQiB,EAAWzQ,GAIjE,GAAIwP,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIqW,QACF,MAAM,IAAIrW,MAAM,4DAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAciB,EACd,gBAAmBzQ,GAqBrB,OAAOnL,KAAKmJ,UAAUjD,QACpB,mEAAoE,SACpEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASAjD,KAAK+b,oBAAsB,SAASpB,EAAQiB,EAAWzQ,GACrD,OAAOnL,KAAK8b,gCAAgCnB,EAAQiB,EAAWzQ,GAC5D3B,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKgc,8BAAgC,SAASrB,EAAQsB,GAIpD,GAAItB,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI0W,QACF,MAAM,IAAI1W,MAAM,4DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAcsB,GAqBhB,OAAOjc,KAAKmJ,UAAUjD,QACpB,yCAA0C,SAC1CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKkc,kBAAoB,SAASvB,EAAQsB,GACxC,OAAOjc,KAAKgc,8BAA8BrB,EAAQsB,GAC/CzS,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKmc,8BAAgC,SAASxB,EAAQxP,EAAgB7B,GACpEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,kDAAmD,MACnDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKoc,kBAAoB,SAASzB,EAAQxP,EAAgB7B,GACxD,OAAOtJ,KAAKmc,8BAA8BxB,EAAQxP,EAAgB7B,GAC/DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAqBA5F,KAAKqc,wBAA0B,SAAS/S,GACtCA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,oBAAyBA,EAAwB,kBAAIA,EAAwB,kBAAIA,EAA0B,oBAC3G,mBAAwBA,EAAuB,iBAAIA,EAAuB,iBAAIA,EAAyB,mBACvG,0BAA+BA,EAA6B,uBAAIA,EAA6B,uBAAIA,EAAgC,0BACjI,yBAA8BA,EAA4B,sBAAIA,EAA4B,sBAAIA,EAA+B,yBAC7H,OAAWA,EAAY,MAAIA,EAAY,OACvC,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,SACjE,oBAAyBA,EAAwB,kBAAIA,EAAwB,kBAAIA,EAA0B,oBAC3G,uBAA4BA,EAA2B,qBAAIA,EAA2B,qBAAIA,EAA6B,wBAazH,OAAOtJ,KAAKmJ,UAAUjD,QACpB,SAAU,MAnCK,CACjB,EAmCcE,EAbK,CACnB,EAEiB,CACjB,EA7Be,KA+BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAoBApG,KAAKsc,YAAc,SAAShT,GAC1B,OAAOtJ,KAAKqc,wBAAwB/S,GACjCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKuc,oBAAsB,SAAS5B,EAAQrR,GAC1CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,uBAA4BA,EAA2B,qBAAIA,EAA2B,qBAAIA,EAA6B,wBAazH,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mBAAoB,MACpBjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAzBe,KA2BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKwc,QAAU,SAAS7B,EAAQrR,GAC9B,OAAOtJ,KAAKuc,oBAAoB5B,EAAQrR,GACrCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAKyc,gCAAkC,SAAS9B,EAAQrR,GACtDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iCAAkC,MAClCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK0c,oBAAsB,SAAS/B,EAAQrR,GAC1C,OAAOtJ,KAAKyc,gCAAgC9B,EAAQrR,GACjDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK2c,sCAAwC,SAAShC,EAAQiC,EAAUtT,GACtEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIqX,QACF,MAAM,IAAIrX,MAAM,2DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,UAAaiC,GAQXxW,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6CAA8C,MAC9CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK6c,0BAA4B,SAASlC,EAAQiC,EAAUtT,GAC1D,OAAOtJ,KAAK2c,sCAAsChC,EAAQiC,EAAUtT,GACjEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK8c,kCAAoC,SAASnC,EAAQrR,GACxDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAWkD,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,OAAUtJ,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,4BAA6B,MAC7BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK+c,sBAAwB,SAASpC,EAAQrR,GAC5C,OAAOtJ,KAAK8c,kCAAkCnC,EAAQrR,GACnDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKgd,2BAA6B,SAASrC,EAAQrR,GACjDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2BAA4B,MAC5BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKid,eAAiB,SAAStC,EAAQrR,GACrC,OAAOtJ,KAAKgd,2BAA2BrC,EAAQrR,GAC5CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAeA5F,KAAKkd,iCAAmC,SAASvC,EAAQrR,GACvDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,UAanE,OAAOtJ,KAAKmJ,UAAUjD,QACpB,kCAAmC,MACnCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAcApG,KAAKmd,qBAAuB,SAASxC,EAAQrR,GAC3C,OAAOtJ,KAAKkd,iCAAiCvC,EAAQrR,GAClDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKod,wCAA0C,SAASzC,EAAQ0C,EAAO/T,GACrEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI8X,QACF,MAAM,IAAI9X,MAAM,wDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,MAAS0C,GAQPjX,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,0CAA2C,MAC3CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKsd,4BAA8B,SAAS3C,EAAQ0C,EAAO/T,GACzD,OAAOtJ,KAAKod,wCAAwCzC,EAAQ0C,EAAO/T,GAChEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKud,sCAAwC,SAAS5C,EAAQrR,GAC5DA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,MAAUA,EAAW,KAAIA,EAAW,OAatC,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uCAAwC,MACxCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA3Be,KA6BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKwd,0BAA4B,SAAS7C,EAAQrR,GAChD,OAAOtJ,KAAKud,sCAAsC5C,EAAQrR,GACvDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKyd,gCAAkC,SAAS9C,EAAQG,EAAoBxR,GAC1EA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIuV,QACF,MAAM,IAAIvV,MAAM,qEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,qBAAwBG,GAQtB1U,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,8DAA+D,MAC/DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK0d,oBAAsB,SAAS/C,EAAQG,EAAoBxR,GAC9D,OAAOtJ,KAAKyd,gCAAgC9C,EAAQG,EAAoBxR,GACrEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK2d,0CAA4C,SAAShD,EAAQG,EAAoBxR,GACpFA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIuV,QACF,MAAM,IAAIvV,MAAM,qEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,qBAAwBG,GAQtB1U,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,wEAAyE,MACzEjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK4d,8BAAgC,SAASjD,EAAQG,EAAoBxR,GACxE,OAAOtJ,KAAK2d,0CAA0ChD,EAAQG,EAAoBxR,GAC/EE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK6d,wCAA0C,SAASlD,EAAQG,EAAoBG,EAAY3R,GAC9FA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIuV,QACF,MAAM,IAAIvV,MAAM,qEAIlB,GAAI0V,QACF,MAAM,IAAI1V,MAAM,6DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,qBAAwBG,EACxB,YAAeG,GAQb7U,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,sFAAuF,MACvFjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EApCe,KAsCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK8d,4BAA8B,SAASnD,EAAQG,EAAoBG,EAAY3R,GAClF,OAAOtJ,KAAK6d,wCAAwClD,EAAQG,EAAoBG,EAAY3R,GACzFE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK+d,6BAA+B,SAASpD,EAAQrR,GACnDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6BAA8B,MAC9BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKge,iBAAmB,SAASrD,EAAQrR,GACvC,OAAOtJ,KAAK+d,6BAA6BpD,EAAQrR,GAC9CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EA4BA5F,KAAKie,+BAAiC,SAAStD,EAAQrR,GACrDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,QAAYA,EAAa,OAAIA,EAAa,QAC1C,oBAAyBA,EAAwB,kBAAIA,EAAwB,kBAAIA,EAA0B,oBAC3G,qBAA0BA,EAAyB,mBAAIA,EAAyB,mBAAIA,EAA2B,qBAC/G,mBAAwBA,EAAuB,iBAAIA,EAAuB,iBAAIA,EAAyB,mBACvG,oBAAyBA,EAAwB,kBAAIA,EAAwB,kBAAIA,EAA0B,oBAC3G,gBAAqBA,EAAoB,cAAIA,EAAoB,cAAIA,EAAsB,gBAC3F,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,SACjE,qBAA0BA,EAAyB,mBAAIA,EAAyB,mBAAIA,EAA2B,qBAC/G,aAAkBA,EAAkB,YAAIA,EAAkB,YAAIA,EAAmB,aACjF,eAAoBA,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eACzF,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,SACjE,oBAAyBA,EAAwB,kBAAIA,EAAwB,kBAAIA,EAA0B,oBAC3G,mBAAwBA,EAAwB,kBAAIA,EAAwB,kBAAIA,EAAyB,oBAa3G,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2BAA4B,MAC5BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAzCe,KA2CC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EA2BApG,KAAKke,mBAAqB,SAASvD,EAAQrR,GACzC,OAAOtJ,KAAKie,+BAA+BtD,EAAQrR,GAChDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKme,0BAA4B,SAASxD,EAAQxP,EAAgB7B,GAChEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6CAA8C,MAC9CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKoe,cAAgB,SAASzD,EAAQxP,EAAgB7B,GACpD,OAAOtJ,KAAKme,0BAA0BxD,EAAQxP,EAAgB7B,GAC3DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAKqe,kCAAoC,SAAS1D,EAAQxP,EAAgB7B,GACxEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAUtJ,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,QAalG,OAAOtJ,KAAKmJ,UAAUjD,QACpB,sDAAuD,MACvDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA/Be,KAiCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKse,sBAAwB,SAAS3D,EAAQxP,EAAgB7B,GAC5D,OAAOtJ,KAAKqe,kCAAkC1D,EAAQxP,EAAgB7B,GACnEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAeA5F,KAAKue,sCAAwC,SAAS5D,EAAQxP,EAAgB7B,GAC5EA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,iBAAoBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAuB,iBAAG,QAaxI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2DAA4D,MAC5DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAjCe,KAmCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAcApG,KAAKwe,0BAA4B,SAAS7D,EAAQxP,EAAgB7B,GAChE,OAAOtJ,KAAKue,sCAAsC5D,EAAQxP,EAAgB7B,GACvEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKye,gCAAkC,SAAS9D,EAAQxP,EAAgB7B,GACtEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,OAAWkD,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,OAAUtJ,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,oDAAqD,MACrDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK0e,oBAAsB,SAAS/D,EAAQxP,EAAgB7B,GAC1D,OAAOtJ,KAAKye,gCAAgC9D,EAAQxP,EAAgB7B,GACjEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK2e,+BAAiC,SAAShE,EAAQxP,EAAgB7B,GACrEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mDAAoD,MACpDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK4e,mBAAqB,SAASjE,EAAQxP,EAAgB7B,GACzD,OAAOtJ,KAAK2e,+BAA+BhE,EAAQxP,EAAgB7B,GAChEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAgBA5F,KAAK6e,+BAAiC,SAASlE,EAAQxP,EAAgB7B,GACrEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,WAAgBkD,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,SACjE,OAAUtJ,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mDAAoD,MACpDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAeApG,KAAK8e,mBAAqB,SAASnE,EAAQxP,EAAgB7B,GACzD,OAAOtJ,KAAK6e,+BAA+BlE,EAAQxP,EAAgB7B,GAChEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK+e,8BAAgC,SAASpE,EAAQxP,EAAgBmQ,EAAQhS,GAC5EA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAIlB,GAAI+V,QACF,MAAM,IAAI/V,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,EACnB,QAAWmQ,GAQTlV,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6DAA8D,MAC9DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EApCe,KAsCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKgf,kBAAoB,SAASrE,EAAQxP,EAAgBmQ,EAAQhS,GAChE,OAAOtJ,KAAK+e,8BAA8BpE,EAAQxP,EAAgBmQ,EAAQhS,GACvEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAeA5F,KAAKif,+BAAiC,SAAStE,EAAQrR,GACrDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,MAAUA,EAAW,KAAIA,EAAW,MACpC,UAAcA,EAAe,SAAIA,EAAe,WAalD,OAAOtJ,KAAKmJ,UAAUjD,QACpB,gCAAiC,MACjCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAcApG,KAAKkf,mBAAqB,SAASvE,EAAQrR,GACzC,OAAOtJ,KAAKif,+BAA+BtE,EAAQrR,GAChDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKmf,8BAAgC,SAASxE,EAAQc,EAASnS,GAC7DA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIkW,QACF,MAAM,IAAIlW,MAAM,0DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,SAAYc,GAQVrV,EAAc,CAChB,eAAkBpG,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAUtJ,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,QAalG,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2CAA4C,MAC5CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKof,kBAAoB,SAASzE,EAAQc,EAASnS,GACjD,OAAOtJ,KAAKmf,8BAA8BxE,EAAQc,EAASnS,GACxDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAeA5F,KAAKqf,uBAAyB,SAAS1E,EAAQiB,EAAWtS,GACxDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIqW,QACF,MAAM,IAAIrW,MAAM,4DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAciB,GAQZxV,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,gBAAqBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAsB,gBAC7F,sBAA2BA,EAA2B,qBAAIA,EAA2B,qBAAIA,EAA4B,sBACrH,qBAA0BA,EAA0B,oBAAIA,EAA0B,oBAAIA,EAA2B,sBAanH,OAAOtJ,KAAKmJ,UAAUjD,QACpB,yCAA0C,MAC1CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAjCe,KAmCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAcApG,KAAKsf,WAAa,SAAS3E,EAAQiB,EAAWtS,GAC5C,OAAOtJ,KAAKqf,uBAAuB1E,EAAQiB,EAAWtS,GACnDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAiBA5F,KAAKuf,kCAAoC,SAAS5E,EAAQiB,EAAWtS,GACnEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIqW,QACF,MAAM,IAAIrW,MAAM,4DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAciB,GAQZxV,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,gBAAqBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAsB,gBAC7F,sBAA2BA,EAA2B,qBAAIA,EAA2B,qBAAIA,EAA4B,sBACrH,qBAA0BA,EAA0B,oBAAIA,EAA0B,oBAAIA,EAA2B,sBAanH,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iDAAkD,MAClDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAnCe,KAqCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAgBApG,KAAKwf,sBAAwB,SAAS7E,EAAQiB,EAAWtS,GACvD,OAAOtJ,KAAKuf,kCAAkC5E,EAAQiB,EAAWtS,GAC9DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKyf,+BAAiC,SAAS9E,GAI7C,GAAIA,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,gCAAiC,MACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK0f,mBAAqB,SAAS/E,GACjC,OAAO3a,KAAKyf,+BAA+B9E,GACxCnR,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2f,iCAAmC,SAAShF,GAI/C,GAAIA,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,2BAA4B,MAC5BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK4f,qBAAuB,SAASjF,GACnC,OAAO3a,KAAK2f,iCAAiChF,GAC1CnR,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK6f,sBAAwB,SAASlF,EAAQmF,GAI5C,GAAInF,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIua,QACF,MAAM,IAAIva,MAAM,2DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,UAAamF,GAqBf,OAAO9f,KAAKmJ,UAAUjD,QACpB,uCAAwC,MACxCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAK+f,UAAY,SAASpF,EAAQmF,GAChC,OAAO9f,KAAK6f,sBAAsBlF,EAAQmF,GACvCtW,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKggB,4BAA8B,SAASrF,GAI1C,GAAIA,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,4BAA6B,MAC7BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKigB,gBAAkB,SAAStF,GAC9B,OAAO3a,KAAKggB,4BAA4BrF,GACrCnR,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKkgB,2BAA6B,SAASvF,EAAQsB,GAIjD,GAAItB,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI0W,QACF,MAAM,IAAI1W,MAAM,4DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAcsB,GAqBhB,OAAOjc,KAAKmJ,UAAUjD,QACpB,yCAA0C,MAC1CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKmgB,eAAiB,SAASxF,EAAQsB,GACrC,OAAOjc,KAAKkgB,2BAA2BvF,EAAQsB,GAC5CzS,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKogB,uBAAyB,SAASzF,EAAQ9U,GAC7C,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,mBAAoB,QACpBjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKqgB,WAAa,SAAS1F,EAAQ9U,GACjC,OAAO7F,KAAKogB,uBAAuBzF,EAAQ9U,GACxC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKsgB,mCAAqC,SAAS3F,EAAQG,EAAoBjV,GAC7E,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIuV,QACF,MAAM,IAAIvV,MAAM,qEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,qBAAwBG,GAqB1B,OAAO9a,KAAKmJ,UAAUjD,QACpB,8DAA+D,QAC/DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKugB,uBAAyB,SAAS5F,EAAQG,EAAoBjV,GACjE,OAAO7F,KAAKsgB,mCAAmC3F,EAAQG,EAAoBjV,GACxE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKwgB,2CAA6C,SAAS7F,EAAQG,EAAoBG,EAAYpV,GACjG,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIuV,QACF,MAAM,IAAIvV,MAAM,qEAIlB,GAAI0V,QACF,MAAM,IAAI1V,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,qBAAwBG,EACxB,YAAeG,GAqBjB,OAAOjb,KAAKmJ,UAAUjD,QACpB,sFAAuF,QACvFjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAKygB,+BAAiC,SAAS9F,EAAQG,EAAoBG,EAAYpV,GACrF,OAAO7F,KAAKwgB,2CAA2C7F,EAAQG,EAAoBG,EAAYpV,GAC5F2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK0gB,6BAA+B,SAAS/F,EAAQxP,EAAgBtF,EAAMyD,GACzEA,EAAOA,GAAQ,CAAC,EAChB,IAAIO,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,sBAA2BkD,EAA0B,oBAAIA,EAA0B,oBAAIA,EAA4B,uBAarH,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6CAA8C,QAC9CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EASqDyD,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWA7J,KAAK2gB,iBAAmB,SAAShG,EAAQxP,EAAgBtF,EAAMyD,GAC7D,OAAOtJ,KAAK0gB,6BAA6B/F,EAAQxP,EAAgBtF,EAAMyD,GACpEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK4gB,iCAAmC,SAASjG,EAAQxP,EAAgBmQ,EAAQzV,GAC/E,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAIlB,GAAI+V,QACF,MAAM,IAAI/V,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,EACnB,QAAWmQ,GAqBb,OAAOtb,KAAKmJ,UAAUjD,QACpB,6DAA8D,QAC9DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAK6gB,qBAAuB,SAASlG,EAAQxP,EAAgBmQ,EAAQzV,GACnE,OAAO7F,KAAK4gB,iCAAiCjG,EAAQxP,EAAgBmQ,EAAQzV,GAC1E2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK8gB,iCAAmC,SAASnG,EAAQc,EAAS5V,GAChE,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIkW,QACF,MAAM,IAAIlW,MAAM,0DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,SAAYc,GAqBd,OAAOzb,KAAKmJ,UAAUjD,QACpB,2CAA4C,QAC5CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK+gB,qBAAuB,SAASpG,EAAQc,EAAS5V,GACpD,OAAO7F,KAAK8gB,iCAAiCnG,EAAQc,EAAS5V,GAC3D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKghB,0BAA4B,SAASrG,EAAQiB,EAAW/V,GAC3D,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIqW,QACF,MAAM,IAAIrW,MAAM,4DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAciB,GAqBhB,OAAO5b,KAAKmJ,UAAUjD,QACpB,yCAA0C,QAC1CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKihB,cAAgB,SAAStG,EAAQiB,EAAW/V,GAC/C,OAAO7F,KAAKghB,0BAA0BrG,EAAQiB,EAAW/V,GACtD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKkhB,8BAAgC,SAASvG,EAAQsB,EAAWpW,GAC/D,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI0W,QACF,MAAM,IAAI1W,MAAM,4DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAcsB,GAqBhB,OAAOjc,KAAKmJ,UAAUjD,QACpB,yCAA0C,QAC1CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKmhB,kBAAoB,SAASxG,EAAQsB,EAAWpW,GACnD,OAAO7F,KAAKkhB,8BAA8BvG,EAAQsB,EAAWpW,GAC1D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKohB,kCAAoC,SAASzG,EAAQxP,EAAgBtF,GACxE,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAqBrB,OAAOnL,KAAKmJ,UAAUjD,QACpB,oDAAqD,OACrDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKqhB,sBAAwB,SAAS1G,EAAQxP,EAAgBtF,GAC5D,OAAO7F,KAAKohB,kCAAkCzG,EAAQxP,EAAgBtF,GACnE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKshB,iCAAmC,SAAS3G,EAAQxP,EAAgBtF,GACvE,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAqBrB,OAAOnL,KAAKmJ,UAAUjD,QACpB,kDAAmD,OACnDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKuhB,qBAAuB,SAAS5G,EAAQxP,EAAgBtF,GAC3D,OAAO7F,KAAKshB,iCAAiC3G,EAAQxP,EAAgBtF,GAClE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKwhB,uBAAyB,SAAS3b,GACrC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,SAAU,OAtBK,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAKyhB,WAAa,SAAS5b,GACzB,OAAO7F,KAAKwhB,uBAAuB3b,GAChC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK0hB,6BAA+B,SAAS/G,EAAQ9U,EAAMyD,GACzDA,EAAOA,GAAQ,CAAC,EAChB,IAAIO,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,sBAA2BkD,EAA0B,oBAAIA,EAA0B,oBAAIA,EAA4B,sBACnH,qBAA0BA,EAAyB,mBAAIA,EAAyB,mBAAIA,EAA2B,sBAajH,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mBAAoB,OACpBjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EASqDyD,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWA7J,KAAK2hB,iBAAmB,SAAShH,EAAQ9U,EAAMyD,GAC7C,OAAOtJ,KAAK0hB,6BAA6B/G,EAAQ9U,EAAMyD,GACpDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK4hB,uCAAyC,SAASjH,EAAQ9U,GAC7D,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,uCAAwC,OACxCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK6hB,2BAA6B,SAASlH,EAAQ9U,GACjD,OAAO7F,KAAK4hB,uCAAuCjH,EAAQ9U,GACxD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK8hB,2CAA6C,SAASnH,EAAQG,EAAoBjV,GACrF,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIuV,QACF,MAAM,IAAIvV,MAAM,qEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,qBAAwBG,GAqB1B,OAAO9a,KAAKmJ,UAAUjD,QACpB,wEAAyE,OACzEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK+hB,+BAAiC,SAASpH,EAAQG,EAAoBjV,GACzE,OAAO7F,KAAK8hB,2CAA2CnH,EAAQG,EAAoBjV,GAChF2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKgiB,0BAA4B,SAASrH,EAAQ9U,EAAMyD,GACtDA,EAAOA,GAAQ,CAAC,EAChB,IAAIO,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,sBAA2BkD,EAA0B,oBAAIA,EAA0B,oBAAIA,EAA4B,uBAarH,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2BAA4B,OAC5BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EASqDyD,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUA7J,KAAKiiB,cAAgB,SAAStH,EAAQ9U,EAAMyD,GAC1C,OAAOtJ,KAAKgiB,0BAA0BrH,EAAQ9U,EAAMyD,GACjDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKkiB,sCAAwC,SAASvH,EAAQxP,GAI5D,GAAIwP,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAqBrB,OAAOnL,KAAKmJ,UAAUjD,QACpB,sEAAuE,OACvEjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKmiB,0BAA4B,SAASxH,EAAQxP,GAChD,OAAOnL,KAAKkiB,sCAAsCvH,EAAQxP,GACvD3B,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKoiB,iCAAmC,SAASzH,EAAQxP,EAAgBtF,GACvE,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAqBrB,OAAOnL,KAAKmJ,UAAUjD,QACpB,mDAAoD,OACpDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAKqiB,qBAAuB,SAAS1H,EAAQxP,EAAgBtF,GAC3D,OAAO7F,KAAKoiB,iCAAiCzH,EAAQxP,EAAgBtF,GAClE2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKsiB,8BAAgC,SAAS3H,EAAQ9U,GACpD,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,gCAAiC,OACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKuiB,kBAAoB,SAAS5H,EAAQ9U,GACxC,OAAO7F,KAAKsiB,8BAA8B3H,EAAQ9U,GAC/C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKwiB,0BAA4B,SAAS7H,EAAQ9U,GAChD,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,4BAA6B,OAC7BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKyiB,cAAgB,SAAS9H,EAAQ9U,GACpC,OAAO7F,KAAKwiB,0BAA0B7H,EAAQ9U,GAC3C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK0iB,gCAAkC,SAAS7c,EAAM8U,EAAQiB,GAC5D,IAAI/R,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAIlB,GAAIoV,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIqW,QACF,MAAM,IAAIrW,MAAM,4DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAciB,GAqBhB,OAAO5b,KAAKmJ,UAAUjD,QACpB,yCAA0C,OAC1CjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK2iB,oBAAsB,SAAS9c,EAAM8U,EAAQiB,GAChD,OAAO5b,KAAK0iB,gCAAgC7c,EAAM8U,EAAQiB,GACvDpS,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAK4iB,gCAAkC,SAASjI,EAAQiB,EAAW/V,GACjE,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIqW,QACF,MAAM,IAAIrW,MAAM,4DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,WAAciB,GAqBhB,OAAO5b,KAAKmJ,UAAUjD,QACpB,iDAAkD,OAClDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASA7J,KAAK6iB,oBAAsB,SAASlI,EAAQiB,EAAW/V,GACrD,OAAO7F,KAAK4iB,gCAAgCjI,EAAQiB,EAAW/V,GAC5D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK8iB,iCAAmC,SAASnI,EAAQ9U,GACvD,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,gCAAiC,OACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK+iB,qBAAuB,SAASpI,EAAQ9U,GAC3C,OAAO7F,KAAK8iB,iCAAiCnI,EAAQ9U,GAClD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKgjB,8BAAgC,SAASrI,EAAQ9U,GACpD,IAAIgE,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAqBb,OAAO3a,KAAKmJ,UAAUjD,QACpB,4BAA6B,OAC7BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAKijB,kBAAoB,SAAStI,EAAQ9U,GACxC,OAAO7F,KAAKgjB,8BAA8BrI,EAAQ9U,GAC/C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAqBA5F,KAAKkjB,yBAA2B,SAASvI,EAAQrR,GAC/CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,MAAUA,EAAW,KAAIA,EAAW,MACpC,iBAAsBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAuB,iBAC/F,kBAAuBA,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAwB,kBACnG,gBAAqBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAsB,gBAC7F,sBAA2BA,EAA2B,qBAAIA,EAA2B,qBAAIA,EAA4B,sBACrH,qBAA0BA,EAA0B,oBAAIA,EAA0B,oBAAIA,EAA2B,qBACjH,iBAAsBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAuB,iBAC/F,kBAAuBA,EAAsB,gBAAIA,EAAsB,gBAAIA,EAAwB,mBAarG,OAAOtJ,KAAKmJ,UAAUjD,QACpB,4BAA6B,MAC7BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAlCe,KAoCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAoBApG,KAAKmjB,aAAe,SAASxI,EAAQrR,GACnC,OAAOtJ,KAAKkjB,yBAAyBvI,EAAQrR,GAC1CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKojB,0BAA4B,SAASzI,EAAQxP,EAAgBtF,EAAMyD,GACtEA,EAAOA,GAAQ,CAAC,EAChB,IAAIO,EAAWhE,EAGf,GAAI8U,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,gBAAmBxP,GAQjB/E,EAAc,CAChB,sBAA2BkD,EAA0B,oBAAIA,EAA0B,oBAAIA,EAA4B,uBAarH,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6CAA8C,MAC9CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EASqDyD,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWA7J,KAAKqjB,cAAgB,SAAS1I,EAAQxP,EAAgBtF,EAAMyD,GAC1D,OAAOtJ,KAAKojB,0BAA0BzI,EAAQxP,EAAgBtF,EAAMyD,GACjEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAUA5F,KAAKsjB,sBAAwB,SAAS3I,EAAQrR,GAC5CA,EAAOA,GAAQ,CAAC,EAIhB,GAAIqR,QACF,MAAM,IAAIpV,MAAM,yDAGlB,IAAItC,EAAa,CACf,QAAW0X,GAQTvU,EAAc,CAChB,MAAUkD,EAAW,KAAIA,EAAW,OAatC,OAAOtJ,KAAKmJ,UAAUjD,QACpB,8BAA+B,MAC/BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAvBe,KAyBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASApG,KAAKujB,UAAY,SAAS5I,EAAQrR,GAChC,OAAOtJ,KAAKsjB,sBAAsB3I,EAAQrR,GACvCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBC7kJA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAOxChJ,KAAKmK,gBAAkB,WAwBrB,OAAOnK,KAAKmJ,UAAUjD,QACpB,QAAS,MAtBM,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAhBe,KAkBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAMAlG,KAAKqK,IAAM,WACT,OAAOrK,KAAKmK,kBACTX,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBC/DA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAcxChJ,KAAKwjB,oCAAsC,SAASla,GAClDA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,UAanE,OAAOtJ,KAAKmJ,UAAUjD,QACpB,0BAA2B,MA5BZ,CACjB,EA4BcE,EAbK,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKyjB,wBAA0B,SAASna,GACtC,OAAOtJ,KAAKwjB,oCAAoCla,GAC7CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK0jB,gCAAkC,SAAStL,EAAY9O,GAC1DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,GAQbhS,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,wCAAyC,MACzCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK2jB,oBAAsB,SAASvL,EAAY9O,GAC9C,OAAOtJ,KAAK0jB,gCAAgCtL,EAAY9O,GACrDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK4jB,+CAAiD,SAASxL,EAAY9O,GACzEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,GAQbhS,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,YAa3E,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mEAAoE,MACpEjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA3Be,KA6BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK6jB,mCAAqC,SAASzL,EAAY9O,GAC7D,OAAOtJ,KAAK4jB,+CAA+CxL,EAAY9O,GACpEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK8jB,qCAAuC,SAASxa,GACnDA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2BAA4B,MA1Bb,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK+jB,yBAA2B,SAASza,GACvC,OAAOtJ,KAAK8jB,qCAAqCxa,GAC9CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKgkB,iCAAmC,SAAS5L,EAAY9O,GAC3DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,GAQbhS,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,yCAA0C,MAC1CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKikB,qBAAuB,SAAS7L,EAAY9O,GAC/C,OAAOtJ,KAAKgkB,iCAAiC5L,EAAY9O,GACtDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKkkB,gCAAkC,SAAS5a,GAC9CA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,qBAAsB,MA1BP,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKmkB,oBAAsB,SAAS7a,GAClC,OAAOtJ,KAAKkkB,gCAAgC5a,GACzCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKokB,4BAA8B,SAAShM,EAAY9O,GACtDA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,GAQbhS,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mCAAoC,MACpCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqkB,gBAAkB,SAASjM,EAAY9O,GAC1C,OAAOtJ,KAAKokB,4BAA4BhM,EAAY9O,GACjDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKskB,wCAA0C,SAASlM,EAAY9O,GAClEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,GAQbhS,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6CAA8C,MAC9CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKukB,4BAA8B,SAASnM,EAAY9O,GACtD,OAAOtJ,KAAKskB,wCAAwClM,EAAY9O,GAC7DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKwkB,oCAAsC,SAASpM,EAAYqM,EAAYnb,GAC1EA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAIlB,GAAIkf,QACF,MAAM,IAAIlf,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,EACf,YAAeqM,GAQbre,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2DAA4D,MAC5DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK0kB,wBAA0B,SAAStM,EAAYqM,EAAYnb,GAC9D,OAAOtJ,KAAKwkB,oCAAoCpM,EAAYqM,EAAYnb,GACrEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK2kB,qCAAuC,SAASvM,EAAYqM,EAAYnb,GAC3EA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAIlB,GAAIkf,QACF,MAAM,IAAIlf,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,EACf,YAAeqM,GAQbre,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,0BAA+BA,EAA8B,wBAAIA,EAA8B,wBAAIA,EAAgC,2BAarI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mEAAoE,MACpEjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA/Be,KAiCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK4kB,yBAA2B,SAASxM,EAAYqM,EAAYnb,GAC/D,OAAOtJ,KAAK2kB,qCAAqCvM,EAAYqM,EAAYnb,GACtEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK6kB,kCAAoC,SAASzM,EAAY9O,GAC5DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8O,QACF,MAAM,IAAI7S,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,GAQbhS,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,kBAAuBA,EAAuB,iBAAIA,EAAuB,iBAAIA,EAAwB,kBACrG,aAAkBA,EAAkB,YAAIA,EAAkB,YAAIA,EAAmB,aACjF,0BAA+BA,EAA8B,wBAAIA,EAA8B,wBAAIA,EAAgC,2BAarI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,6CAA8C,MAC9CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA3Be,KA6BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK8kB,sBAAwB,SAAS1M,EAAY9O,GAChD,OAAOtJ,KAAK6kB,kCAAkCzM,EAAY9O,GACvDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK+kB,8BAAgC,SAAS3M,EAAY4M,GAIxD,GAAI5M,QACF,MAAM,IAAI7S,MAAM,6DAIlB,GAAIyf,QACF,MAAM,IAAIzf,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAemV,EACf,YAAe4M,GAqBjB,OAAOhlB,KAAKmJ,UAAUjD,QACpB,2DAA4D,MAC5DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKilB,kBAAoB,SAAS7M,EAAY4M,GAC5C,OAAOhlB,KAAK+kB,8BAA8B3M,EAAY4M,GACnDxb,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCpzBA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAexChJ,KAAKklB,kCAAoC,SAAS5b,GAChDA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,MAAUA,EAAW,KAAIA,EAAW,MACpC,iBAAsBA,EAAqB,eAAIA,EAAqB,eAAIA,EAAuB,iBAC/F,gBAAqBA,EAAoB,cAAIA,EAAoB,cAAIA,EAAsB,iBAa7F,OAAOtJ,KAAKmJ,UAAUjD,QACpB,WAAY,MA7BG,CACjB,EA6BcE,EAbK,CACnB,EAEiB,CACjB,EAvBe,KAyBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAcApG,KAAKmlB,sBAAwB,SAAS7b,GACpC,OAAOtJ,KAAKklB,kCAAkC5b,GAC3CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKolB,8BAAgC,SAAS/X,EAAY/D,GACxDA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,yBAA0B,MAC1BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqlB,kBAAoB,SAAShY,EAAY/D,GAC5C,OAAOtJ,KAAKolB,8BAA8B/X,EAAY/D,GACnDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKslB,oCAAsC,SAASjY,EAAY/D,GAC9DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uCAAwC,MACxCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKulB,wBAA0B,SAASlY,EAAY/D,GAClD,OAAOtJ,KAAKslB,oCAAoCjY,EAAY/D,GACzDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKwlB,mCAAqC,SAASnY,EAAYuP,EAAUtT,GACvEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIqX,QACF,MAAM,IAAIrX,MAAM,2DAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,UAAauP,GAQXxW,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mDAAoD,MACpDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKylB,uBAAyB,SAASpY,EAAYuP,EAAUtT,GAC3D,OAAOtJ,KAAKwlB,mCAAmCnY,EAAYuP,EAAUtT,GAClEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK0lB,8BAAgC,SAASrY,EAAY/D,GACxDA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,gCAAiC,MACjCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK2lB,kBAAoB,SAAStY,EAAY/D,GAC5C,OAAOtJ,KAAK0lB,8BAA8BrY,EAAY/D,GACnDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK4lB,oCAAsC,SAASvY,EAAY/D,GAC9DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,uCAAwC,MACxCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK6lB,wBAA0B,SAASxY,EAAY/D,GAClD,OAAOtJ,KAAK4lB,oCAAoCvY,EAAY/D,GACzDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK8lB,2CAA6C,SAASzY,EAAY0Y,EAAQzc,GAC7EA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIwgB,QACF,MAAM,IAAIxgB,MAAM,yDAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,QAAW0Y,GAQT3f,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iDAAkD,MAClDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKgmB,+BAAiC,SAAS3Y,EAAY0Y,EAAQzc,GACjE,OAAOtJ,KAAK8lB,2CAA2CzY,EAAY0Y,EAAQzc,GACxEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKimB,+BAAiC,SAAS5Y,EAAY0Y,EAAQzc,GACjEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIwgB,QACF,MAAM,IAAIxgB,MAAM,yDAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,QAAW0Y,GAQT3f,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,yDAA0D,MAC1DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAhCe,KAkCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKkmB,mBAAqB,SAAS7Y,EAAY0Y,EAAQzc,GACrD,OAAOtJ,KAAKimB,+BAA+B5Y,EAAY0Y,EAAQzc,GAC5DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAKmmB,8BAAgC,SAAS9Y,EAAY0Y,EAAQ5a,EAAgB7B,GAChFA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAIwgB,QACF,MAAM,IAAIxgB,MAAM,yDAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,QAAW0Y,EACX,gBAAmB5a,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2EAA4E,MAC5EjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EApCe,KAsCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKomB,kBAAoB,SAAS/Y,EAAY0Y,EAAQ5a,EAAgB7B,GACpE,OAAOtJ,KAAKmmB,8BAA8B9Y,EAAY0Y,EAAQ5a,EAAgB7B,GAC3EE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKqmB,4CAA8C,SAAShZ,EAAY/D,GACtEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,4CAA6C,MAC7CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKsmB,gCAAkC,SAASjZ,EAAY/D,GAC1D,OAAOtJ,KAAKqmB,4CAA4ChZ,EAAY/D,GACjEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKumB,mDAAqD,SAASlZ,EAAY/D,GAC7EA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,YAa3E,OAAOtJ,KAAKmJ,UAAUjD,QACpB,oDAAqD,MACrDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA3Be,KA6BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKwmB,uCAAyC,SAASnZ,EAAY/D,GACjE,OAAOtJ,KAAKumB,mDAAmDlZ,EAAY/D,GACxEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKymB,yCAA2C,SAASpZ,EAAY/D,GACnEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,gCAAiC,MACjCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK0mB,6BAA+B,SAASrZ,EAAY/D,GACvD,OAAOtJ,KAAKymB,yCAAyCpZ,EAAY/D,GAC9DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAK2mB,wCAA0C,SAAStZ,EAAY/D,GAClEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,OAAWA,EAAY,MAAIA,EAAY,QAazC,OAAOtJ,KAAKmJ,UAAUjD,QACpB,wCAAyC,MACzCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA3Be,KA6BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAK4mB,4BAA8B,SAASvZ,EAAY/D,GACtD,OAAOtJ,KAAK2mB,wCAAwCtZ,EAAY/D,GAC7DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK6mB,0CAA4C,SAASxZ,EAAYlC,EAAgB7B,GACpFA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,gBAAmBlC,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,QAazC,OAAOtJ,KAAKmJ,UAAUjD,QACpB,0DAA2D,MAC3DjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA/Be,KAiCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK8mB,8BAAgC,SAASzZ,EAAYlC,EAAgB7B,GACxE,OAAOtJ,KAAK6mB,0CAA0CxZ,EAAYlC,EAAgB7B,GAC/EE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK+mB,oCAAsC,SAAS1Z,EAAY/D,GAC9DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mCAAoC,MACpCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKgnB,wBAA0B,SAAS3Z,EAAY/D,GAClD,OAAOtJ,KAAK+mB,oCAAoC1Z,EAAY/D,GACzDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAcA5F,KAAKinB,mCAAqC,SAAS5Z,EAAY/D,GAC7DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,OAAWA,EAAY,MAAIA,EAAY,QAazC,OAAOtJ,KAAKmJ,UAAUjD,QACpB,sCAAuC,MACvCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA3Be,KA6BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAaApG,KAAKknB,uBAAyB,SAAS7Z,EAAY/D,GACjD,OAAOtJ,KAAKinB,mCAAmC5Z,EAAY/D,GACxDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKmnB,+CAAiD,SAAS9Z,EAAYlC,EAAgB7B,GACzFA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,gBAAmBlC,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,wDAAyD,MACzDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKonB,mCAAqC,SAAS/Z,EAAYlC,EAAgB7B,GAC7E,OAAOtJ,KAAKmnB,+CAA+C9Z,EAAYlC,EAAgB7B,GACpFE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAKqnB,kCAAoC,SAASha,EAAY/D,GAC5DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,iCAAkC,MAClCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAKsnB,sBAAwB,SAASja,EAAY/D,GAChD,OAAOtJ,KAAKqnB,kCAAkCha,EAAY/D,GACvDE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKunB,iCAAmC,SAASla,EAAYlC,EAAgB7B,GAC3EA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,gBAAmBlC,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,mDAAoD,MACpDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKwnB,qBAAuB,SAASna,EAAYlC,EAAgB7B,GAC/D,OAAOtJ,KAAKunB,iCAAiCla,EAAYlC,EAAgB7B,GACtEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKynB,qCAAuC,SAASpa,EAAY/D,GAC/DA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,qCAAsC,MACtCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK0nB,yBAA2B,SAASra,EAAY/D,GACnD,OAAOtJ,KAAKynB,qCAAqCpa,EAAY/D,GAC1DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAaA5F,KAAK2nB,2CAA6C,SAASta,EAAY/D,GACrEA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeoK,GAQbjH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,sCAAuC,MACvCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA1Be,KA4BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAYApG,KAAK4nB,+BAAiC,SAASva,EAAY/D,GACzD,OAAOtJ,KAAK2nB,2CAA2Cta,EAAY/D,GAChEE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAK6nB,sCAAwC,SAASxa,EAAYlC,EAAgB7B,GAChFA,EAAOA,GAAQ,CAAC,EAIhB,GAAI+D,QACF,MAAM,IAAI9H,MAAM,6DAIlB,GAAI4F,QACF,MAAM,IAAI5F,MAAM,iEAGlB,IAAItC,EAAa,CACf,YAAeoK,EACf,gBAAmBlC,GAQjB/E,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,wDAAyD,MACzDjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EA9Be,KAgCC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAK8nB,0BAA4B,SAASza,EAAYlC,EAAgB7B,GACpE,OAAOtJ,KAAK6nB,sCAAsCxa,EAAYlC,EAAgB7B,GAC3EE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBC3hDA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAUxChJ,KAAK+nB,oBAAsB,SAASze,GAClCA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,IAAK,MAxBU,CACjB,EAwBcE,EAbK,CACnB,EAEiB,CACjB,EAlBe,KAoBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EASApG,KAAKgoB,QAAU,SAAS1e,GACtB,OAAOtJ,KAAK+nB,oBAAoBze,GAC7BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCxEA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAWxChJ,KAAKioB,mBAAqB,SAASlhB,EAAOuC,GACxCA,EAAOA,GAAQ,CAAC,EAIhB,GAAIvC,QACF,MAAM,IAAIxB,MAAM,wDAGlB,IAQIa,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,MAASvC,GAaX,OAAO/G,KAAKmJ,UAAUjD,QACpB,oBAAqB,MAzBN,CACjB,EAyBcE,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKkoB,OAAS,SAASnhB,EAAOuC,GAC5B,OAAOtJ,KAAKioB,mBAAmBlhB,EAAOuC,GACnCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBChFA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAYxChJ,KAAKioB,mBAAqB,SAASlhB,EAAOuC,GACxCA,EAAOA,GAAQ,CAAC,EAIhB,GAAIvC,QACF,MAAM,IAAIxB,MAAM,wDAGlB,IAQIa,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,MAASvC,EACT,QAAauC,EAAa,OAAIA,EAAa,OAAIA,EAAc,SAa/D,OAAOtJ,KAAKmJ,UAAUjD,QACpB,kBAAmB,MA1BJ,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EAzBe,KA2BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkoB,OAAS,SAASnhB,EAAOuC,GAC5B,OAAOtJ,KAAKioB,mBAAmBlhB,EAAOuC,GACnCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCnFA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SASxChJ,KAAKmoB,0BAA4B,SAASxN,EAAQmF,GAIhD,GAAInF,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIua,QACF,MAAM,IAAIva,MAAM,2DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,UAAamF,GAqBf,OAAO9f,KAAKmJ,UAAUjD,QACpB,uDAAwD,OACxDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKooB,cAAgB,SAASzN,EAAQmF,GACpC,OAAO9f,KAAKmoB,0BAA0BxN,EAAQmF,GAC3CtW,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKqoB,4BAA8B,SAAS1N,EAAQmF,GAIlD,GAAInF,QACF,MAAM,IAAIpV,MAAM,yDAIlB,GAAIua,QACF,MAAM,IAAIva,MAAM,2DAGlB,IAAItC,EAAa,CACf,QAAW0X,EACX,UAAamF,GAqBf,OAAO9f,KAAKmJ,UAAUjD,QACpB,yDAA0D,OAC1DjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQAjD,KAAKsoB,gBAAkB,SAAS3N,EAAQmF,GACtC,OAAO9f,KAAKqoB,4BAA4B1N,EAAQmF,GAC7CtW,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBC9IA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKyM,mBAAqB,SAASW,GAIjC,GAAIA,QACF,MAAM,IAAI7H,MAAM,2DAGlB,IAAItC,EAAa,CACf,UAAamK,GAqBf,OAAOpN,KAAKmJ,UAAUjD,QACpB,gCAAiC,SACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAK2M,OAAS,SAASS,GACrB,OAAOpN,KAAKyM,mBAAmBW,GAC5B5D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAYA5F,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,SAa5C,OAAOtJ,KAAKmJ,UAAUjD,QACpB,oBAAqB,MA1BN,CACjB,EA0BcE,EAbK,CACnB,EAEiB,CACjB,EApBe,KAsBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAWApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAKmK,gBAAkB,SAASiD,EAAU9D,GACxCA,EAAOA,GAAQ,CAAC,EAIhB,GAAI8D,QACF,MAAM,IAAI7H,MAAM,2DAGlB,IAAItC,EAAa,CACf,UAAamK,GAQXhH,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,gCAAiC,MACjCjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAKqK,IAAM,SAAS+C,EAAU9D,GAC5B,OAAOtJ,KAAKmK,gBAAgBiD,EAAU9D,GACnCE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK4M,mBAAqB,SAASQ,EAAUvH,GAC3C,IAAIgE,EAAWhE,EAGf,GAAIuH,QACF,MAAM,IAAI7H,MAAM,2DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,UAAamK,GAqBf,OAAOpN,KAAKmJ,UAAUjD,QACpB,gCAAiC,QACjCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK6M,OAAS,SAASO,EAAUvH,GAC/B,OAAO7F,KAAK4M,mBAAmBQ,EAAUvH,GACtC2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2L,mBAAqB,SAAS9F,GACjC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,oBAAqB,OAtBN,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK4L,OAAS,SAAS/F,GACrB,OAAO7F,KAAK2L,mBAAmB9F,GAC5B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,uBCzTA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKuoB,2BAA6B,SAASC,GAIzC,GAAIA,QACF,MAAM,IAAIjjB,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeulB,GAqBjB,OAAOxoB,KAAKmJ,UAAUjD,QACpB,2BAA4B,SAC5BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKyoB,eAAiB,SAASD,GAC7B,OAAOxoB,KAAKuoB,2BAA2BC,GACpChf,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAoBA5F,KAAKiK,iBAAmB,SAASX,GAC/BA,EAAOA,GAAQ,CAAC,EAChB,IAUIlD,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,OAC9H,OAAWA,EAAY,MAAIA,EAAY,OACvC,QAAYA,EAAa,OAAIA,EAAa,QAC1C,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,mBAAwBA,EAAuB,iBAAIA,EAAuB,iBAAIA,EAAyB,mBACvG,oBAAyBA,EAAwB,kBAAIA,EAAwB,kBAAIA,EAA0B,oBAC3G,MAAUA,EAAW,KAAIA,EAAW,MACpC,UAAcA,EAAe,SAAIA,EAAe,UAChD,UAAeA,EAAe,SAAIA,EAAe,SAAIA,EAAgB,UACrE,WAAgBA,EAAgB,UAAIA,EAAgB,UAAIA,EAAiB,WACzE,SAAcA,EAAc,QAAIA,EAAc,QAAIA,EAAe,UAanE,OAAOtJ,KAAKmJ,UAAUjD,QACpB,aAAc,MAlCC,CACjB,EAkCcE,EAbK,CACnB,EAEiB,CACjB,EA5Be,KA8BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAmBApG,KAAKkK,KAAO,SAASZ,GACnB,OAAOtJ,KAAKiK,iBAAiBX,GAC1BE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK0oB,wBAA0B,SAASF,EAAYlf,GAClDA,EAAOA,GAAQ,CAAC,EAIhB,GAAIkf,QACF,MAAM,IAAIjjB,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeulB,GAQbpiB,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2BAA4B,MAC5BjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK2oB,YAAc,SAASH,EAAYlf,GACtC,OAAOtJ,KAAK0oB,wBAAwBF,EAAYlf,GAC7CE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAWA5F,KAAK4oB,yCAA2C,SAASJ,EAAYlf,GACnEA,EAAOA,GAAQ,CAAC,EAIhB,GAAIkf,QACF,MAAM,IAAIjjB,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAeulB,GAQbpiB,EAAc,CAChB,OAAUpG,KAAKmJ,UAAUhE,sBAAqBmE,EAAa,OAAIA,EAAa,QAAoB,OAChG,eAAkBtJ,KAAKmJ,UAAUhE,qBAAqBmE,EAAoB,cAAIA,EAAoB,cAAIA,EAAqB,eAAG,QAahI,OAAOtJ,KAAKmJ,UAAUjD,QACpB,2CAA4C,MAC5CjD,EAAYmD,EAbK,CACnB,EAEiB,CACjB,EAxBe,KA0BC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAUApG,KAAK6oB,6BAA+B,SAASL,EAAYlf,GACvD,OAAOtJ,KAAK4oB,yCAAyCJ,EAAYlf,GAC9DE,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAK8oB,2BAA6B,SAASN,EAAY3iB,GACrD,IAAIgE,EAAWhE,EAGf,GAAI2iB,QACF,MAAM,IAAIjjB,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAeulB,GAqBjB,OAAOxoB,KAAKmJ,UAAUjD,QACpB,2BAA4B,QAC5BjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK+oB,eAAiB,SAASP,EAAY3iB,GACzC,OAAO7F,KAAK8oB,2BAA2BN,EAAY3iB,GAChD2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAK2L,mBAAqB,SAAS9F,GACjC,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,aAAc,OAtBC,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAK4L,OAAS,SAAS/F,GACrB,OAAO7F,KAAK2L,mBAAmB9F,GAC5B2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCjZA,IAAIsD,EAAY,EAAQ,MAcxBD,EAAOlJ,QAAU,SAASoJ,GACxBnJ,KAAKmJ,UAAYA,GAAaD,EAAUF,SAQxChJ,KAAKgpB,iCAAmC,SAASnjB,GAC/C,IAAIgE,EAAWhE,EAGf,GAAIA,QACF,MAAM,IAAIN,MAAM,uDAwBlB,OAAOvF,KAAKmJ,UAAUjD,QACpB,oBAAqB,OAtBN,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD2D,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOA7J,KAAKipB,qBAAuB,SAASpjB,GACnC,OAAO7F,KAAKgpB,iCAAiCnjB,GAC1C2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKkpB,yBAA2B,SAASC,GAIvC,GAAIA,QACF,MAAM,IAAI5jB,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAekmB,GAqBjB,OAAOnpB,KAAKmJ,UAAUjD,QACpB,kCAAmC,SACnCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKopB,aAAe,SAASD,GAC3B,OAAOnpB,KAAKkpB,yBAAyBC,GAClC3f,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAQA5F,KAAKqpB,sBAAwB,SAASF,GAIpC,GAAIA,QACF,MAAM,IAAI5jB,MAAM,6DAGlB,IAAItC,EAAa,CACf,YAAekmB,GAqBjB,OAAOnpB,KAAKmJ,UAAUjD,QACpB,kCAAmC,MACnCjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAtBe,KAwBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAOAjD,KAAKspB,UAAY,SAASH,GACxB,OAAOnpB,KAAKqpB,sBAAsBF,GAC/B3f,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EAOA5F,KAAKupB,kCAAoC,WAwBvC,OAAOvpB,KAAKmJ,UAAUjD,QACpB,oBAAqB,MAtBN,CACjB,EAOkB,CAClB,EACmB,CACnB,EAEiB,CACjB,EAhBe,KAkBC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAMAlG,KAAKwpB,sBAAwB,WAC3B,OAAOxpB,KAAKupB,oCACT/f,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,EASA5F,KAAKypB,qCAAuC,SAASN,EAAYtjB,GAC/D,IAAIgE,EAAWhE,EAGf,GAAIsjB,QACF,MAAM,IAAI5jB,MAAM,6DAIlB,GAAIM,QACF,MAAM,IAAIN,MAAM,uDAGlB,IAAItC,EAAa,CACf,YAAekmB,GAqBjB,OAAOnpB,KAAKmJ,UAAUjD,QACpB,iDAAkD,OAClDjD,EAfgB,CAClB,EACmB,CACnB,EAEiB,CACjB,EASqD4G,EAPrC,CAAC,aACE,CAAC,oBACN,CAAC,mBAAoB,4BAClB,mBAOnB,EAQA7J,KAAK0pB,yBAA2B,SAASP,EAAYtjB,GACnD,OAAO7F,KAAKypB,qCAAqCN,EAAYtjB,GAC1D2D,MAAK,SAASC,GACb,OAAOA,EAAkB7D,IAC3B,GACJ,CACF,wBCnTA,IAAIsD,EAAY,EAAQ,MAExBD,EAAOlJ,QAAUmJ,EAAUF,+BCF3B,QAkBE,EAQM,WACP,aAEA,IAAI2gB,EAAc,WACjBC,EAAMC,IAAI,EAAG,2LACd,EAEAF,EAAYG,QAAU,QAGE,oBAAb,QACVnpB,OAAOopB,iBAAiB,kBAAc,GAIvC,IAAIC,EAAuB,8BA4B3BL,EAAYM,WAAa,SAAUC,GAMlC,IAsBCC,EACAC,EAtBAC,EAAY,yBACZC,EAA2B,UAC3BC,EAA2B,UAC3BC,EAA0B,SAC1BC,EAAkBC,EAAmBC,SAQrCV,EAAajqB,KACb4qB,EAAWhB,EAAMiB,OAAO,CAAC,EAAGJ,EAAiBP,GAC7CY,EAAgB,GAChBC,GAA2B,EAC3BC,EAAa,EACbC,EAAmBT,EACnBU,GAAc,EACdC,EAAgB,EAChBC,GAAW,EAcRC,EAAY,WACf,IAAK,IAAI/nB,KAAOsnB,EACVH,EAAgBjnB,eAAeF,KACnCumB,EAAI,EAAG,4BAA+BvmB,EAAM,YACrCsnB,EAAStnB,IAKlB,GAFAsnB,EAASU,UAAY1B,EAAMvf,IAAIkhB,SAASX,EAASU,WAAW,IAEvDV,EAASU,UAEb,MADAzB,EAAI,EAAG,yBAA2BQ,EAAY,wCACxCA,EAAY,iBAEnBa,EAAcN,EAASU,YAAc3qB,QAAUiqB,EAASU,YAAcE,SAAS3lB,OAAS2lB,SAAS3lB,KAAK4lB,SAASb,EAASU,cAGvHV,EAASU,UAAY3qB,QAGtBwqB,EAAgBO,IAEhBd,EAASU,UAAUvB,iBAAiB,SAAU4B,GAC9Cf,EAASU,UAAUvB,iBAAiB,SAAU4B,GAE9C,IAAIC,EAAKvjB,SAASuiB,EAASiB,gBAAiB,IAC5CjB,EAASiB,gBAAkBjC,EAAM5iB,KAAK8kB,OAAOF,GAAMA,EAAKnB,EAAgBoB,gBACxEE,IAEAlC,EAAI,EAAG,aAAeQ,EAAY,iBAAmBV,EAAYG,QAAU,IAC5E,EAMIiC,EAAkB,WACjBnB,EAASiB,gBAAkB,IAC9BzB,EAAkBzpB,OAAOqrB,WAAWC,EAASrB,EAASiB,iBAExD,EAMIK,EAAe,WAClB,OAAOtB,EAASuB,SAAWvC,EAAMvf,IAAI+hB,UAAUxB,EAASU,WAAa1B,EAAMvf,IAAIgiB,WAAWzB,EAASU,UACpG,EAMII,EAAkB,WACrB,OAAOd,EAASuB,SAAWvC,EAAMvf,IAAIiiB,OAAO1B,EAASU,WAAa1B,EAAMvf,IAAIkiB,MAAM3B,EAASU,UAC5F,EAOIkB,EAAexsB,KAAKysB,cAAgB,SAAUC,GAC7C9B,EAASuB,SACRjB,EACHvqB,OAAOgsB,SAAS/C,EAAMvf,IAAIgiB,aAAcK,GAExC9B,EAASU,UAAUc,UAAYM,EAG5BxB,EACHvqB,OAAOgsB,SAASD,EAAK9C,EAAMvf,IAAI+hB,aAE/BxB,EAASU,UAAUe,WAAaK,CAGnC,EAMIE,EAAe,WAClB,GAAIxB,GAAYL,EAA0B,CAEzC,IAAI8B,EAAiBjD,EAAM5iB,KAAKrC,MAAMomB,GAA4BA,EAA2BD,EAAcgC,MAAM,GAEjH/B,GAA2B,EAC3B,IAAIgC,EAAe/B,EAGfgC,GADJhC,EAAaf,EAAWgD,aACOF,EACX,IAAhBC,IACH/B,EAAoB+B,EAAc,EAAK1C,EAA2BC,GAG/DU,IAAqBV,GACxBsC,EAAeK,UAGhBL,EAAeM,SAAQ,SAAUC,EAAOC,GACvCxD,EAAI,EAAG,mBAAqBwD,EAAQ,GAAK,IAAMR,EAAe7oB,OAAS,KAAO8mB,EAAc9mB,OAAS,WACrGopB,EAAMvgB,QAAO,EACd,IAC8B,IAA1BggB,EAAe7oB,QAAgB4mB,EAAS0C,UAAY,GACvDzD,EAAI,EAAG,kDAET,CACD,EAMI0D,EAAiB,WACpBpD,EAAiBP,EAAM4D,IAAIZ,EAC5B,EAMIjB,EAAW,SAAU8B,GACxB5D,EAAI,EAAG,iCAAkC4D,EAAEzmB,MAC7B,UAAVymB,EAAEzmB,OAELmkB,EAAgBO,IAChBT,EAAmBT,IAGa,IAA7BO,IACHA,GAA2B,EAC3BwC,IAEF,EAEItB,EAAU,WACb,IAAKf,GAEAC,GAAiBO,IAAmB,CACvC,IAAIgC,EACJ,IACCA,EAAc,IAAIC,MAAM,SAAU,CACjCC,SAAS,EACTC,YAAY,GAEd,CAAE,MAAOJ,IACRC,EAAclC,SAASsC,YAAY,UACvBC,UAAU,UAAU,GAAO,EACxC,CACAnD,EAASU,UAAU0C,cAAcN,EAClC,CAED5C,EAAcqC,SAAQ,SAAUC,EAAOC,GACtCD,EAAMnB,SACP,IACAF,GACD,EAUIlC,EAAM7pB,KAAKiuB,KAAO,SAAUX,EAAUY,GACrCtD,EAAS0C,UAAYA,IACxB3oB,MAAMpC,UAAU4rB,OAAOC,KAAKC,UAAW,EAAG,EAAG,IAAMhE,EAAY,QAC/DT,EAAMC,IAAIyE,MAAM3tB,OAAQ0tB,WAE1B,EAEAruB,KAAK4qB,SAAWA,EAShB,IAAI2D,EAAa,SAAUC,GAC1B,GAAIA,EAAYxqB,QAAU,EACzB,OAAOwqB,EAEP,IAAIC,EAASD,EAAY1B,MAAM,GAI/B,OAHA2B,EAAOC,MAAK,SAAUC,EAAGC,GACxB,OAAOD,EAAEE,eAAiBD,EAAEC,eAAiB,GAAK,CACnD,IACOJ,CAET,EA2ZA,OAlYAzuB,KAAK8uB,SAAW,SAAUC,GACzB,GAAInF,EAAM5iB,KAAKrC,MAAMoqB,GACpBA,EAAS5B,SAAQ,SAAUC,EAAOC,GACjCpD,EAAW6E,SAAS1B,EACrB,SACM,GAAI2B,aAAoBpF,EAAYqF,OAC1C,GAAID,EAASE,eAAiBhF,EAC7B8E,EAASG,MAAMjF,QACT,GAAIa,EAAcqE,QAAQJ,GAAY,EAAG,CAQ/C,IAAK,IAAIzrB,KANTwnB,EAAcsE,KAAKL,GACnBjE,EAAgByD,EAAWzD,GAC3BiE,EAASM,GAAG,yBAAyB,WACpCvE,EAAgByD,EAAWzD,EAC5B,IAEgBF,EAAS0E,mBACpBP,EAASzrB,IACZyrB,EAASzrB,GAAK8qB,KAAKW,EAAUnE,EAAS0E,mBAAmBhsB,IAG3DumB,EAAI,EAAG,qBAAuBiB,EAAc9mB,OAAS,UACtD,OAEA6lB,EAAI,EAAG,sDAER,OAAOI,CACR,EAgBAjqB,KAAKuvB,YAAc,SAAUP,GAC5B,GAAIpF,EAAM5iB,KAAKrC,MAAMqqB,GACpBA,EAAM7B,SAAQ,SAAUC,EAAOC,GAC9BpD,EAAWsF,YAAYnC,EACxB,QACM,CACN,IAAIC,EAAQvC,EAAcqE,QAAQH,GAC9B3B,GAAS,IACZ2B,EAAMQ,IAAI,yBACV1E,EAAcqD,OAAOd,EAAO,GAC5BxD,EAAI,EAAG,uBAAyBiB,EAAc9mB,OAAS,UACvDgrB,EAAMriB,SAER,CACA,OAAOsd,CACR,EAwBAjqB,KAAKyvB,YAAc,SAAUT,EAAOU,GAkBnC,OAjBI9F,EAAM5iB,KAAKrC,MAAMqqB,GACpBA,EAAM7B,SAAQ,SAAUC,EAAOC,GAC9BpD,EAAWwF,YAAYrC,EAAOsC,EAC/B,IAEIA,EACHV,EAAMniB,QAAO,IAC0B,IAA7Bke,GAAqCiE,aAAiBrF,EAAYqF,SAG5B,IADhDjE,EAA2BA,GAA4B,IAC1BoE,QAAQH,IACpCjE,EAAyBqE,KAAKJ,GAE/BjE,EAA2BwD,EAAWxD,GACtCwC,KAGKtD,CACR,EAoBAjqB,KAAK6M,OAAS,SAAU6iB,GAOvB,OANA/D,EAAS,CACR3kB,KAAM,WAEH0oB,GACH9C,IAEM3C,CACR,EA+DAjqB,KAAK2sB,SAAW,SAAUgD,EAAcC,GACvC,GAAIhG,EAAM5iB,KAAK8kB,OAAO6D,GACrBnD,EAAa4B,KAAKxD,EAASU,UAAWqE,EAAcC,QAC9C,GAAID,aAAwBhG,EAAYqF,MAC1CW,EAAaV,eAAiBhF,EACjCA,EAAW0C,SAASgD,EAAad,eAAgBe,GAEjD/F,EAAI,EAAG,uFAAwF8F,QAE1F,GAAI/F,EAAM5iB,KAAK6oB,SAASF,GAC9BnD,EAAemD,MACT,CACN,IAAIG,EAAOlG,EAAMvf,IAAIkhB,SAASoE,GAAc,GAC5C,GAAIG,EAAM,CAET,KAAOA,EAAKC,WAAWC,aAAahG,IACnC8F,EAAOA,EAAKC,WAGb,IACCrtB,EAAQkoB,EAASuB,SAAW,MAAQ,OACpC8D,EAAkBrG,EAAMvf,IAAI6lB,OAAOtF,EAASU,WAC5C6E,EAAgBvG,EAAMvf,IAAI6lB,OAAOJ,GAE7B5E,IACJ+E,EAAgBvtB,IAAUunB,EAAWgD,aAGtChD,EAAW0C,SAASwD,EAAcztB,GAASutB,EAAgBvtB,GAAQktB,EACpE,MACC/F,EAAI,EAAG,kEAAmE8F,EAE5E,CACA,OAAO1F,CACR,EA+BAjqB,KAAKitB,UAAY,SAAUmD,GAC1B,OAAK/B,UAAUrqB,QAGV4lB,EAAM5iB,KAAK6oB,SAASO,GACvBlE,EAAekE,EAEfvG,EAAI,EAAG,oHAGFI,GARCiC,EAAakC,KAAKnE,EAS3B,EAsBAjqB,KAAKqwB,KAAO,SAAUC,GACrB,IAAIC,EAAS,CACZC,KAAMrF,EACNgB,SAAUvB,EAASuB,SACnBc,UAAWjC,EACXyF,gBAAiBxF,EACjBK,UAAWV,EAASU,UACpBoF,WAAYxF,GAEb,OAAKmD,UAAUrqB,YAEcrB,IAAlB4tB,EAAOD,GACVC,EAAOD,QAEdzG,EAAI,EAAG,kBAAqByG,EAAQ,sBAJ7BC,CAOT,EAgBAvwB,KAAKstB,SAAW,SAAUqD,GACzB,OAAKtC,UAAUrqB,QAEJ4mB,EAAS0C,UAAYqD,IAC/B/F,EAAS0C,SAAWqD,GAEd1G,GAJCW,EAAS0C,QAKlB,EAiBAttB,KAAK4wB,QAAU,SAAUC,GACxB,OAAKxC,UAAUrqB,QAEJonB,GAAYyF,IACtBzF,IAAayF,EACb5G,EAAWwF,YAAY3E,GAAe,IAEhCb,GALCmB,CAMT,EAgBAprB,KAAK8wB,QAAU,SAAUC,GACxBpwB,OAAOqwB,aAAa5G,GAEpB,IADA,IAAIrmB,EAAI+mB,EAAc9mB,OACfD,KACN+mB,EAAc/mB,GAAG+sB,QAAQC,GAM1B,OAJAnG,EAASU,UAAU2F,oBAAoB,SAAUtF,GACjDf,EAASU,UAAU2F,oBAAoB,SAAUtF,GACjD/B,EAAMsH,IAAI/G,GACVN,EAAI,EAAG,aAAeQ,EAAY,aAAe0G,EAAc,OAAS,SAAW,KAC5E,IACR,EAGA1F,IACOpB,CACR,EAGA,IAAIS,EAAqB,CACxBC,SAAU,CACTW,UAAW3qB,OACXwrB,UAAU,EACVmD,mBAAoB,CAAC,EACrBhC,SAAU,EACVzB,gBAAiB,MAMnBlC,EAAYM,WAAWkH,UAAY,SAAUC,EAAMC,GAClD3G,EAAmBC,SAASyG,GAAQC,CACrC,EAEA1H,EAAYM,WAAWY,OAAS,SAAUyG,GACzC,IAAIC,EAAWvxB,KACf2pB,EAAYM,WAAa,WAGxB,OAFAsH,EAASjD,MAAMtuB,KAAMquB,WACrBruB,KAAKwxB,OAAS5H,EAAMiB,OAAO,CAAC,EAAG7qB,MACxBsxB,EAAUhD,MAAMtuB,KAAMquB,YAAcruB,IAC5C,EACA4pB,EAAMiB,OAAOlB,EAAYM,WAAYsH,GACrC5H,EAAYM,WAAW1nB,UAAYgvB,EAAShvB,UAC5ConB,EAAYM,WAAW1nB,UAAUkvB,YAAc9H,EAAYM,UAC5D,EAyCAN,EAAYqF,MAAQ,SAAU9E,GAQ7B,IAwBCwH,EACAC,EAxBAtH,EAAY,oBACZuH,EAAqB,SACrBC,EAAqB,SACrBC,EAAoB,QACpBrH,EAAkBsH,EAAcpH,SAShCqE,EAAQhvB,KACR4qB,EAAWhB,EAAMiB,OAAO,CAAC,EAAGJ,EAAiBP,GAC7C8H,EAASJ,EACTK,EAAY,EACZC,EAAgB,CACf/kB,MAAO,EACPnF,IAAK,GAENmqB,EAAc,EACd/G,GAAW,EAQRC,EAAY,WACf,IAAK,IAAI/nB,KAAOsnB,EACVH,EAAgBjnB,eAAeF,KACnCumB,EAAI,EAAG,4BAA+BvmB,EAAM,YACrCsnB,EAAStnB,IAIlB,IAAK,IAAI8uB,KAAc3H,EACtB4H,EAAeD,GAGhBE,GACD,EAQIC,EAAa,CAAC,EA6OlBvyB,KAAKqvB,GAAK,SAAUmD,EAAOC,GAqB1B,OApBI7I,EAAM5iB,KAAK6oB,SAAS4C,IACvBD,EAAQA,EAAME,OAAOC,MAAM,MACrBxF,SAAQ,SAAUyF,GACvB,IACCC,EAAYD,EAASD,MAAM,KAC3BG,EAAYD,EAAU,GACtBE,EAAYF,EAAU,GACN,KAAbC,IACEP,EAAWO,KACfP,EAAWO,GAAa,IAEzBP,EAAWO,GAAW1D,KAAK,CAC1B2D,UAAWA,GAAa,GACxBN,SAAUA,IAGb,IAEA5I,EAAI,EAAG,sDAAwD2I,EAAQ,8BAEjExD,CACR,EAmBAhvB,KAAKwvB,IAAM,SAAUgD,EAAOC,GAC3B,OAAKD,IAILA,EAAQA,EAAME,OAAOC,MAAM,MACrBxF,SAAQ,SAAUyF,EAAUtvB,GACjC,IACCuvB,EAAYD,EAASD,MAAM,KAC3BG,EAAYD,EAAU,GACtBE,EAAYF,EAAU,IAAM,IACD,MAAdC,EAAoBhtB,OAAOC,KAAKwsB,GAAc,CAACO,IAClD3F,SAAQ,SAAUxgB,GAI5B,IAHA,IACCzC,EAAOqoB,EAAW5lB,IAAW,GAC7B5I,EAAImG,EAAKlG,OACHD,KAAK,CACX,IAAIivB,EAAW9oB,EAAKnG,IAChBivB,GAAaD,IAAcC,EAASD,WAA2B,MAAdA,GAAwBN,GAAYA,GAAYO,EAASP,UAC7GvoB,EAAKikB,OAAOpqB,EAAG,EAEjB,CACKmG,EAAKlG,eACFuuB,EAAW5lB,EAEpB,GACD,IACOqiB,IAzBNnF,EAAI,EAAG,uCACAmF,EAyBT,EAaAhvB,KAAKoQ,QAAU,SAAUghB,EAAM6B,GAC9B,GAAI7B,EAAM,CACT,IACCyB,EAAYzB,EAAKsB,OAAOC,MAAM,KAC9BG,EAAYD,EAAU,GACtBE,EAAYF,EAAU,GACtBK,EAAYX,EAAWO,GACxBjJ,EAAI,EAAG,eAAgBiJ,EAAWG,EAAO,KAAO,GAAIA,GAAQ,IACxDC,GACHA,EAAU/F,SAAQ,SAAU6F,EAAU1vB,GAChCyvB,GAAaA,IAAcC,EAASD,WACxCC,EAASP,SAASrE,KAAKY,EAAO,IAAIrF,EAAYgE,MAAMmF,EAAWE,EAASD,UAAW/D,EAAOiE,GAE5F,GAEF,MACCpJ,EAAI,EAAG,uCAER,OAAOmF,CACR,EAGAA,EACEK,GAAG,mBAAmB,SAAU5B,GACjB,aAAXA,EAAE0F,MAAkC,iBAAX1F,EAAE0F,OACf,mBAAX1F,EAAE0F,KACLC,IACqB,YAAX3F,EAAE0F,MACZnE,EAAMniB,SAGT,IACCwiB,GAAG,kBAAkB,SAAU5B,GAC/B4F,IACArE,EAAMniB,QACP,IAUD,IAAIgd,EAAM7pB,KAAKiuB,KAAO,SAAUX,EAAUY,GACrCtD,EAAS0C,UAAYA,IACxB3oB,MAAMpC,UAAU4rB,OAAOC,KAAKC,UAAW,EAAG,EAAG,IAAMhE,EAAY,QAC/DT,EAAMC,IAAIyE,MAAM3tB,OAAQ0tB,WAE1B,EAcAruB,KAAKkvB,MAAQ,SAAUD,GAqBtB,OApBMA,aAAsBtF,EAAYM,WAE7B0H,GAAe1C,IAErB0C,GACHA,EAAYpC,YAAYP,GAEzB2C,EAAc1C,EACdqD,IACAgB,GAAe,GACfF,GAA6B,GAC7BC,IACA1B,EAAYtB,KAAK,aAAatG,iBAAiB,SAAUwJ,GACzDtE,EAAWH,SAASE,GACpBA,EAAM5e,QAAQ,MAAO,CACpB6e,WAAY0C,IAEb9H,EAAI,EAAG,SAAWQ,EAAY,kBAC9B2E,EAAMniB,UAjBNgd,EAAI,EAAG,+EAmBDmF,CACR,EAiBAhvB,KAAK4wB,QAAU,SAAUC,GACxB,OAAKxC,UAAUrqB,QAEJonB,GAAYyF,IACtBzF,IAAayF,EACb7B,EAAMniB,QAAO,IAEPmiB,GALC5D,CAMT,EAcAprB,KAAK2M,OAAS,WACb,GAAIglB,EAAa,CAChBA,EAAYtB,KAAK,aAAaY,oBAAoB,SAAUsC,GAC5D,IAAIC,EAAY7B,EAChBA,OAAchvB,EACd6wB,EAAUjE,YAAYP,GACtBA,EAAM5e,QAAQ,UACdyZ,EAAI,EAAG,WAAaQ,EAAY,mBACjC,CACA,OAAO2E,CACR,EAeAhvB,KAAK8wB,QAAU,SAAU2C,GAOxB,OANAzE,EAAM5e,QAAQ,UAAW,CACxBqjB,MAAOA,IAERzE,EAAMriB,SACNqiB,EAAMQ,IAAI,OACV3F,EAAI,EAAG,aAAeQ,EAAY,aAAeoJ,EAAQ,OAAS,SAAW,KACtE,IACR,EAuBAzzB,KAAK6M,OAAS,SAAU6iB,GACvB,GAAIiC,EACH,GAAIjC,EACH,GAAIiC,EAAYf,WAAaxF,EAAU,CACtC,IAECsI,EADAzG,EAAY0E,EAAYtB,KAAK,aAI7BqD,EADG9I,EAAS+I,SAAW,GACR1G,EAAYiF,EAAc/kB,QAAU+kB,EAAclqB,IAAMkqB,EAAc/kB,OAEvE8f,GAAaiF,EAAc/kB,MAAQ,EAAI,EAGtD6hB,EAAM5e,QAAQ,SAAU,CACvBwjB,SAAU1B,EAAc/kB,MACxB0mB,OAAQ3B,EAAclqB,IACtBilB,UAAWA,IAGZ+B,EAAM8E,SAASJ,EAChB,MAAWK,GAAQ/B,IAAWH,GAC7BmC,GAAe,QAGhBrC,EAAYlC,YAAYT,GAAO,GAGjC,OAAOA,CACR,EAwBAhvB,KAAKisB,QAAU,WAId,OAHAqH,IACAF,IAEOpE,CACR,EAgDAhvB,KAAK8zB,SAAW,SAAUA,GACzB,GAAKzF,UAAUrqB,OAER,CACN,IACCiwB,GAAW,EACXC,EAAWlC,EACXvB,EAAkBkB,EAAcA,EAAYtB,KAAK,mBAAqB,SACtE8D,EAAmBvJ,EAASsC,SAAW4G,GAAY7B,EAyBpD,GAxB0B,IAAtBrH,EAAS+I,UAEZM,EAAWhC,GAAa6B,EAExB9B,EAAuB,IADvBC,EAAY6B,EAAW,GAAKK,EAAmB,EAAI,GACxBvC,EAAqBC,GAG5CiC,EAAW,GAAK9B,IAAWJ,GAAsBuC,GAEpDlC,EAAY,EACZD,EAASJ,EACTqC,GAAW,GACDH,GAAY,GAAKA,EAAW,GAAKK,GAC3ClC,EAAY6B,EACZ9B,EAASH,EACToC,GAAW,GACDH,GAAY,GAAK9B,IAAWF,GACtCG,EAAY,EACZD,EAASF,EACTmC,GAAW,GACDjC,IAAWH,GAAuBsC,GAC5CH,IAGEC,EAAU,CAEb,IACCG,EAAY,CACXN,SAAU7B,EACVoC,MAAOrC,EACPvB,gBAAiBA,GAElB6D,EAAetC,GAAUkC,EAEtB9jB,EAAU,SAAUmkB,GACvBvF,EAAM5e,QAAQmkB,EAAWH,EAC1B,EAEIE,GACCJ,IAAarC,IAChBzhB,EAAQ,SACRA,EAAQ8jB,IAAatC,EAAqB,QAAU,QAGtDxhB,EAAQ,YACJkkB,GACCtC,IAAWH,IACdzhB,EAAQ4hB,IAAWJ,EAAqB,QAAU,OAClDxhB,EAAQ,SAGX,CAEA,OAAO4e,CACR,CA7DC,OAAOiD,CA8DT,EAaA,IAyZC8B,EACAS,EA1ZGnB,EAAqB,WACxBnB,EAAgB,CACf/kB,MAAOglB,EAAcvH,EAASsF,QAE3ByB,GAAe/G,EAAS6J,iBAE3BvC,EAAc/kB,OAASwkB,EAAYtB,KAAK,QAAUzF,EAAS8J,aAE5DxC,EAAclqB,IAAMkqB,EAAc/kB,MAAQyd,EAAS+I,QACpD,EAYIL,EAAiB,SAAUqB,GAE9B,GAAIjD,EAAuB,CAC1B,IAAIkD,EAAU,WACVC,EAAaD,EAASlD,EAAsBtD,KAAKY,MAAY2F,IAChE3F,EAAM5e,QAAQ,SAAU,CACvB+iB,KAAMyB,EACNE,OAAQlK,EAASgK,KAElB5F,EAAM5e,QAAQ,QAAS,CACtB2kB,OAAQH,IAGX,CACD,EAcIxB,EAA+B,SAAUuB,GAC5C,IACCK,EAAa,EACbC,EAAQrK,EAAS6J,eAClB,GAAI9C,IAAgBsD,GAAS9C,EAAc,GAAI,CAC9C,GAAI8C,EACH,GAAIA,EAAMlF,WAAY,CAOrB,IANA,IACCmF,EAAiBvD,EAAYtB,OAC7BJ,EAAkBrG,EAAMvf,IAAI6lB,OAAOgF,EAAe5J,WAClD5oB,EAAQwyB,EAAe/I,SAAW,MAAQ,OAGpC8I,EAAMlF,WAAWC,aAAahG,IACpCiL,EAAQA,EAAMlF,WAGf,IAAII,EAAgBvG,EAAMvf,IAAI6lB,OAAO+E,GAEhCC,EAAexE,aACnBT,EAAgBvtB,IAAUivB,EAAY1E,aAGvC+H,EAAa7E,EAAcztB,GAASutB,EAAgBvtB,EAErD,MACCmnB,EAAI,EAAG,yEAAqElnB,GAC5EqsB,EAAMyF,oBAAe9xB,GAIvB,IAAIwyB,EAAUH,GAAc7C,EAC5BA,EAAc6C,EACVG,IAAYR,GACf3F,EAAM5e,QAAQ,QAAS,CACtB2kB,OAAQ,0BAGX,CACD,EAMIxB,EAAoB,SAAU9F,GAC7B7C,EAAS8J,YAAc,GAC1B1F,EAAM5e,QAAQ,QAAS,CACtB2kB,OAAQ,mBAGX,EAGIK,EAAYxL,EAAMiB,OAAOkH,EAAcsD,SAAU,CAEpD1B,SAAU,SAAU2B,GACnB,GAAI1L,EAAM5iB,KAAKuB,OAAO+sB,IAAQA,EAAIpyB,MAAM,kBAAmB,CAE1D,IAAIqyB,EAAOjtB,WAAWgtB,GAAO,IAC7BA,EAAM,WACL,OAAO3D,EAAcA,EAAYtB,KAAK,QAAUkF,EAAO,CACxD,CACD,CACA,GAAI3L,EAAM5iB,KAAK6oB,SAASyF,GAAM,CAE7B5D,EAAwB4D,EACxB,IACCA,EAAMhtB,WAAWopB,EAAsBtD,KAAKY,GAC7C,CAAE,MAAOvB,GACR6H,GAAO,CACR,CACD,CAGA,GADAA,EAAMhtB,WAAWgtB,IACZ1L,EAAM5iB,KAAK8kB,OAAOwJ,IAAQA,EAAM,EACpC,MAAI5D,GACHA,OAAwB/uB,EAClB,CAAC,mEAAsE2yB,IAEvE,CAAC,uCAA0CA,GAGnD,OAAOA,CACR,IAOGhD,EAAiB,SAAUkD,IAC9BA,EAAQnH,UAAUrqB,OAAS,CAACwxB,GAAS1vB,OAAOC,KAAKqvB,IAC3CjI,SAAQ,SAAUiF,EAAY9uB,GACnC,IAAIC,EACJ,GAAI6xB,EAAUhD,GACb,IACC7uB,EAAQ6xB,EAAUhD,GAAYxH,EAASwH,GACxC,CAAE,MAAO3E,GACRlqB,EAAQknB,EAAgB2H,GACxB,IAAIqD,EAAS7L,EAAM5iB,KAAKuB,OAAOklB,GAAK,CAACA,GAAKA,EACtC7D,EAAM5iB,KAAKrC,MAAM8wB,IACpBA,EAAO,GAAK,UAAYA,EAAO,GAC/BA,EAAOC,QAAQ,GACf7L,EAAIyE,MAAMtuB,KAAMy1B,IAEhB5L,EAAI,EAAG,4DAA8DuI,EAAa,KAAM3E,EAAEkI,QAE5F,CAAE,QACD/K,EAASwH,GAAc7uB,CACxB,CAEF,GACD,EAMIsxB,EAAe,SAAUD,EAASE,GACrC,IACCK,GAAU,EACVS,EAAShL,EAASgK,GAMnB,OALIhK,EAASgK,IAAYE,IACxBlK,EAASgK,GAAWE,EACpBxC,EAAesC,GACfO,EAAUS,GAAUhL,EAASgK,IAEvBO,CACR,EAGI9C,EAAiB,SAAUD,GACzBpD,EAAMoD,KACVpD,EAAMoD,GAAc,SAAUyD,GAC7B,OAAKxH,UAAUrqB,QAGK,aAAfouB,IACHV,OAAwB/uB,GAErBkyB,EAAazC,EAAYyD,KAC5B7G,EAAM5e,QAAQ,SAAU,CACvB+iB,KAAMf,EACN0C,OAAQlK,EAASwH,KAEdL,EAAc+D,OAAO3G,QAAQiD,IAAe,GAC/CpD,EAAM5e,QAAQ,QAAS,CACtB2kB,OAAQ3C,KAKLpD,GAjBCpE,EAASwH,EAkBlB,EAEF,EAgJApyB,KAAKivB,WAAa,WACjB,OAAO0C,CACR,EAWA3xB,KAAKq0B,MAAQ,WACZ,OAAOrC,CACR,EAeAhyB,KAAK6uB,aAAe,WACnB,OAAOqD,EAAc/kB,KACtB,EAWAnN,KAAK+1B,gBAAkB,WACtB,IAAIrJ,EAAM9B,EAASsF,OAWnB,OAVIyB,IAEC/G,EAAS6J,eAEZ/H,GAAOyF,EAGPzF,GAAOiF,EAAYtB,KAAK,QAAUrB,EAAM0F,eAGnChI,CACR,EAOAsC,EACEK,GAAG,kBAAkB,SAAU5B,GAC/B,IAAIuI,EAA+B,aAAbvI,EAAEsH,QACnB/C,IAAWF,GAAqBkE,GAAqBhE,IAAWH,GAA4C,IAAtBjH,EAAS+I,WAEnGK,IAEGgC,GACHC,GAEF,IACC5G,GAAG,qBAAqB,SAAU5B,GAClCuG,GACD,IACC3E,GAAG,gBAAgB,SAAU5B,GAC7BwI,GACD,IACC5G,GAAG,oBAAoB,SAAU5B,GACjCuB,EAAMkH,UAAUzI,EAAEgG,MACnB,IAKD,IAAIO,EAAiB,SAAUmC,GAC9B,GAAIpC,GAAQpC,EAAa,CACxB,IACCyE,EAAgBzE,EAAYtB,OAC5BgG,EAAY7B,EAAY8B,OAAOC,WAEhC,GAAKJ,GAAcnE,IAAWH,EA0BvB,CAEN,IACC2E,EAAS,CACRC,SAAUjC,EAAYkC,OAAS,WAAa,WAC5CC,IAAK,EACLC,KAAM,GAEPC,EAASjN,EAAMkN,IAAIT,EAAW,aAAeG,EAAOC,SAEhDjC,EAAYuC,cAENnM,EAAS+I,SAAW,IAC1B3B,IAAWF,GAAkF,IAA7DxpB,WAAWshB,EAAMkN,IAAItC,EAAY8B,OAAQ,iBAElEtE,IAAWJ,GAAsF,IAAhEtpB,WAAWshB,EAAMkN,IAAItC,EAAY8B,OAAQ,sBADpFO,GAAS,GAHVL,EAAOJ,EAAcjK,SAAW,MAAQ,QAAUvB,EAAS+I,SAAW1B,EASvErI,EAAMkN,IAAIT,EAAWG,GACjBK,GAEHZ,GAEF,KAnDkD,CAET,SAApCrM,EAAMkN,IAAIT,EAAW,cAExBzM,EAAMkN,IAAIT,EAAW,CACpB,SAAY,UAGbJ,KAGD,IACCe,EAAWpN,EAAMvf,IAAI6lB,OAAOsE,EAAY8B,QAAQ,GAChDW,EAAiBrM,EAASsC,SAAiC,IAAtBtC,EAAS+I,SAC9CyC,EAAcnJ,UAAYiF,EAAc/kB,MAExC+pB,KAAKC,MAAMlF,EAAYrH,EAAS+I,SAAW,IAAM,GAGlDqD,EAASZ,EAAcjK,SAAW,MAAQ,SAAW8K,EAGrDrN,EAAMkN,IAAItC,EAAY8B,OAAOC,WAAY,CACxCI,IAAKK,EAASL,IACdC,KAAMI,EAASJ,MAEjB,CA0BD,CACD,EAOIX,EAAsB,WACzB,GAAIlC,GAAQpC,GAAe6C,EAAYkC,OAAQ,CAC9C,IAGCU,EAAUpF,IAAWH,EACrB1F,EAAWwF,EAAYtB,KAAK,YAC5BgG,EAAY7B,EAAY8B,OAAOC,WAC/Bc,EAAiBzN,EAAM0N,qBAAqB1N,EAAMkN,IAAItC,EAAY8B,OAAQ,YAC1EQ,EAAM,CAAC,EAIJtC,EAAY+C,QAAQhL,OAASiI,EAAY+C,QAAQC,cAChDJ,EACHxN,EAAMkN,IAAI/C,EAAM,CACf,MAASnK,EAAMvf,IAAIkiB,MAAMiI,EAAY8B,UAGtC1M,EAAMkN,IAAI/C,EAAM,CACf,MAAS,UAKX+C,EAAI,aAAelN,EAAMvf,IAAIkiB,MAAMJ,EAAW4H,EAAOsC,GAAW,GAAM,GACtES,EAAIvK,MAAQ6K,EAASN,EAAI,aAAe,QAErCtC,EAAY+C,QAAQjL,OACnB8K,EAEHxN,EAAMkN,IAAI/C,EAAM,CACf,OAAUnK,EAAMvf,IAAIiiB,OAAOkI,EAAY8B,SAAW9B,EAAYuC,cAAgBnM,EAAS+I,SAAW,KAGnG/J,EAAMkN,IAAI/C,EAAM,CACf,OAAU,UAKZ+C,EAAI,cAAgBlN,EAAMvf,IAAIiiB,OAAOH,EAAWkK,EAAYtC,GAAM,GAAOsD,GACzEP,EAAIxK,OAAS8K,EAASN,EAAI,cAAgB,QAIvCtC,EAAYuC,gBACfD,EAAI,WAAa3K,EAAW,MAAQ,SAAWvB,EAAS+I,SAAW1B,EACnE6E,EAAI,WAAa3K,EAAW,SAAW,UAAYvB,EAAS+I,UAAY,EAAI1B,IAE7ErI,EAAMkN,IAAItC,EAAY8B,OAAQQ,EAC/B,CACD,EAQIW,EAAuB,WACtB9F,GAAeoC,GAAQ/B,IAAWH,IAAuBF,EAAYtB,KAAK,eAC7E2D,GAEF,EAQI0D,EAA0B,WACzB/F,GAAeoC,GAClB/B,IAAWH,KAER2C,EAAY+C,QAAQhL,OAASiI,EAAY+C,QAAQC,gBAAkB5N,EAAMvf,IAAIkiB,MAAM5rB,SAAWipB,EAAMvf,IAAIkiB,MAAMiI,EAAY8B,OAAOvG,aAClIyE,EAAY+C,QAAQjL,QAAU1C,EAAMvf,IAAIiiB,OAAO3rB,SAAWipB,EAAMvf,IAAIiiB,OAAOkI,EAAY8B,OAAOvG,cAGhGkG,GAEF,EAOI0B,EAAsB,SAAUlK,GAC/BkE,GAAeoC,GAAQ/B,IAAWH,IAAuBF,EAAYtB,KAAK,gBAC7E5C,EAAEmK,iBACFjG,EAAYlF,cAAckF,EAAYtB,KAAK,eAAiB5C,EAAEoK,YAAcpK,EAAEkE,EAAYtB,KAAK,YAAc,cAAgB,gBAAkB,GAAiB,IAAX5C,EAAEqK,SAEzJ,EAwBA93B,KAAK+3B,OAAS,SAAUC,EAASC,GAChC,IACCC,EAAkB,CACjBnB,eAAe,EACfoB,YAAa,0BAEXC,EAA2BH,GAAYA,EAASz0B,eAAe,iBAKnE,GAJAy0B,EAAWrO,EAAMiB,OAAO,CAAC,EAAGqN,EAAiBD,KAG7CD,EAAUpO,EAAMvf,IAAIkhB,SAASyM,GAAS,IAGrC,OADAnO,EAAI,EAAG,kEACAmF,EACD,GAAuC,UAAnCpF,EAAMkN,IAAIkB,EAAS,YAE7B,OADAnO,EAAI,EAAG,iGACAmF,EAGR,GAAI+E,EAAM,CACT,GAAIA,IAASiE,EAEZ,OAAOhJ,EAGPA,EAAMkH,WAGR,CAGA,IACCmC,GAHDtE,EAAOiE,GAGejI,WAAWuI,MAAMC,QACtCC,EAAe,CAAC,MAAO,OAAQ,SAAU,QAAS,SAAU,aAAc,cAAe,YAAa,gBAEvGzE,EAAKhE,WAAWuI,MAAMC,QAAU,OAChC,IACC7B,EAAwC,YAA/B9M,EAAMkN,IAAI/C,EAAM,YACzB0E,EAAS7O,EAAMkN,IAAI/C,EAAMyE,EAAaE,OAAO,CAAC,aAC9CC,EAAU/O,EAAMkN,IAAI/C,EAAM,CAAC,QAAS,WACrCA,EAAKhE,WAAWuI,MAAMC,QAAUF,GAE3B3B,GAAUuB,EAASlB,gBACvBlN,EAAI,EAAG,2FACPoO,EAASlB,eAAgB,GAE1Bp2B,OAAOqrB,YAAW,WACb+H,GAA8B,IAAtBnJ,EAAS+I,UAAkByE,GAA4BH,EAASlB,eAC3ElN,EAAI,EAAG,4BAA4B,EAAM,2CAE3C,GAAG,GAGH,IACCyM,EAASvC,EAAKhE,WAAW6I,aAAapN,SAASqN,cAAc,OAAQ9E,GACrE+E,EAAYlP,EAAMiB,OAAO4N,EAAQ,CAChChC,SAAUC,EAAS,WAAa,WAChCqC,UAAW,cACXC,aAAc,cACdC,gBAAiB,gBAuBnB,GApBKvC,GACJ9M,EAAMiB,OAAOiO,EAAWlP,EAAMkN,IAAI/C,EAAM,CAAC,QAAS,YAGnDnK,EAAMkN,IAAIR,EAAQwC,GAClBxC,EAAO4C,aAAalP,EAAsB,IAC1CJ,EAAMuP,SAAS7C,EAAQ2B,EAASE,aAGhC3D,EAAc,CACb8B,OAAQA,EACRiB,QAAS,CACRhL,MAAmC,MAA5BoM,EAAQpM,MAAMO,OAAO,GAC5BR,OAAqC,MAA7BqM,EAAQrM,OAAOQ,OAAO,GAC9B0K,cAAiC,SAAlBmB,EAAQpM,OAAoBmK,GAAU9M,EAAM0N,qBAAqBmB,EAAOF,UAExFxB,cAAekB,EAASlB,cACxBL,OAAQA,IAGJ3C,EAAKqF,aAAc,CACvBrF,EAAKqF,aAAe,CAAC,EACrB,IACCC,EAAetF,EAAKuE,MACPE,EAAaE,OAAO,CAAC,QAAS,SAAU,WAAY,YAAa,eAAgB,oBACpFvL,SAAQ,SAAUmI,GAC5BvB,EAAKqF,aAAa9D,GAAO+D,EAAa/D,IAAQ,EAC/C,GACD,CA+CA,OA5CId,EAAY+C,QAAQhL,OACvB3C,EAAMkN,IAAIR,EAAQ,CACjB/J,MAAOoM,EAAQpM,QAGbiI,EAAY+C,QAAQjL,QACvB1C,EAAMkN,IAAIR,EAAQ,CACjBhK,OAAQqM,EAAQrM,SAKlBgK,EAAOgD,YAAYvF,GAEnBnK,EAAMkN,IAAI/C,EAAM,CACf0C,SAAUC,EAAS,WAAa,WAChC6C,OAAQ,OACR5C,IAAK,OACLC,KAAM,OACN4C,OAAQ,OACRC,MAAO,UAGJjF,EAAY+C,QAAQhL,OAASiI,EAAY+C,QAAQC,gBACpD5N,EAAMkN,IAAI/C,EAAM,CACfgF,UAAW,aACXC,aAAc,aACdC,gBAAiB,eAKnBt4B,OAAOopB,iBAAiB,SAAU0N,GAClC92B,OAAOopB,iBAAiB,SAAU0N,GAClC92B,OAAOopB,iBAAiB,SAAU2N,GAElC3D,EAAKhK,iBAAiB,aAAc4N,GACpC5D,EAAKhK,iBAAiB,iBAAkB4N,GAExC9N,EAAI,EAAG,aAGPmK,IAEOhF,CACR,EAeAhvB,KAAKk2B,UAAY,SAAUzC,GAC1B,GAAIM,EAAM,CAIT,GAHI/B,IAAWH,GACdmC,GAAe,GAEZP,IAAU9B,EAAa,CAC1B,IAAI0E,EAAY7B,EAAY8B,OAAOC,WACnC,GAAIF,EAAUrG,aAAahG,GAAuB,CACjD,IACCsO,EAAQ9D,EAAY8B,OAAOgC,MAE3BoB,EAAU,CAAC,EADF,CAAC,SAAU,aAAc,cAAe,YAAa,gBAExDvM,SAAQ,SAAUmI,GACxBoE,EAAQpE,GAAOgD,EAAMhD,IAAQ,EAC9B,IACA1L,EAAMkN,IAAIT,EAAWqD,EACtB,CACAlF,EAAY8B,OAAOvG,WAAW6I,aAAavC,EAAW7B,EAAY8B,QAClE9B,EAAY8B,OAAOvG,WAAW4J,YAAYnF,EAAY8B,QACjDvC,EAAKhE,WAAWC,aAAahG,KAEjCJ,EAAMkN,IAAI/C,EAAMA,EAAKqF,qBACdrF,EAAKqF,aAEd,CACAz4B,OAAOswB,oBAAoB,SAAUwG,GACrC92B,OAAOswB,oBAAoB,SAAUwG,GACrC92B,OAAOswB,oBAAoB,SAAUyG,GACrC3D,EAAK9C,oBAAoB,aAAc0G,GACvC5D,EAAK9C,oBAAoB,iBAAkB0G,GAC3C5D,OAAOpxB,EACPknB,EAAI,EAAG,wBAA0B4J,EAAQ,OAAS,SAAW,IAC9D,CACA,OAAOzE,CACR,EAGA,IACC4K,EACAC,EAAiB,GAuElB,OArEA7K,EACEK,GAAG,oBAAoB,SAAU5B,GACjCuB,EAAM8K,kBAAkBrM,EAAEgG,MAC3B,IAkBDzzB,KAAK+5B,eAAiB,SAAU/B,EAASgC,GACxC,IAAIC,EAAQrQ,EAAMvf,IAAIkhB,SAASyM,GAC/B,OAAqB,IAAjBiC,EAAMj2B,QAAiB4lB,EAAM5iB,KAAKuB,OAAOyxB,IAIzCH,EAAe71B,OAAS,GAE3BgrB,EAAM8K,oBAEPF,EAAcI,EACdH,EAAiBI,EACjBjL,EAAMK,GAAG,6CAA6C,SAAU5B,GAC/D,IAAIyM,EAAoB,UAAXzM,EAAEzmB,KAAmB4iB,EAAMuP,SAAWvP,EAAMuQ,YACzDN,EAAe1M,SAAQ,SAAU2C,EAAMxsB,GACtC42B,EAAOpK,EAAM8J,EACd,GACD,IACO5K,IAfNnF,EAAI,EAAG,qDAAwE,IAAjBoQ,EAAMj2B,OAAe,UAAY,WAAa,cACrGgrB,EAeT,EAeAhvB,KAAK85B,kBAAoB,SAAUrG,GASlC,OARIA,GACHoG,EAAe1M,SAAQ,SAAU2C,EAAMxsB,GACtCsmB,EAAMuQ,YAAYrK,EAAM8J,EACzB,IAED5K,EAAMQ,IAAI,2CACVoK,OAAcj3B,EACdk3B,EAAiB,GACV7K,CACR,EAGA3D,IACO2D,CACR,EAGA,IAAI+C,EAAgB,CACnBpH,SAAU,CACTgJ,SAAU,EACVzD,OAAQ,EACRuE,oBAAgB9xB,EAChB+xB,YAAa,GACbxH,SAAS,EACTI,SAAU,GAEX+H,SAAU,CACTnF,OAAQ,SAAUoF,GAEjB,GADAA,EAAMhtB,WAAWgtB,IACZ1L,EAAM5iB,KAAK8kB,OAAOwJ,GACtB,KAAM,CAAC,qCAAwCA,GAEhD,OAAOA,CACR,EACAb,eAAgB,SAAUa,GAEzB,GADAA,EAAMA,QAAO3yB,EACJ,CACR,IAAImtB,EAAOlG,EAAMvf,IAAIkhB,SAAS+J,GAAK,GACnC,IAAIxF,IAAQA,EAAKC,WAGhB,KAAM,CAAC,4DAA+DuF,GAFtEA,EAAMxF,CAIR,CACA,OAAOwF,CACR,EACAZ,YAAa,SAAUY,GACtB,IAAI8E,EAAY,CACf,SAAY,GACZ,QAAW,EACX,QAAW,GAEZ,GAAIxQ,EAAM5iB,KAAK8kB,OAAOwJ,GACrBA,EAAM4B,KAAKmD,IAAI,EAAGnD,KAAKoD,IAAIhyB,WAAWgtB,GAAM,QACtC,MAAIA,KAAO8E,GAGjB,KAAM,CAAC,2CAA8C9E,GAFrDA,EAAM8E,EAAU9E,EAGjB,CACA,OAAOA,CACR,EACApI,QAAS,SAAUoI,GAClB,QAASA,CACV,EACAhI,SAAU,SAAUgI,GAEnB,GADAA,EAAMjtB,SAASitB,IACV1L,EAAM5iB,KAAK8kB,OAAOwJ,IAAQA,EAAM,GAAKA,EAAM,EAC/C,KAAM,CAAC,uCAA0CA,GAElD,OAAOA,CACR,GAEDQ,OAAQ,CAAC,WAAY,SAAU,gBAMhCnM,EAAYqF,MAAMmC,UAAY,SAAUC,EAAMC,EAAckJ,EAAoBzE,GACzE1E,KAAQW,EAAcpH,SAO3BhB,EAAYC,MAAMC,IAAI,EAAG,0DAA4DuH,EAAO,kCAN5FW,EAAcpH,SAASyG,GAAQC,EAC/BU,EAAcsD,SAASjE,GAAQmJ,EAC3BzE,GACH/D,EAAc+D,OAAO1G,KAAKgC,GAK7B,EAGAzH,EAAYqF,MAAMnE,OAAS,SAAUyG,GACpC,IAAIC,EAAWvxB,KACf2pB,EAAYqF,MAAQ,WAGnB,OAFAuC,EAASjD,MAAMtuB,KAAMquB,WACrBruB,KAAKwxB,OAAS5H,EAAMiB,OAAO,CAAC,EAAG7qB,MACxBsxB,EAAUhD,MAAMtuB,KAAMquB,YAAcruB,IAC5C,EACA4pB,EAAMiB,OAAOlB,EAAYqF,MAAOuC,GAChC5H,EAAYqF,MAAMzsB,UAAYgvB,EAAShvB,UACvConB,EAAYqF,MAAMzsB,UAAUkvB,YAAc9H,EAAYqF,KACvD,EAUArF,EAAYgE,MAAQ,SAAU3mB,EAAM+rB,EAAWyH,EAAQvH,GAEtD,IAAK,IAAI3vB,KADT2vB,EAAOA,GAAQ,CAAC,EAEfjzB,KAAKsD,GAAO2vB,EAAK3vB,GAMlB,OAJAtD,KAAKgH,KAAOA,EACZhH,KAAKw6B,OAASx6B,KAAKy6B,cAAgBD,EACnCx6B,KAAK+yB,UAAYA,GAAa,GAC9B/yB,KAAK06B,UAAY16B,KAAK26B,UAAY/3B,KAAKg4B,MAChC56B,IACR,EAMA,IAAI4pB,EAAQD,EAAYC,MAAS,SAAUjpB,GAC1C,IACCoD,EADG82B,EAAI,CAAC,EAULC,EAAW,SAAUC,GACxB,OAAOzyB,WAAWyyB,IAAW,CAC9B,EAEIC,EAAoB,SAAUlL,GACjC,OAAOA,EAAKmL,aAAenL,EAAKmL,aAAet6B,EAAOu6B,iBAAiBpL,EACxE,EAGIqL,EAAa,SAAUC,EAAOtL,EAAMuL,EAAOC,GAE9C,IADAxL,EAAQA,IAAStE,SAAY7qB,EAASmvB,KACzBnvB,EACZ26B,GAAgB,OACV,IAAKC,EAAMC,WAAW1L,GAC5B,OAAO,EAERsL,EAAQA,EAAMK,OAAO,GAAG50B,cAAgBu0B,EAAMM,OAAO,GAAGC,cACxD,IAAIC,GAAaP,EAAQvL,EAAK,SAAWsL,IAAUtL,EAAK,QAAUsL,GAAStL,EAAK,SAAWsL,IAAUtL,EAAK,QAAUsL,KAAW,EAC/H,GAAIC,GAASC,EAAe,CAC3B,IAAIhD,EAAQ0C,EAAkBlL,GAC9B8L,GAAuB,WAAVR,EAAqBN,EAASxC,EAAMuD,WAAaf,EAASxC,EAAMwD,cAAgBhB,EAASxC,EAAMyD,YAAcjB,EAASxC,EAAM0D,YAC1I,CACA,OAAOJ,CACR,EAEIK,EAAa,SAAU7zB,GAC1B,OAAOA,EAAIlI,QAAQ,mBAAoB,MAAMA,QAAQ,aAAa,SAAUg8B,GAC3E,OAAOA,EAAE,GAAGr1B,aACb,GACD,EASAg0B,EAAEhQ,OAAS,SAAU9hB,GAEpB,IADAA,EAAMA,GAAO,CAAC,EACThF,EAAI,EAAGA,EAAIsqB,UAAUrqB,OAAQD,IACjC,GAAKsqB,UAAUtqB,GAGf,IAAK,IAAIT,KAAO+qB,UAAUtqB,GACrBsqB,UAAUtqB,GAAGP,eAAeF,KAC/ByF,EAAIzF,GAAO+qB,UAAUtqB,GAAGT,IAI3B,OAAOyF,CACR,EAGA8xB,EAAEvD,qBAAuB,SAAUlvB,GAClC,MAAO,CAAC,QAAS,OAAQ,YAAa,QAAS,eAAe+mB,QAAQ/mB,IAAQ,CAC/E,EAIA,IACC+zB,EAAW,EACXC,EAAU,CAAC,KAAM,MAAO,SAAU,KAC/BC,EAAyB17B,EAAO27B,sBAChCC,EAAwB57B,EAAO67B,qBAEnC,IAAKz4B,EAAI,GAAIs4B,GAA0Bt4B,EAAIq4B,EAAQp4B,SAAUD,EAC5Ds4B,EAAyB17B,EAAOy7B,EAAQr4B,GAAK,yBAC7Cw4B,EAAwB57B,EAAOy7B,EAAQr4B,GAAK,yBAA2BpD,EAAOy7B,EAAQr4B,GAAK,+BAIvFs4B,IACJA,EAAyB,SAAU5J,GAClC,IACCgK,GAAW,IAAI75B,MAAOkE,UACtB41B,EAAaxF,KAAKmD,IAAI,EAAG,IAAMoC,EAAWN,IAC1CQ,EAAKh8B,EAAOqrB,YAAW,WACtByG,EAASgK,EAAWC,EACrB,GAAGA,GAEJ,OADAP,EAAWM,EAAWC,EACfC,CACR,GAEIJ,IACJA,EAAwB,SAAUI,GACjCh8B,EAAOqwB,aAAa2L,EACrB,GAED9B,EAAErN,IAAM6O,EAAuBO,KAAKj8B,GACpCk6B,EAAE3J,IAAMqL,EAAsBK,KAAKj8B,GAEnC,IACCk8B,EAAY,CAAC,QAAS,OAAQ,OAC9BC,EAAUn8B,EAAOm8B,SAAW,CAAC,EAI9B,IAFAA,EAAQjT,IAAMiT,EAAQjT,KAAO,WAAa,EAErC9lB,EAAI,EAAGA,EAAI84B,EAAU74B,OAAQD,IAAK,CACtC,IAAIg5B,EAASF,EAAU94B,GAClB+4B,EAAQC,KACZD,EAAQC,GAAUD,EAAQjT,IAE5B,CACAgR,EAAEhR,IAAM,SAAUyD,IACbA,EAAWuP,EAAU74B,QAAUspB,GAAY,KAAGA,EAAWuP,EAAU74B,QACvE,IAAI42B,EAAM,IAAIh4B,KACbo6B,GAAQ,IAAMpC,EAAIqC,YAAYnQ,OAAO,GAAK,KAAO,IAAM8N,EAAIsC,cAAcpQ,OAAO,GAAK,KAAO,IAAM8N,EAAIuC,cAAcrQ,OAAO,GAAK,KAAO,KAAO8N,EAAIwC,mBAAmBtQ,OAAO,GAC5KiQ,EAASF,EAAUvP,EAAW,GAC9B+P,EAAO14B,MAAMpC,UAAU4rB,OAAOC,KAAKC,UAAW,GAC9CiP,EAAOzN,SAASttB,UAAUq6B,KAAKxO,KAAK0O,EAAQC,GAASD,GACtDO,EAAK3H,QAAQsH,GACbM,EAAKhP,MAAMwO,EAASO,EACrB,EAQA,IAAI9B,EAAQV,EAAE7zB,KAAO,SAAUu2B,GAC9B,OAAOz3B,OAAOvD,UAAUO,SAASsrB,KAAKmP,GAAGr9B,QAAQ,oBAAqB,MAAMy7B,aAC7E,EACAJ,EAAMhzB,OAAS,SAAUg1B,GACxB,MAAoB,WAAbhC,EAAMgC,EACd,EACAhC,EAAM1L,SAAW,SAAU0N,GAC1B,MAAoB,aAAbhC,EAAMgC,EACd,EACAhC,EAAM52B,MAAQ,SAAU44B,GACvB,OAAO54B,MAAMC,QAAQ24B,EACtB,EACAhC,EAAMzP,OAAS,SAAUyR,GACxB,OAAQhC,EAAM52B,MAAM44B,IAAOA,EAAIj1B,WAAWi1B,GAAK,GAAM,CACtD,EACAhC,EAAMC,WAAa,SAAUgC,GAC5B,MACwB,iBAAhBC,aAAmD,mBAAhBA,YAA6BD,aAAaC,aAAeD,aAAaE,WAChHF,GAAkB,iBAANA,GAAwB,OAANA,GAA6B,IAAfA,EAAEG,UAAwC,iBAAfH,EAAEI,QAE3E,EAQA,IAAIC,EAAOhD,EAAExwB,IAAM,CAAC,EAsGpB,OArGAwzB,EAAKtS,SAAW,SAAUuS,GACzB,IAAIC,EAAM,GACV,GAAIxC,EAAMhzB,OAAOu1B,GAChB,IACCA,EAAWtS,SAASwS,iBAAiBF,EACtC,CAAE,MAAOrQ,GACR,OAAOsQ,CACR,CAED,GAAwB,aAApBxC,EAAMuC,IAA4BvC,EAAM52B,MAAMm5B,IAAaA,aAAoBG,SAClF,IAAK,IAAIl6B,EAAI,EAAGm6B,EAAMH,EAAI/5B,OAAS85B,EAAS95B,OAAQD,EAAIm6B,EAAKn6B,IAAK,CACjE,IAAI+rB,EAAOgO,EAAS/5B,GACpBg6B,EAAIh6B,GAAKw3B,EAAMC,WAAW1L,GAAQA,EAAO+N,EAAKtS,SAASuE,EACxD,MACUyL,EAAMC,WAAWsC,IAAaA,IAAatS,UAAYsS,IAAan9B,KAC9Eo9B,EAAM,CAACD,IAER,OAAOC,CACR,EAEAF,EAAKzR,UAAY,SAAU0D,GAC1B,OAAQA,GAAkC,iBAAnBA,EAAK1D,UAA0B0D,EAAK1D,UAAYzrB,EAAOw9B,aAAe,CAC9F,EAEAN,EAAKxR,WAAa,SAAUyD,GAC3B,OAAQA,GAAmC,iBAApBA,EAAKzD,WAA2ByD,EAAKzD,WAAa1rB,EAAOy9B,aAAe,CAChG,EAEAP,EAAKtR,MAAQ,SAAUuD,EAAMuL,EAAOC,GACnC,OAAOH,EAAW,QAASrL,EAAMuL,EAAOC,EACzC,EAEAuC,EAAKvR,OAAS,SAAUwD,EAAMuL,EAAOC,GACpC,OAAOH,EAAW,SAAUrL,EAAMuL,EAAOC,EAC1C,EAGAuC,EAAK3N,OAAS,SAAUJ,EAAMuO,GAC7B,IAAInO,EAAS,CACZyG,IAAK,EACLC,KAAM,GAEP,GAAI9G,GAAQA,EAAKwO,sBAAuB,CACvC,IAAIC,EAAOzO,EAAKwO,wBAChBpO,EAAOyG,IAAM4H,EAAK5H,IAClBzG,EAAO0G,KAAO2H,EAAK3H,KACdyH,IACJnO,EAAOyG,KAAOkH,EAAKzR,YACnB8D,EAAO0G,MAAQiH,EAAKxR,aAEtB,CACA,OAAO6D,CACR,EAQA2K,EAAE1B,SAAW,SAAUrJ,EAAM0O,GACxBA,IACC1O,EAAK2O,UACR3O,EAAK2O,UAAUC,IAAIF,GAEnB1O,EAAK6O,WAAa,IAAMH,EAE3B,EACA3D,EAAEV,YAAc,SAAUrK,EAAM0O,GAC3BA,IACC1O,EAAK2O,UACR3O,EAAK2O,UAAU9xB,OAAO6xB,GAEtB1O,EAAK6O,UAAY7O,EAAK6O,UAAUz+B,QAAQ,IAAI0+B,OAAO,UAAYJ,EAAU7L,MAAM,KAAKrtB,KAAK,KAAO,UAAW,MAAO,KAErH,EAIAu1B,EAAE/D,IAAM,SAAUhH,EAAM5F,GACvB,GAAIqR,EAAMhzB,OAAO2hB,GAChB,OAAO8Q,EAAkBlL,GAAMmM,EAAW/R,IACpC,GAAIqR,EAAM52B,MAAMulB,GAAU,CAChC,IACCnhB,EAAM,CAAC,EACPuvB,EAAQ0C,EAAkBlL,GAI3B,OAHA5F,EAAQiD,SAAQ,SAAU0R,EAAQv7B,GACjCyF,EAAI81B,GAAUvG,EAAM2D,EAAW4C,GAChC,IACO91B,CACR,CACC,IAAK,IAAI81B,KAAU3U,EAAS,CAC3B,IAAIoL,EAAMpL,EAAQ2U,GACdvJ,GAAOhtB,WAAWgtB,KACrBA,GAAO,MAERxF,EAAKwI,MAAM2D,EAAW4C,IAAWvJ,CAClC,CAEF,EAEOuF,CACR,CAvQgC,CAuQ9Bl6B,QAAU,CAAC,GA4Bb,OAzBAgpB,EAAYqF,MAAMzsB,UAAUu8B,cAAgB,WAE3C,OADAnV,EAAYC,MAAMC,IAAI,EAAG,gKAClB7pB,IACR,EACA2pB,EAAYqF,MAAMzsB,UAAUw8B,iBAAmB,WAE9C,OADApV,EAAYC,MAAMC,IAAI,EAAG,mKAClB7pB,IACR,EACA2pB,EAAYqF,MAAMzsB,UAAUy8B,SAAW,WAEtC,OADArV,EAAYC,MAAMC,IAAI,EAAG,iJAClB7pB,IACR,EACA2pB,EAAYqF,MAAMzsB,UAAU08B,YAAc,WAEzC,OADAtV,EAAYC,MAAMC,IAAI,EAAG,oJAClB7pB,IACR,EACA2pB,EAAYqF,MAAMzsB,UAAU28B,YAAc,WAEzC,OADAvV,EAAYC,MAAMC,IAAI,EAAG,4JAClB7pB,IACR,EACA2pB,EAAYqF,MAAMzsB,UAAU48B,eAAiB,WAE5C,OADAxV,EAAYC,MAAMC,IAAI,EAAG,+JAClB7pB,IACR,EAEO2pB,CACR,OA/uFgB,6GClBHyV,EAAW5T,SAAS3lB,KAEpBw5B,EAAav5B,OAAOw5B,OAAO,CACtCC,qBAAsB,uBACtBC,gBAAiB,oBCHsB,GAAH9G,OADrB,eACuC,4BAOjC5yB,OAAOw5B,OAAO,CACnC,eAAgB,kuBCJlB,IAIqBG,EAAG,WACtB,SAAAA,EAAYzH,gGAAS0H,CAAA,KAAAD,GAEnBz/B,KAAK2/B,GAAK3H,EAGVh4B,KAAK4/B,WAAa5/B,KAAK4/B,WAAWhD,KAAK58B,MAEvCA,KAAK6/B,MACP,WAqBC,SArBAJ,KAAA,EAAAn8B,IAAA,OAAAC,MAED,WACEu5B,QAAQjT,IAAI,YAET7pB,KAAK2/B,KAAI3/B,KAAK8/B,YAAc9/B,KAAK2/B,GAAGI,cAAc,+BAGrDX,EAASrV,iBAAiBsV,EAAWE,qBAAsBv/B,KAAK4/B,WAKlE,GAAC,CAAAt8B,IAAA,aAAAC,MAED,SAAWy8B,GAGT,IAAMC,EAAY,CAACnI,QAAQ,IAAIl1B,MAAOC,UAChCq9B,EAAK,IAAIC,YAAYd,EAAWG,gBAAiBS,GACvDb,EAASpR,cAAckS,EACzB,oFAACT,CAAA,CA9BqB,otBCTHW,EAAgB,WACnC,SAAAA,EAAYpI,gGAAS0H,CAAA,KAAAU,GACnBpgC,KAAK2/B,GAAK3H,EACVh4B,KAAK6/B,MACP,WAIC,SAJAO,KAAA,EAAA98B,IAAA,OAAAC,MAED,WACE,oFACD68B,CAAA,CARkC,otBCAhBC,EAAQ,WAC3B,SAAAA,EAAYrI,EAASpyB,gGAAM85B,CAAA,KAAAW,GACzBrgC,KAAK2/B,GAAK3H,EACVh4B,KAAK4F,KAAOA,EAEZ5F,KAAKsgC,QAAUtgC,KAAKsgC,QAAQ1D,KAAK58B,MAEjCA,KAAK6/B,MACP,WAeC,SAfAQ,IAQA,EAAA/8B,IAAA,WAAAC,MAED,SAAgBqC,GACd,IAAOwrB,EAAQxrB,EAARwrB,KACP,MAAO,4DAAPsH,OACqDtH,EAAI,cAE3D,OAfC,EAAA9tB,IAAA,OAAAC,MAED,WACEvD,KAAK2/B,GAAG5V,iBAAiB,QAAS/pB,KAAKsgC,QACzC,GAAC,CAAAh9B,IAAA,UAAAC,MAED,WACEu5B,QAAQjT,IAAI,mBAAoB7pB,KAAK2/B,GAAGY,YAAavgC,KAAK4F,KAC5D,oFAOCy6B,CAAA,CAvB0B,otBCARG,EAAY,WAC/B,SAAAA,EAAYxI,gGAAS0H,CAAA,KAAAc,GACnBxgC,KAAK2/B,GAAK3H,EACVh4B,KAAKygC,SAAWzgC,KAAK2/B,GAAGI,cAAc,SACtC//B,KAAK0gC,IAAM1gC,KAAK2/B,GAAGI,cAAc,aACjC//B,KAAK2gC,SAAW3gC,KAAK2/B,GAAGI,cAAc,mBACtC//B,KAAK4gC,YAAc5gC,KAAK4gC,YAAYhE,KAAK58B,MACzCA,KAAK6/B,MACP,WAuCG,SAvCFW,KAAA,EAAAl9B,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACDpD,KAAKygC,UACPzgC,KAAKygC,SAAS1W,iBAAiB,UAAU,SAAA0D,GACvCrqB,EAAKw9B,aACP,IAEFjgC,OAAOopB,iBAAiB,UAAU,WAC5B3mB,EAAKq9B,SAASI,UAChBz9B,EAAKq9B,SAASI,SAAU,EACxBz9B,EAAKw9B,cAET,GAAG,CAACE,SAAQ,IACZngC,OAAOopB,iBAAiB,SAAS,SAAC0D,GAC3BrqB,EAAKu8B,GAAGlU,SAASgC,EAAE+M,UACtBp3B,EAAKq9B,SAASI,SAAU,EACxBz9B,EAAKw9B,cAET,GACF,GAAC,CAAAt9B,IAAA,cAAAC,MAED,WACE,IAAIw9B,EAAgB/gC,KAAK2gC,SAAS3C,iBAAiB,KAC/Ch+B,KAAKygC,SAASI,SAChB7gC,KAAK0gC,IAAIjC,UAAUC,IAAI,UACnBqC,GACFA,EAAc5T,SAAQ,SAAA6K,GACpBA,EAAQgJ,SAAW,CACrB,MAGFhhC,KAAK0gC,IAAIjC,UAAU9xB,OAAO,UACtBo0B,GACFA,EAAc5T,SAAQ,SAAA6K,GACpBA,EAAQgJ,UAAY,CACtB,IAGJ,oFAACR,CAAA,CA/C4B,otBCAZS,EAAQ,WAC3B,SAAAA,EAAYjJ,gGAAS0H,CAAA,KAAAuB,GACnBjhC,KAAK2/B,GAAK3H,EACVh4B,KAAKkhC,OAASlhC,KAAK2/B,GAAGI,cAAc,eACpC//B,KAAKmhC,WAAanhC,KAAK2/B,GAAGI,cAAc,gBACxC//B,KAAKohC,gBAAkBphC,KAAK2/B,GAAGI,cAAc,0BAC7C//B,KAAK6/B,MACP,WAiBC,SAjBAoB,KAAA,EAAA39B,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACLpD,KAAKkhC,OAAOnX,iBAAiB,UAAU,SAAA0D,GACrCrqB,EAAK+9B,WAAW1C,UAAUC,IAAI,gBAC1Bt7B,EAAK89B,OAAOL,SACdz9B,EAAKg+B,gBAAgBC,cAAgBC,KAAKC,MAAMn+B,EAAKg+B,gBAAgBC,cACrEj+B,EAAK+9B,WAAW1C,UAAU9xB,OAAO,oBACjCvJ,EAAK+9B,WAAW1C,UAAUC,IAAI,iBAC9Bt7B,EAAK+9B,WAAWpX,iBAAiB,iBAAiB,WAClD3mB,EAAK+9B,WAAW1C,UAAU9xB,OAAO,eAAgB,MAEjDvJ,EAAKg+B,gBAAgBC,cAAgBC,KAAKC,MAAMn+B,EAAKg+B,gBAAgBC,aAAc,SACnFj+B,EAAK+9B,WAAW1C,UAAU9xB,OAAO,iBACjCvJ,EAAK+9B,WAAW1C,UAAUC,IAAI,oBAElC,GACF,oFAACuC,CAAA,CAxB0B,otBCARO,EAAS,WAC5B,SAAAA,EAAYxJ,gGAAS0H,CAAA,KAAA8B,GACnBxhC,KAAK2/B,GAAK3H,EACVh4B,KAAKyhC,MAAQzhC,KAAK2/B,GAAGI,cAAc,gBACnC//B,KAAK0gC,IAAM1gC,KAAKyhC,MAAM1B,cAAc,OACpC//B,KAAKsrB,UAAYtrB,KAAK2/B,GAAGI,cAAc,oBACvC//B,KAAK0hC,QAAU1hC,KAAK2/B,GAAGI,cAAc,kBACrC//B,KAAK2hC,gBAAkB3hC,KAAK2hC,gBAAgB/E,KAAK58B,MACjDA,KAAK6/B,MACP,WAyBC,SAzBA2B,KAAA,EAAAl+B,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACLpD,KAAK2/B,GAAG5V,iBAAiB,SAAS,SAAA0D,GAChCrqB,EAAKu+B,iBACP,GACF,GAAC,CAAAr+B,IAAA,kBAAAC,MAED,WACEu5B,QAAQjT,IAAI,YAAa7pB,KAAK2/B,IAC9B7C,QAAQjT,IAAI,mBAAoB7pB,KAAKsrB,WAErC,IAAIsW,EAAgB5hC,KAAK0hC,QAAQG,aAC7B7hC,KAAK2/B,GAAGlB,UAAUhT,SAAS,WAC7BzrB,KAAK0gC,IAAIjC,UAAU9xB,OAAO,UAC1B3M,KAAKsrB,UAAUgN,MAAMhM,OAAS,MAC9BtsB,KAAK2/B,GAAGlB,UAAU9xB,OAAO,UACzB3M,KAAK2/B,GAAGzG,aAAa,iBAAiB,KAGtCl5B,KAAK0gC,IAAIjC,UAAUC,IAAI,UACvB1+B,KAAKsrB,UAAUgN,MAAMhM,OAAS,GAAHoM,OAAMkJ,EAAa,MAC9C5hC,KAAK2/B,GAAGlB,UAAUC,IAAI,UACtB1+B,KAAK2/B,GAAGzG,aAAa,iBAAiB,GAE1C,oFAACsI,CAAA,CAlC2B,muBCAO,IAChBM,EAAW,WAC9B,SAAAA,EAAY9J,gGAAS0H,CAAA,KAAAoC,GACnB9hC,KAAK2/B,GAAK3H,EACVh4B,KAAK+hC,QAAU/hC,KAAK2/B,GAAGqC,QAAQC,QAC/BjiC,KAAKkiC,qBAAuBliC,KAAK2/B,GAAGI,cAAc,oBAClD//B,KAAKmiC,UAAYniC,KAAK2/B,GAAGI,cAAc,OACvC//B,KAAKoiC,kBAAoBpiC,KAAK2/B,GAAGI,cAAc,wBAC/C//B,KAAKqiC,YAAcriC,KAAK2/B,GAAGI,cAAc,iBAEzC//B,KAAKsiC,iBAAmBtiC,KAAKsiC,iBAAiB1F,KAAK58B,MACnDA,KAAKuiC,YAAcviC,KAAKuiC,YAAY3F,KAAK58B,MAEzCA,KAAKwiC,cAAgBxiC,KAAKwiC,cAAc5F,KAAK58B,MAC7CA,KAAKyiC,wBAA0BziC,KAAKyiC,wBAAwB7F,KAAK58B,MACjEA,KAAK0iC,oBAAsB1iC,KAAK0iC,oBAAoB9F,KAAK58B,MACzDA,KAAK2iC,UAAY3iC,KAAK2iC,UAAU/F,KAAK58B,MACrCA,KAAK4iC,UAAY5iC,KAAK4iC,UAAUhG,KAAK58B,MACrCA,KAAK6iC,WAAa7iC,KAAK6iC,WAAWjG,KAAK58B,MACvCA,KAAK8iC,iBAAmB9iC,KAAK8iC,iBAAiBlG,KAAK58B,MAEnDA,KAAK+iC,WAAa/iC,KAAK+iC,WAAWnG,KAAK58B,MAEvCA,KAAKgjC,MAAO,EACZhjC,KAAKijC,OAAS,CAAC,EACfjjC,KAAK6/B,MACP,WAqID,SArIEiC,KAAA,EAAAx+B,IAAA,OAAAC,MACD,WAAM,IAAAH,EAAA,KAECpD,KAAKoiC,kBAKJpiC,KAAKmiC,WACPniC,KAAKmiC,UAAUpY,iBAAiB,SAAS,SAAA0D,GACvCrqB,EAAKk/B,iBAAiBl/B,EAAKg/B,kBAE7B,KARFpiC,KAAK+iC,aACL/iC,KAAKkiC,qBAAqB5J,MAAM4K,QAAU,EAC1CljC,KAAKuiC,cAYT,GAAC,CAAAj/B,IAAA,aAAAC,MAED,WACE,GAAIvD,KAAK+hC,UAAY/hC,KAAK8iC,mBAAmB,CAC3C,IAAIK,EAAM3X,SAASqN,cAAc,UACjCsK,EAAIC,IAAM,qCACV,IAAIC,EAAiB7X,SAAS8X,qBAAqB,UAAU,GAC7DD,EAAetT,WAAW6I,aAAauK,EAAKE,EAC9C,CACIrjC,KAAK+hC,SACP/hC,KAAK4iC,WAUT,GAAC,CAAAt/B,IAAA,mBAAAC,MAED,SAAiBggC,GACfvjC,KAAK+iC,aACDQ,IACFA,EAAQjL,MAAM4K,QAAU,EACxBK,EAAQjL,MAAMkL,OAAS,EACvBxjC,KAAKqiC,YAAY/J,MAAM4K,QAAU,GAE/BljC,KAAKkiC,uBACPliC,KAAKkiC,qBAAqB5J,MAAM4K,QAAU,GAE5CljC,KAAKwiC,gBAGLxiC,KAAKuiC,aACP,GAAC,CAAAj/B,IAAA,cAAAC,MA6DD,WAAa,IAAAkgC,EAAA,KACX3G,QAAQjT,IAAI,gBACZ,IAAIoF,EAAa,IAAItF,IAAAA,YACN,IAAIA,IAAAA,OAAkB,CACnC8K,eAAez0B,KAAKkiC,qBACpBvO,SAAS,SACRtE,GAAG,SAAS,SAAA5B,GACbgW,EAAKR,OAAOJ,YACd,IAAG3T,MAAMD,EACX,GAAC,CAAA3rB,IAAA,YAAAC,MAvDD,WACoB,oBAAPmgC,IAAuBA,IAAMA,GAAGC,QACzC3jC,KAAKyiC,0BACLziC,KAAKuiC,eAELvW,WAAWhsB,KAAK4iC,UAAW,IAE/B,GAAC,CAAAt/B,IAAA,0BAAAC,MAGD,WACEvD,KAAKijC,OAAS,IAAIS,GAAGC,OAAO,UAAW3jC,KAAK+hC,QAAS,CACnDzV,OAAQ,MACRC,MAAO,MACPqX,QAAS5jC,KAAK+hC,QACd8B,KAAM,yBACNC,OAAQ,CAEN,cAAiB9jC,KAAK0iC,sBAG5B,GAAC,CAAAp/B,IAAA,gBAAAC,MAED,WACE,IAAIwgC,EAAa/jC,KAAK2/B,GAAGI,cAAc,UACnCgE,GACFA,EAAWtF,UAAU9xB,OAAO,aAE9B3M,KAAKijC,OAAOL,WACd,GAAC,CAAAt/B,IAAA,sBAAAC,MAED,SAAoBy8B,GAIlB,GACD,CAAA18B,IAAA,YAAAC,MAED,WACEvD,KAAKijC,OAAON,WACd,GAAC,CAAAr/B,IAAA,aAAAC,MAED,WACEvD,KAAKijC,OAAOJ,YACd,GAAC,CAAAv/B,IAAA,mBAAAC,MAaD,SAAiBJ,GACVA,IAAKA,EAAM,sCAEhB,IADA,IAAI6gC,EAAUxY,SAAS8X,qBAAqB,UACnCv/B,EAAIigC,EAAQhgC,OAAQD,KACzB,GAAIigC,EAAQjgC,GAAGq/B,KAAOjgC,EAAK,OAAO,EAEtC,OAAO,CACX,oFAAC2+B,CAAA,CA9J+B,gtBCDyB,IAEpCmC,EAAM,WACzB,SAAAA,EAAYjM,gGAAS0H,CAAA,KAAAuE,GACnBjkC,KAAK2/B,GAAK3H,EACVh4B,KAAK6F,KAAO2lB,SAASuU,cAAc,QACnC//B,KAAKkkC,KAAO1Y,SAASuU,cAAc,QACnC//B,KAAKmkC,aAAenkC,KAAK2/B,GAAG3B,iBAAiB,gBAC7Ch+B,KAAKokC,WAAa5Y,SAASuU,cAAc,qBACzC//B,KAAKqkC,aAAerkC,KAAK2/B,GAAG3B,iBAAiB,uBAC7Ch+B,KAAKskC,WAAatkC,KAAK2/B,GAAGI,cAAc,qBACxC//B,KAAKukC,eAAiBvkC,KAAK2/B,GAAG3B,iBAAiB,yBAC/Ch+B,KAAKwkC,YAAcxkC,KAAK2/B,GAAGI,cAAc,kBACzC//B,KAAKykC,mBAAqBzkC,KAAKykC,mBAAmB7H,KAAK58B,MACvDA,KAAK0kC,aAAe1kC,KAAK0kC,aAAa9H,KAAK58B,MAC3CA,KAAK2kC,iBAAmB3kC,KAAK2kC,iBAAiB/H,KAAK58B,MACnDA,KAAK4kC,oBAAsB5kC,KAAK4kC,oBAAoBhI,KAAK58B,MACzDA,KAAK21B,QAAuC,SAA5B31B,KAAK2/B,GAAGqC,QAAQrM,QAChC31B,KAAK6kC,WAA2C,SAA7B7kC,KAAK2/B,GAAGqC,QAAQ8C,SACnC9kC,KAAK+kC,gBAAuD,SAApC/kC,KAAK2/B,GAAGqC,QAAQgD,gBACxChlC,KAAKilC,OAAsC,SAA5BjlC,KAAK2/B,GAAGqC,QAAQrM,QAE/B31B,KAAK6/B,MACP,WAsHC,SAtHAoE,KAAA,EAAA3gC,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACLpD,KAAKykC,uBACCzkC,KAAK6kC,YAAc7kC,KAAKilC,QAAYjlC,KAAK6kC,YAAc7kC,KAAK+kC,kBAChE/kC,KAAK2kC,mBAEH3kC,KAAKmkC,eACPnkC,KAAKmkC,aAAahX,SAAQ,SAAC+X,GAER,SADFA,EAAOlD,QAAQmD,aAE5BD,EAAOzG,UAAUC,IAAI,sBAErBwG,EAAOE,gBAAgB,QAE3B,IAEIplC,KAAKqkC,cACPrkC,KAAKqkC,aAAalX,SAAQ,SAAC+X,GACzBA,EAAOnb,iBAAiB,SAAS,SAAC0D,GAChCrqB,EAAKshC,cACP,GACF,IAGF/jC,OAAOopB,iBACL,UACA,WACEyB,SAAS6Z,gBAAgB/M,MAAMgN,YAAY,aAAc,GAAF5M,OAAK/3B,OAAO4kC,QAAO,MAC5E,GACA,CAAEzE,SAAS,IAGjB,GAAC,CAAAx9B,IAAA,mBAAAC,MAED,WAAmB,IAAAkgC,EAAA,KACjB,GAAIzjC,KAAKukC,gBAAkC,GAAhBvkC,KAAK21B,QAAiB,CAC/C,IAAI6P,EAAY,IAAIC,QACpBD,EAAUE,OAAO,eAAgB,oBAQjCC,MAAM,gCANe,CACnB5I,OAAQ,MACR6I,QAASJ,EACTK,SAAU,WAITr8B,MAAK,SAAC/D,GAAQ,OAAKA,EAASqgC,MAAM,IAClCt8B,MAAK,SAACV,GAAM,OAAK26B,EAAKmB,oBAAoB97B,EAAO,IACjDi9B,OAAM,SAAC99B,GAAK,OAAK60B,QAAQjT,IAAI,QAAS5hB,EAAM,GACjD,CACF,GAAC,CAAA3E,IAAA,sBAAAC,MAED,SAAoByiC,GAClBhmC,KAAKukC,eAAepX,SAAQ,SAAC8Y,GAC3BA,EAAiBC,UAAYF,EACzBla,OAAOka,GAAiB,IAC1BC,EAAiBxH,UAAU9xB,OAAO,OAClCs5B,EAAiBxH,UAAUC,IAAI,OAC/BuH,EAAiBxH,UAAUC,IAAI,kBAC/BuH,EAAiBxH,UAAU9xB,OAAO,iBAEtC,GACF,GAAC,CAAArJ,IAAA,eAAAC,MAED,WACE,IAAI4iC,EAAanmC,KAAK2/B,GAAGkC,aAAe,KACxC,GAAI7hC,KAAK6F,KAAK44B,UAAUhT,SAAS,UAAW,CAC1C,IAAI8Z,EAAUvlC,KAAK6F,KAAKyyB,MAAM3B,IAC9B32B,KAAK6F,KAAK44B,UAAU9xB,OAAO,UAC3B3M,KAAK6F,KAAKyyB,MAAM3B,IAAM,GACtBh2B,OAAOgsB,SAAS,GAA+B,EAA5BtkB,SAASk9B,GAAW,MACvCvlC,KAAKskC,WAAWhM,MAAMhM,OAAS,KAC/BtsB,KAAKskC,WAAW7F,UAAUC,IAAI,cAC9B1+B,KAAKskC,WAAW7F,UAAU9xB,OAAO,YACjC3M,KAAKskC,WAAW7F,UAAUC,IAAI,SAChC,KAAO,CACL,IAAI6G,EAAU/Z,SAAS6Z,gBAAgB/M,MAAM8N,iBAAiB,cAE9DpmC,KAAK6F,KAAK44B,UAAUC,IAAI,UACxB1+B,KAAKskC,WAAW7F,UAAU9xB,OAAO,UACjC3M,KAAK6F,KAAKyyB,MAAM3B,IAAM,IAAH+B,OAAO6M,GAC1BvlC,KAAKskC,WAAWhM,MAAMhM,OAAS,gBAAkB6Z,EAAa,IAC9DnmC,KAAKskC,WAAW7F,UAAU9xB,OAAO,cACjC3M,KAAKskC,WAAW7F,UAAUC,IAAI,YAC9B1+B,KAAKwkC,YAAY6B,OACnB,CACF,GAAC,CAAA/iC,IAAA,qBAAAC,MAED,WAAqB,IAAA+iC,EAAA,KACbC,EAAW,YACXC,EAAa,cACfC,EAAa,EACjB9lC,OAAOopB,iBAAiB,UAAU,WAChC,IAAKuc,EAAKzgC,KAAK44B,UAAUhT,SAAS,UAAW,CAC3C,IAAMib,EAAgB/lC,OAAOw9B,YAK7B,GAHqB,GAAjBuI,GACFJ,EAAKzgC,KAAK44B,UAAU9xB,OAAO65B,GAEzBE,GAAiB,EAEnB,YADAJ,EAAKzgC,KAAK44B,UAAU9xB,OAAO45B,GAIzBG,EAAgBD,GAElBH,EAAKzgC,KAAK44B,UAAU9xB,OAAO45B,GAC3BD,EAAKzgC,KAAK44B,UAAUC,IAAI8H,IACfF,EAAKzgC,KAAK44B,UAAUhT,SAAS+a,KAEtCF,EAAKzgC,KAAK44B,UAAU9xB,OAAO65B,GAC3BF,EAAKzgC,KAAK44B,UAAUC,IAAI6H,IAG1BE,EAAaC,CACf,CACF,GACF,oFAACzC,CAAA,CA3IwB,gtBCDqC,IAC3C0C,EAAU,WAC7B,SAAAA,EAAY3O,gGAAS0H,CAAA,KAAAiH,GACnB3mC,KAAK2/B,GAAK3H,EACVh4B,KAAK4mC,aAAepb,SAASwS,iBAAiB,WAC9Ch+B,KAAK6mC,oBAAsB7mC,KAAK6mC,oBAAoBjK,KAAK58B,MACzDA,KAAK6/B,MACP,WA6CC,SA7CA8G,KAAA,EAAArjC,IAAA,OAAAC,MAED,WACEioB,SAASwS,iBAAiB,gBAAgB7Q,SAAQ,SAAA2Z,GAChDA,EAAO/c,iBAAiB,SAAS,SAAU0D,GACvCA,EAAEmK,iBACFpM,SAASuU,cAAc//B,KAAK+mC,aAAa,SAASC,eAAe,CAC7DC,SAAU,UAElB,GACF,IAEIjnC,KAAK4mC,cACP5mC,KAAK6mC,oBAAoB7mC,KAAK4mC,cAEhC,IAAIM,EAAmB,IAAIvd,EAAYM,WAErB,IAAIN,EAAYqF,MAAM,CACtCyF,eAAgBz0B,KAAK2/B,GACrBjL,YAAa,IAEdqD,OAAO/3B,KAAK2/B,IACZ5F,eAAe/5B,KAAK2/B,GAAG,OACvBzQ,MAAMgY,EAIT,GAAC,CAAA5jC,IAAA,sBAAAC,MAED,SAAoB4jC,GAAO,IAAA/jC,EAAA,KACrBgkC,EAAkB,IAAIzd,EAAYM,WACtCkd,EAAOha,SAAQ,SAAAka,GACb,IAAIC,EAAalkC,EAAKu8B,GAAGI,cAAc,aAADrH,OAAc2O,EAAU,GAAC,OAC3Dp+B,EAASo+B,EAAME,mBACfC,EAAev+B,EAAO44B,aACR,IAAIlY,EAAYqF,MAAM,CACtCyF,eAAexrB,EACf0qB,SAAS6T,IAEVzN,eAAeuN,EAAW,UAC1BpY,MAAMkY,EAET,GAGF,oFAACT,CAAA,CAnD4B,usDCAxB,SAASc,EAAU1gC,EAAO2gC,EAAgBpc,EAAWqc,GAC1D,IAAIC,EAAY,GAAHlP,OAAMgP,EAAc,OAAAhP,OAAM3xB,GACjCy+B,EAAY,IAAIC,QACpBD,EAAUE,OAAO,SAAU,8CAO3BC,MAAMiC,EALe,CACnB7K,OAAQ,MACR6I,QAASJ,EACTK,SAAU,WAGXr8B,MAAK,SAAA/D,GAAQ,OAAIA,EAASqgC,MAAM,IAChCt8B,MAAK,SAAAV,IAMH,SAAwBg9B,EAAKxa,EAAUqc,GAC5C,IAAIE,EAAKvc,EAAUyU,cAAc,MACzBj3B,EAASg9B,EAAKzgC,KAAI,SAAAyiC,GACtB,MAAO,yDAAPpP,OAAgEoP,EAAMC,KAAI,QAC5E,IAAGziC,KAAK,KAER,GAAIuiC,GAAM/B,EAAK9hC,OAAS,EAAE,CACxBsnB,EAAUmT,UAAU9xB,OAAO,OAC3B2e,EAAUmT,UAAUC,IAAI,UACxBmJ,EAAG3B,UAAYp9B,EACG++B,EAAG7J,iBAAiB,MAC1B7Q,SAAQ,SAAA6a,GAClBA,EAAWje,iBAAiB,SAAS,SAAA0D,GACnC,IChCDvF,EDgCKzjB,GChCLyjB,EAAUvnB,OAAOsnC,SAAjB/f,QACIggB,SAAS,KACPhgB,EAAO4E,MAAM5E,EAAOiH,QAAQ,KAAO,GAAGwD,MAAM,KAC3CwV,QAAO,SAAC1jC,EAAQ2jC,GAC5B,IAAgCC,EAAAC,EAAfF,EAAKzV,MAAM,KAAI,GAA3BrvB,EAAG+kC,EAAA,GAAE/S,EAAG+S,EAAA,GAOb,MAJyB,MAAtB/kC,EAAIq4B,gBACLr4B,EAAM,QAGDwC,OAAOyiC,OAAO9jC,EAAM+jC,EAAA,GAAIllC,EAAMmlC,mBAAmBnT,IAC1D,GAAG,CAAC,GAX6B,CAAC,EDgC1BhK,EAAUmT,UAAUC,IAAI,OACxBpT,EAAUmT,UAAU9xB,OAAO,UAC3Bg7B,EAAgBpkC,MAAQykC,EAAWU,UACnCjkC,EAAOsC,MAAQihC,EAAWU,UCpB7B,SAAuBjkC,GAEzBA,EAAOkkC,aACDlkC,EAAOkkC,KAIblkC,EAAOsjC,OACRtjC,EAAOmkC,EAAInkC,EAAOsjC,YACXtjC,EAAOsjC,MAGhB,IAAMhhC,EAAQjB,OAAOC,KAAKtB,GAAQY,KAAI,SAAA/B,GAAG,SAAAo1B,OAAOp1B,EAAG,KAAAo1B,OAAImQ,UAAUpkC,EAAOnB,IAAK,IAAIgC,KAAK,KAChFwjC,EAAY/hC,EAAM/C,OAAS,EAAI,GAAH00B,OAAM/3B,OAAOsnC,SAASc,SAAQ,KAAArQ,OAAI3xB,GAAK,GAAA2xB,OAAQ/3B,OAAOsnC,SAASc,UACjGpoC,OAAOqoC,QAAQC,UAAU,GAAI,GAAIH,EACnC,CDMUI,CAAczkC,GACdkjC,EAAgB3Z,cAAc,IAAImb,cAAc,WAAY,CAAC,IAAO,UACtE,GACF,GACF,CACJ,CA5BMC,CAAetgC,EAAOwiB,EAAWqc,EACnC,IACC5B,OAAM,SAAA99B,GAAK,OAAI60B,QAAQjT,IAAI,QAAS5hB,EAAM,GAC/C,8sBEjB6D,IAExCohC,EAAY,WAC/B,SAAAA,EAAYrR,gGAAS0H,CAAA,KAAA2J,GACnBrpC,KAAKspC,eAAiB,oDACtBtpC,KAAKupC,eAAiB,GAEtBvpC,KAAK2/B,GAAK3H,EACVh4B,KAAKwkC,YAAcxkC,KAAK2/B,GAAGI,cAAc,sBACzC//B,KAAKwpC,cAAgBxpC,KAAK2/B,GAAGI,cAAc,uBAC3C//B,KAAKypC,iBAAmBzpC,KAAK2/B,GAAGqC,QAAQ0H,WACxC1pC,KAAK2pC,mBAAqB3pC,KAAK2/B,GAAGI,cAAc,oBAEhD//B,KAAK4pC,iBAAmB5pC,KAAK4pC,iBAAiBhN,KAAK58B,MACnDA,KAAK6/B,MACP,WA8BC,SA9BAwJ,KAAA,EAAA/lC,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACLpD,KAAKwkC,YAAYza,iBAAiB,WAAW,SAAA0D,GACzB,KAAdA,EAAEoc,SACAzmC,EAAKohC,YAAYjhC,MAAMS,QAAU,IACnCZ,EAAKwmC,mBACLnC,EAAUrkC,EAAKohC,YAAYjhC,MAAOH,EAAKkmC,eAAgBlmC,EAAKumC,mBAAoBvmC,EAAKohC,cAGzFphC,EAAKohC,YAAYza,iBAAiB,SAAS,SAAA0D,GACxB,IAAbA,EAAEoc,SAAiBzmC,EAAKohC,YAAYjhC,MAAMS,QAAS,EACrDyjC,EAAUrkC,EAAKohC,YAAYjhC,MAAOH,EAAKkmC,eAAgBlmC,EAAKumC,mBAAoBvmC,EAAKohC,cAErFphC,EAAKumC,mBAAmBlL,UAAUC,IAAI,OACtCt7B,EAAKumC,mBAAmBlL,UAAU9xB,OAAO,UAE7C,GACF,IAEA3M,KAAKwpC,cAAczf,iBAAiB,SAAS,SAAA0D,GACvCrqB,EAAKohC,YAAYjhC,MAAMS,QAAU,GACnCZ,EAAKwmC,kBAET,GACF,GAAC,CAAAtmC,IAAA,mBAAAC,MAED,WACE,IAAIwD,EAAQ/G,KAAKwkC,YAAYjhC,MAC7BioB,SAASyc,SAAW,GAAHvP,OAAM14B,KAAKypC,iBAAgB,WAAA/Q,OAAU3xB,EACxD,oFAACsiC,CAAA,CA3C8B,otBCHZS,EAAS,WAC5B,SAAAA,EAAY9R,gGAAS0H,CAAA,KAAAoK,GACnB9pC,KAAK2/B,GAAK3H,EACVh4B,KAAK+pC,KAAO/pC,KAAK2/B,GAAG3B,iBAAiB,UACrCh+B,KAAKgqC,eAAiBhqC,KAAK2/B,GAAGI,cAAc,yBAE5C//B,KAAKiqC,UAAYjqC,KAAKiqC,UAAUrN,KAAK58B,MAErCA,KAAK6/B,MACP,WA2BC,SA3BAiK,KAAA,EAAAxmC,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACDpD,KAAK+pC,MACP/pC,KAAK+pC,KAAK5c,SAAQ,SAAA+c,GAChBA,EAAIngB,iBAAiB,SAAS,SAAA0D,GAC5BrqB,EAAK6mC,UAAUC,EAAIlI,QAAQ7+B,IAAK+mC,EAAIlI,QAAQrF,GAAIuN,EAAIlI,QAAQh/B,KAC9D,GACF,GAEJ,GAAC,CAAAM,IAAA,YAAAC,MAED,SAAUJ,EAAKw5B,EAAI35B,GAClB,IAAI0+B,EAAU,qBAAHhJ,OACIiE,EAAE,YAAAjE,OAAWiE,EAAE,WAAAjE,OAAUv1B,EAAG,kFAAAu1B,OAAgFiE,EAAE,QAAAjE,OAAO11B,EAAI,uFAAA01B,OAE5GiE,EAAE,4VAS7B38B,KAAKgqC,eAAe9D,UAAUxE,CAEhC,oFAACoI,CAAA,CApC2B,otBCATK,EAAW,WAC5B,SAAAA,EAAYnS,gGAAS0H,CAAA,KAAAyK,GACnBnqC,KAAK2/B,GAAK3H,EACVh4B,KAAKoqC,SAAWpqC,KAAK2/B,GAAGI,cAAc,qBACtC//B,KAAKqqC,eAAiBrqC,KAAK2/B,GAAGI,cAAc,4BAC5C//B,KAAKsqC,aAAetqC,KAAK2/B,GAAGI,cAAc,qBAC1C//B,KAAKuqC,aAAevqC,KAAK2/B,GAAGI,cAAc,mBAC1C//B,KAAKwqC,aAAexqC,KAAK2/B,GAAGI,cAAc,yBAC1C//B,KAAKwqC,aAAexqC,KAAK2/B,GAAGI,cAAc,yBAE1C//B,KAAKyqC,cAAgBzqC,KAAKyqC,cAAc7N,KAAK58B,MAC7CA,KAAK0qC,mBAAqB1qC,KAAK0qC,mBAAmB9N,KAAK58B,MACvDA,KAAK6/B,MACP,WA6BG,SA7BFsK,KAAA,EAAA7mC,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACHpD,KAAKsqC,aAAavgB,iBAAiB,SAAS,SAAA0D,GAC1CrqB,EAAKsnC,oBACP,IACA1qC,KAAKqqC,eAAetgB,iBAAiB,QAAQ,SAAA0D,GACzCrqB,EAAKsnC,oBACT,GACJ,GAAC,CAAApnC,IAAA,qBAAAC,MAEC,WAC6B,IAAvBvD,KAAKoqC,SAAS7mC,OAA4C,IAA7BvD,KAAKqqC,eAAe9mC,MACjDvD,KAAKwqC,aAAa/L,UAAU9xB,OAAO,WAGnC3M,KAAKwqC,aAAa/L,UAAUC,IAAI,UAChC1+B,KAAKyqC,gBAEX,GAAC,CAAAnnC,IAAA,gBAAAC,MAED,WACMvD,KAAKoqC,SAAS7mC,OAASvD,KAAKqqC,eAAe9mC,MAC3CvD,KAAKuqC,aAAa9L,UAAU9xB,OAAO,WAGnC3M,KAAKuqC,aAAa9L,UAAUC,IAAI,UAChC1+B,KAAKqqC,eAAeM,MAE1B,oFAACR,CAAA,CA1CyB,i9CCAXS,EAAQ,WAC3B,SAAAA,EAAY5S,gGAAS0H,CAAA,KAAAkL,GACnB5qC,KAAK2/B,GAAK3H,EACVh4B,KAAK6qC,OAAS7qC,KAAK2/B,GAAG3B,iBAAiB,SACvCh+B,KAAK8qC,cAAgB9qC,KAAK8qC,cAAclO,KAAK58B,MAC7CA,KAAK6/B,MACP,WA4BC,SA5BA+K,KAAA,EAAAtnC,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACD2nC,EAAUC,EAAOhrC,KAAK6qC,QACR,MAAdE,GACFA,EAAW5d,SAAQ,SAAC8d,GAClB,IAAIC,EAAiB1f,SAASqN,cAAc,OAC5CqS,EAAe5S,MAAM/L,MAAQ,OAC7B2e,EAAe5S,MAAM6S,UAAY,SACjCD,EAAe5S,MAAM7B,SAAW,WAChCwU,EAAMlb,WAAW6I,aAAasS,EAAgBD,GAC9CC,EAAe5R,YAAY2R,GAC3B7nC,EAAK0nC,cAAcG,EAAOC,EAC5B,GAEJ,GAAC,CAAA5nC,IAAA,gBAAAC,MACD,SAAc0nC,EAAOC,GACAD,EAAMG,YACFF,EAAeG,cAEpCH,EAAeI,mBAAmB,aAAc,sSAChDJ,EAAenhB,iBAAiB,SAAS,SAAC0D,GACxCyd,EAAe3U,WAAWkI,UAAUC,IAAI,SAC1C,IACAwM,EAAenhB,iBAAiB,cAAc,SAAC0D,GAC7Cyd,EAAe3U,WAAWkI,UAAUC,IAAI,SAC1C,IAEJ,oFAACkM,CAAA,CAlC0B,uPCC7BW,GAAA,kBAAA9d,CAAA,MAAA+d,EAAA/d,EAAA,GAAAge,EAAA3lC,OAAAvD,UAAAmpC,EAAAD,EAAAjoC,eAAAg6B,EAAA13B,OAAA6lC,gBAAA,SAAAH,EAAA/d,EAAAge,GAAAD,EAAA/d,GAAAge,EAAAloC,KAAA,EAAAQ,EAAA,mBAAA6nC,OAAAA,OAAA,GAAAjd,EAAA5qB,EAAA8nC,UAAA,aAAAC,EAAA/nC,EAAAgoC,eAAA,kBAAAC,EAAAjoC,EAAAkoC,aAAA,yBAAAC,EAAAV,EAAA/d,EAAAge,GAAA,OAAA3lC,OAAA6lC,eAAAH,EAAA/d,EAAA,CAAAlqB,MAAAkoC,EAAAU,YAAA,EAAAC,cAAA,EAAAC,UAAA,IAAAb,EAAA/d,EAAA,KAAAye,EAAA,aAAAV,GAAAU,EAAA,SAAAV,EAAA/d,EAAAge,GAAA,OAAAD,EAAA/d,GAAAge,CAAA,WAAAa,EAAAd,EAAA/d,EAAAge,EAAAC,GAAA,IAAA3nC,EAAA0pB,GAAAA,EAAAlrB,qBAAAgqC,EAAA9e,EAAA8e,EAAA5d,EAAA7oB,OAAA8F,OAAA7H,EAAAxB,WAAAupC,EAAA,IAAAU,EAAAd,GAAA,WAAAlO,EAAA7O,EAAA,WAAAprB,MAAAkpC,EAAAjB,EAAAC,EAAAK,KAAAnd,CAAA,UAAA+d,EAAAlB,EAAA/d,EAAAge,GAAA,WAAAzkC,KAAA,SAAA2lC,IAAAnB,EAAApd,KAAAX,EAAAge,GAAA,OAAAD,GAAA,OAAAxkC,KAAA,QAAA2lC,IAAAnB,EAAA,EAAA/d,EAAA6e,KAAAA,EAAA,IAAAM,EAAA,iBAAAC,EAAA,iBAAAC,EAAA,YAAAC,EAAA,YAAAC,EAAA,YAAAT,IAAA,UAAAU,IAAA,UAAAC,IAAA,KAAAC,EAAA,GAAAjB,EAAAiB,EAAAxe,GAAA,8BAAAye,EAAAtnC,OAAAunC,eAAA9P,EAAA6P,GAAAA,EAAAA,EAAA7c,EAAA,MAAAgN,GAAAA,IAAAkO,GAAAC,EAAAtd,KAAAmP,EAAA5O,KAAAwe,EAAA5P,GAAA,IAAArB,EAAAgR,EAAA3qC,UAAAgqC,EAAAhqC,UAAAuD,OAAA8F,OAAAuhC,GAAA,SAAAG,EAAA9B,GAAA,0BAAAre,SAAA,SAAAM,GAAAye,EAAAV,EAAA/d,GAAA,SAAA+d,GAAA,YAAA+B,QAAA9f,EAAA+d,EAAA,gBAAAgC,EAAAhC,EAAA/d,GAAA,SAAAggB,EAAAhC,EAAAjO,EAAAz5B,EAAA4qB,GAAA,IAAAmd,EAAAY,EAAAlB,EAAAC,GAAAD,EAAAhO,GAAA,aAAAsO,EAAA9kC,KAAA,KAAAglC,EAAAF,EAAAa,IAAAC,EAAAZ,EAAAzoC,MAAA,OAAAqpC,GAAA,UAAAc,EAAAd,IAAAlB,EAAAtd,KAAAwe,EAAA,WAAAnf,EAAA3lB,QAAA8kC,EAAAe,SAAAnkC,MAAA,SAAAgiC,GAAAiC,EAAA,OAAAjC,EAAAznC,EAAA4qB,EAAA,aAAA6c,GAAAiC,EAAA,QAAAjC,EAAAznC,EAAA4qB,EAAA,IAAAlB,EAAA3lB,QAAA8kC,GAAApjC,MAAA,SAAAgiC,GAAAQ,EAAAzoC,MAAAioC,EAAAznC,EAAAioC,EAAA,aAAAR,GAAA,OAAAiC,EAAA,QAAAjC,EAAAznC,EAAA4qB,EAAA,IAAAA,EAAAmd,EAAAa,IAAA,KAAAlB,EAAAjO,EAAA,gBAAAj6B,MAAA,SAAAioC,EAAAE,GAAA,SAAAkC,IAAA,WAAAngB,GAAA,SAAAA,EAAAge,GAAAgC,EAAAjC,EAAAE,EAAAje,EAAAge,EAAA,WAAAA,EAAAA,EAAAA,EAAAjiC,KAAAokC,EAAAA,GAAAA,GAAA,aAAAnB,EAAAhf,EAAAge,EAAAC,GAAA,IAAAlO,EAAAoP,EAAA,gBAAA7oC,EAAA4qB,GAAA,GAAA6O,IAAAsP,EAAA,UAAAvnC,MAAA,mCAAAi4B,IAAAuP,EAAA,cAAAhpC,EAAA,MAAA4qB,EAAA,OAAAprB,MAAAioC,EAAAxI,MAAA,OAAA0I,EAAA3O,OAAAh5B,EAAA2nC,EAAAiB,IAAAhe,IAAA,KAAAmd,EAAAJ,EAAAmC,SAAA,GAAA/B,EAAA,KAAAE,EAAA8B,EAAAhC,EAAAJ,GAAA,GAAAM,EAAA,IAAAA,IAAAgB,EAAA,gBAAAhB,CAAA,cAAAN,EAAA3O,OAAA2O,EAAAqC,KAAArC,EAAAsC,MAAAtC,EAAAiB,SAAA,aAAAjB,EAAA3O,OAAA,IAAAS,IAAAoP,EAAA,MAAApP,EAAAuP,EAAArB,EAAAiB,IAAAjB,EAAAuC,kBAAAvC,EAAAiB,IAAA,gBAAAjB,EAAA3O,QAAA2O,EAAAwC,OAAA,SAAAxC,EAAAiB,KAAAnP,EAAAsP,EAAA,IAAAK,EAAAT,EAAAjf,EAAAge,EAAAC,GAAA,cAAAyB,EAAAnmC,KAAA,IAAAw2B,EAAAkO,EAAA1I,KAAA+J,EAAAF,EAAAM,EAAAR,MAAAK,EAAA,gBAAAzpC,MAAA4pC,EAAAR,IAAA3J,KAAA0I,EAAA1I,KAAA,WAAAmK,EAAAnmC,OAAAw2B,EAAAuP,EAAArB,EAAA3O,OAAA,QAAA2O,EAAAiB,IAAAQ,EAAAR,IAAA,YAAAmB,EAAArgB,EAAAge,GAAA,IAAAC,EAAAD,EAAA1O,OAAAS,EAAA/P,EAAAoe,SAAAH,GAAA,GAAAlO,IAAAgO,EAAA,OAAAC,EAAAoC,SAAA,eAAAnC,GAAAje,EAAAoe,SAAAsC,SAAA1C,EAAA1O,OAAA,SAAA0O,EAAAkB,IAAAnB,EAAAsC,EAAArgB,EAAAge,GAAA,UAAAA,EAAA1O,SAAA,WAAA2O,IAAAD,EAAA1O,OAAA,QAAA0O,EAAAkB,IAAA,IAAAyB,UAAA,oCAAA1C,EAAA,aAAAsB,EAAA,IAAAjpC,EAAA2oC,EAAAlP,EAAA/P,EAAAoe,SAAAJ,EAAAkB,KAAA,aAAA5oC,EAAAiD,KAAA,OAAAykC,EAAA1O,OAAA,QAAA0O,EAAAkB,IAAA5oC,EAAA4oC,IAAAlB,EAAAoC,SAAA,KAAAb,EAAA,IAAAre,EAAA5qB,EAAA4oC,IAAA,OAAAhe,EAAAA,EAAAqU,MAAAyI,EAAAhe,EAAA4gB,YAAA1f,EAAAprB,MAAAkoC,EAAA6C,KAAA7gB,EAAA8gB,QAAA,WAAA9C,EAAA1O,SAAA0O,EAAA1O,OAAA,OAAA0O,EAAAkB,IAAAnB,GAAAC,EAAAoC,SAAA,KAAAb,GAAAre,GAAA8c,EAAA1O,OAAA,QAAA0O,EAAAkB,IAAA,IAAAyB,UAAA,oCAAA3C,EAAAoC,SAAA,KAAAb,EAAA,UAAAwB,EAAAhD,GAAA,IAAA/d,EAAA,CAAAghB,OAAAjD,EAAA,SAAAA,IAAA/d,EAAAihB,SAAAlD,EAAA,SAAAA,IAAA/d,EAAAkhB,WAAAnD,EAAA,GAAA/d,EAAAmhB,SAAApD,EAAA,SAAAqD,WAAAzf,KAAA3B,EAAA,UAAAqhB,EAAAtD,GAAA,IAAA/d,EAAA+d,EAAAuD,YAAA,GAAAthB,EAAAzmB,KAAA,gBAAAymB,EAAAkf,IAAAnB,EAAAuD,WAAAthB,CAAA,UAAA+e,EAAAhB,GAAA,KAAAqD,WAAA,EAAAJ,OAAA,SAAAjD,EAAAre,QAAAqhB,EAAA,WAAA/a,OAAA,YAAAlD,EAAA9C,GAAA,GAAAA,GAAA,KAAAA,EAAA,KAAAge,EAAAhe,EAAAkB,GAAA,GAAA8c,EAAA,OAAAA,EAAArd,KAAAX,GAAA,sBAAAA,EAAA6gB,KAAA,OAAA7gB,EAAA,IAAAuhB,MAAAvhB,EAAAzpB,QAAA,KAAAw5B,GAAA,EAAAz5B,EAAA,SAAAuqC,IAAA,OAAA9Q,EAAA/P,EAAAzpB,QAAA,GAAA0nC,EAAAtd,KAAAX,EAAA+P,GAAA,OAAA8Q,EAAA/qC,MAAAkqB,EAAA+P,GAAA8Q,EAAAtL,MAAA,EAAAsL,EAAA,OAAAA,EAAA/qC,MAAAioC,EAAA8C,EAAAtL,MAAA,EAAAsL,CAAA,SAAAvqC,EAAAuqC,KAAAvqC,CAAA,YAAAqqC,UAAAV,EAAAjgB,GAAA,2BAAAwf,EAAA1qC,UAAA2qC,EAAA1P,EAAAtB,EAAA,eAAA34B,MAAA2pC,EAAAd,cAAA,IAAA5O,EAAA0P,EAAA,eAAA3pC,MAAA0pC,EAAAb,cAAA,IAAAa,EAAAgC,YAAA/C,EAAAgB,EAAAlB,EAAA,qBAAAve,EAAAyhB,oBAAA,SAAA1D,GAAA,IAAA/d,EAAA,mBAAA+d,GAAAA,EAAA/Z,YAAA,QAAAhE,IAAAA,IAAAwf,GAAA,uBAAAxf,EAAAwhB,aAAAxhB,EAAA2D,MAAA,EAAA3D,EAAA0hB,KAAA,SAAA3D,GAAA,OAAA1lC,OAAAspC,eAAAtpC,OAAAspC,eAAA5D,EAAA0B,IAAA1B,EAAA6D,UAAAnC,EAAAhB,EAAAV,EAAAQ,EAAA,sBAAAR,EAAAjpC,UAAAuD,OAAA8F,OAAAswB,GAAAsP,CAAA,EAAA/d,EAAA6hB,MAAA,SAAA9D,GAAA,OAAAmC,QAAAnC,EAAA,EAAA8B,EAAAE,EAAAjrC,WAAA2pC,EAAAsB,EAAAjrC,UAAAupC,GAAA,0BAAAre,EAAA+f,cAAAA,EAAA/f,EAAA8hB,MAAA,SAAA/D,EAAAC,EAAAC,EAAAlO,EAAAz5B,QAAA,IAAAA,IAAAA,EAAA8D,SAAA,IAAA8mB,EAAA,IAAA6e,EAAAlB,EAAAd,EAAAC,EAAAC,EAAAlO,GAAAz5B,GAAA,OAAA0pB,EAAAyhB,oBAAAzD,GAAA9c,EAAAA,EAAA2f,OAAA9kC,MAAA,SAAAgiC,GAAA,OAAAA,EAAAxI,KAAAwI,EAAAjoC,MAAAorB,EAAA2f,MAAA,KAAAhB,EAAApR,GAAAgQ,EAAAhQ,EAAA8P,EAAA,aAAAE,EAAAhQ,EAAAvN,GAAA,0BAAAud,EAAAhQ,EAAA,qDAAAzO,EAAA1nB,KAAA,SAAAylC,GAAA,IAAA/d,EAAA3nB,OAAA0lC,GAAAC,EAAA,WAAAC,KAAAje,EAAAge,EAAArc,KAAAsc,GAAA,OAAAD,EAAAve,UAAA,SAAAohB,IAAA,KAAA7C,EAAAznC,QAAA,KAAAwnC,EAAAC,EAAA+D,MAAA,GAAAhE,KAAA/d,EAAA,OAAA6gB,EAAA/qC,MAAAioC,EAAA8C,EAAAtL,MAAA,EAAAsL,CAAA,QAAAA,EAAAtL,MAAA,EAAAsL,CAAA,GAAA7gB,EAAA8C,OAAAA,EAAAic,EAAAjqC,UAAA,CAAAkvB,YAAA+a,EAAA/Y,MAAA,SAAAhG,GAAA,QAAAgiB,KAAA,OAAAnB,KAAA,OAAAP,KAAA,KAAAC,MAAAxC,EAAA,KAAAxI,MAAA,OAAA6K,SAAA,UAAA9Q,OAAA,YAAA4P,IAAAnB,EAAA,KAAAqD,WAAA1hB,QAAA2hB,IAAArhB,EAAA,QAAAge,KAAA,WAAAA,EAAAhQ,OAAA,IAAAiQ,EAAAtd,KAAA,KAAAqd,KAAAuD,OAAAvD,EAAA3e,MAAA,WAAA2e,GAAAD,EAAA,EAAAkE,KAAA,gBAAA1M,MAAA,MAAAwI,EAAA,KAAAqD,WAAA,GAAAE,WAAA,aAAAvD,EAAAxkC,KAAA,MAAAwkC,EAAAmB,IAAA,YAAAgD,IAAA,EAAA1B,kBAAA,SAAAxgB,GAAA,QAAAuV,KAAA,MAAAvV,EAAA,IAAAge,EAAA,cAAAmE,EAAAlE,EAAAlO,GAAA,OAAA7O,EAAA3nB,KAAA,QAAA2nB,EAAAge,IAAAlf,EAAAge,EAAA6C,KAAA5C,EAAAlO,IAAAiO,EAAA1O,OAAA,OAAA0O,EAAAkB,IAAAnB,KAAAhO,CAAA,SAAAA,EAAA,KAAAqR,WAAA7qC,OAAA,EAAAw5B,GAAA,IAAAA,EAAA,KAAAz5B,EAAA,KAAA8qC,WAAArR,GAAA7O,EAAA5qB,EAAAgrC,WAAA,YAAAhrC,EAAA0qC,OAAA,OAAAmB,EAAA,UAAA7rC,EAAA0qC,QAAA,KAAAgB,KAAA,KAAA3D,EAAAJ,EAAAtd,KAAArqB,EAAA,YAAAioC,EAAAN,EAAAtd,KAAArqB,EAAA,iBAAA+nC,GAAAE,EAAA,SAAAyD,KAAA1rC,EAAA2qC,SAAA,OAAAkB,EAAA7rC,EAAA2qC,UAAA,WAAAe,KAAA1rC,EAAA4qC,WAAA,OAAAiB,EAAA7rC,EAAA4qC,WAAA,SAAA7C,GAAA,QAAA2D,KAAA1rC,EAAA2qC,SAAA,OAAAkB,EAAA7rC,EAAA2qC,UAAA,YAAA1C,EAAA,UAAAzmC,MAAA,kDAAAkqC,KAAA1rC,EAAA4qC,WAAA,OAAAiB,EAAA7rC,EAAA4qC,WAAA,KAAAT,OAAA,SAAA1C,EAAA/d,GAAA,QAAAge,EAAA,KAAAoD,WAAA7qC,OAAA,EAAAynC,GAAA,IAAAA,EAAA,KAAAjO,EAAA,KAAAqR,WAAApD,GAAA,GAAAjO,EAAAiR,QAAA,KAAAgB,MAAA/D,EAAAtd,KAAAoP,EAAA,oBAAAiS,KAAAjS,EAAAmR,WAAA,KAAA5qC,EAAAy5B,EAAA,OAAAz5B,IAAA,UAAAynC,GAAA,aAAAA,IAAAznC,EAAA0qC,QAAAhhB,GAAAA,GAAA1pB,EAAA4qC,aAAA5qC,EAAA,UAAA4qB,EAAA5qB,EAAAA,EAAAgrC,WAAA,UAAApgB,EAAA3nB,KAAAwkC,EAAA7c,EAAAge,IAAAlf,EAAA1pB,GAAA,KAAAg5B,OAAA,YAAAuR,KAAAvqC,EAAA4qC,WAAA3B,GAAA,KAAA6C,SAAAlhB,EAAA,EAAAkhB,SAAA,SAAArE,EAAA/d,GAAA,aAAA+d,EAAAxkC,KAAA,MAAAwkC,EAAAmB,IAAA,gBAAAnB,EAAAxkC,MAAA,aAAAwkC,EAAAxkC,KAAA,KAAAsnC,KAAA9C,EAAAmB,IAAA,WAAAnB,EAAAxkC,MAAA,KAAA2oC,KAAA,KAAAhD,IAAAnB,EAAAmB,IAAA,KAAA5P,OAAA,cAAAuR,KAAA,kBAAA9C,EAAAxkC,MAAAymB,IAAA,KAAA6gB,KAAA7gB,GAAAuf,CAAA,EAAA8C,OAAA,SAAAtE,GAAA,QAAA/d,EAAA,KAAAohB,WAAA7qC,OAAA,EAAAypB,GAAA,IAAAA,EAAA,KAAAge,EAAA,KAAAoD,WAAAphB,GAAA,GAAAge,EAAAkD,aAAAnD,EAAA,YAAAqE,SAAApE,EAAAsD,WAAAtD,EAAAmD,UAAAE,EAAArD,GAAAuB,CAAA,GAAAjH,MAAA,SAAAyF,GAAA,QAAA/d,EAAA,KAAAohB,WAAA7qC,OAAA,EAAAypB,GAAA,IAAAA,EAAA,KAAAge,EAAA,KAAAoD,WAAAphB,GAAA,GAAAge,EAAAgD,SAAAjD,EAAA,KAAAE,EAAAD,EAAAsD,WAAA,aAAArD,EAAA1kC,KAAA,KAAAw2B,EAAAkO,EAAAiB,IAAAmC,EAAArD,EAAA,QAAAjO,CAAA,YAAAj4B,MAAA,0BAAAwqC,cAAA,SAAAtiB,EAAAge,EAAAC,GAAA,YAAAmC,SAAA,CAAAhC,SAAAtb,EAAA9C,GAAA4gB,WAAA5C,EAAA8C,QAAA7C,GAAA,cAAA3O,SAAA,KAAA4P,IAAAnB,GAAAwB,CAAA,GAAAvf,CAAA,UAAAuiB,GAAAC,EAAAnoC,EAAAC,EAAAmoC,EAAAC,EAAA7sC,EAAAqpC,GAAA,QAAAtc,EAAA4f,EAAA3sC,GAAAqpC,GAAAppC,EAAA8sB,EAAA9sB,KAAA,OAAA0E,GAAA,YAAAF,EAAAE,EAAA,CAAAooB,EAAA2S,KAAAl7B,EAAAvE,GAAAsE,QAAAC,QAAAvE,GAAAiG,KAAA0mC,EAAAC,EAAA,UAAAC,GAAA5V,EAAA6V,GAAA,QAAAtsC,EAAA,EAAAA,EAAAssC,EAAArsC,OAAAD,IAAA,KAAAusC,EAAAD,EAAAtsC,GAAAusC,EAAAnE,WAAAmE,EAAAnE,aAAA,EAAAmE,EAAAlE,cAAA,YAAAkE,IAAAA,EAAAjE,UAAA,GAAAvmC,OAAA6lC,eAAAnR,GAAAmS,EAAA2D,EAAAhtC,IAAAA,WAAA,SAAAitC,EAAAC,GAAA,cAAA9C,EAAA6C,IAAA,OAAAA,EAAA,OAAAA,EAAA,IAAAE,EAAAF,EAAA3E,OAAA8E,aAAA,QAAA/tC,IAAA8tC,EAAA,KAAAE,EAAAF,EAAAriB,KAAAmiB,EAAAC,GAAA,yBAAA9C,EAAAiD,GAAA,OAAAA,EAAA,UAAAvC,UAAA,kEAAAoC,EAAAjoC,OAAAujB,QAAAykB,EAAA,CAAAK,CAAAjE,EAAA,qBAAAe,EAAApqC,GAAAA,EAAAiF,OAAAjF,IAAAgtC,EAAA,KAAA3D,EAAArpC,CAAA,KADqButC,GAAe,WAClC,SAAAA,EAAY7Y,IAAd,SAAAhvB,EAAA8nC,GAAA,KAAA9nC,aAAA8nC,GAAA,UAAA1C,UAAA,qCAAuB1O,CAAA,KAAAmR,GACnB7wC,KAAK2/B,GAAK3H,EACVh4B,KAAK6/B,MACP,CAHF,IAAAiR,EAAAC,EAAAC,EAmBG,OAnBHF,EAGGD,EAHHE,EAGG,EAAAztC,IAAA,OAAAC,MAED,WACE,IAAM0tC,EAASC,EAAQ,MAEvBD,EAAOzuC,UAAU,CACfpC,OAAQ,uCACRE,OAAQ,QAGV,IAAM6wC,EAAG,eAbbC,EAaaC,GAbbD,EAaa7F,KAAA4D,MAAG,SAAAmC,IAAA,IAAA7rC,EAAA,OAAA8lC,KAAAe,MAAA,SAAAiF,GAAA,cAAAA,EAAA9B,KAAA8B,EAAAjD,MAAA,cAAAiD,EAAAjD,KAAA,EACa2C,EAAOpvC,MAAMya,cAAa,OAA3C7W,EAAQ8rC,EAAAxD,KACdjR,QAAQjT,IAAIpkB,GAAU,wBAAA8rC,EAAA7B,OAAA,GAAA4B,EAAA,IAf5B,eAAAE,EAAA,KAAAnU,EAAAhP,UAAA,WAAAxmB,SAAA,SAAAC,EAAAC,GAAA,IAAAkoC,EAAAmB,EAAA9iB,MAAAkjB,EAAAnU,GAAA,SAAA6S,EAAA3sC,GAAAysC,GAAAC,EAAAnoC,EAAAC,EAAAmoC,EAAAC,EAAA,OAAA5sC,EAAA,UAAA4sC,EAAAhsC,GAAA6rC,GAAAC,EAAAnoC,EAAAC,EAAAmoC,EAAAC,EAAA,QAAAhsC,EAAA,CAAA+rC,OAAAvtC,EAAA,MAgBK,kBAHQ,OAAA0uC,EAAA/iB,MAAA,KAAAD,UAAA,KAKT8iB,GACF,IAnBFJ,GAAAX,GAAAU,EAAAvuC,UAAAwuC,GAAAC,GAAAZ,GAAAU,EAAAE,GAAAlrC,OAAA6lC,eAAAmF,EAAA,aAAAzE,UAAA,IAmBGwE,CAAA,CApBiC,2tBCAfY,GAAS,WAC5B,SAAAA,EAAYzZ,gGAAS0H,CAAA,KAAA+R,GACnBzxC,KAAK2/B,GAAK3H,EACVh4B,KAAK0xC,OAAS1xC,KAAK2/B,GAAGqC,QAAQ0P,OAC9B1xC,KAAK2xC,KAAO3xC,KAAK2/B,GAAGqC,QAAQ2P,KAC5B3xC,KAAK6/B,MACP,WAMC,SANA4R,KAAA,EAAAnuC,IAAA,OAAAC,MAED,WACE,IAAIquC,EAAU,GAAHlZ,OAAM14B,KAAK0xC,OAAM,MAAAhZ,OAAK14B,KAAK2xC,MAClCE,EAAc,yKAAHnZ,OAAyKj1B,mBAAmBmuC,GAAQ,gCACnN5xC,KAAK2/B,GAAGuG,UAAY2L,CACtB,sFAACJ,CAAA,CAZ2B,utBCA2B,IAEpCK,GAAI,WACrB,SAAAA,EAAY9Z,gGAAS0H,CAAA,KAAAoS,GACnB9xC,KAAK2/B,GAAK3H,EACVh4B,KAAK+xC,UAAY/xC,KAAK2/B,GAAGqC,QAAQ70B,MACjCnN,KAAKgyC,QAAUhyC,KAAK2/B,GAAGqC,QAAQh6B,IAC/BhI,KAAKiyC,QAAUjyC,KAAK2/B,GAAGqC,QAAQiQ,QAC/BjyC,KAAKkyC,YAAclyC,KAAK2/B,GAAGqC,QAAQkQ,YACnClyC,KAAK0xC,OAAS1xC,KAAK2/B,GAAGqC,QAAQ0P,OAC9B1xC,KAAKmyC,QAAUnyC,KAAK2/B,GAAGqC,QAAQmQ,QAC/BnyC,KAAK2xC,KAAO3xC,KAAK2/B,GAAGqC,QAAQ2P,KAC5B3xC,KAAKoyC,gBAAkBpyC,KAAKoyC,gBAAgBxV,KAAK58B,MACjDA,KAAKqyC,kBAAoBryC,KAAKqyC,kBAAkBzV,KAAK58B,MAErDA,KAAK6/B,MACP,WAwDC,SAxDAiS,KAAA,EAAAxuC,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACHpD,KAAK2/B,GAAG5V,iBAAiB,SAAS,SAAA0D,GAC/BrqB,EAAKgvC,iBACR,GACF,GAAC,CAAA9uC,IAAA,oBAAAC,MAEH,SAAkB+uC,GACd,IAAIC,EAAWD,EAAS3f,MAAM,KAAKrtB,KAAK,KACpCktC,EAAOD,EAASE,UAAU,EAAG,IAC7Bp1B,EAAQk1B,EAASE,UAAU,EAAG,GAC9BC,EAAMH,EAASE,UAAU,EAAG,GAC5BzV,EAAOuV,EAASE,UAAU,GAAI,IAGlC,OAFAzV,EAAOA,EAAKrK,MAAM,KAAKrtB,KAAK,IACR7B,mBAAmB+uC,EAAOn1B,EAAQq1B,EAAM1V,EAAO,KAEvE,GAAC,CAAA15B,IAAA,kBAAAC,MAED,WACI,IAAIovC,EACJ,gIAOc3yC,KAAK0xC,OAAS,KAAO1xC,KAAKmyC,QAAUnyC,KAAK2xC,KAPvD,wBAUA3xC,KAAKqyC,kBAAkBryC,KAAK+xC,WAV5B,sBAaA/xC,KAAKqyC,kBAAkBryC,KAAKgyC,SAb5B,aAgBAhyC,KAAKiyC,QAhBL,iBAmBAjyC,KAAKkyC,YAnBL,8BAwBAlyC,KAAK4yC,gBAAgB,oBAA0BD,EACnD,GAAC,CAAArvC,IAAA,kBAAAC,MAED,SAAgBsvC,EAAUC,GACtB,IAAI9a,EAAUxM,SAASqN,cAAc,KACrCb,EAAQkB,aAAa,OAAQ,iCAAmCz1B,mBAAmBqvC,IACnF9a,EAAQkB,aAAa,WAAY2Z,GACjC7a,EAAQkB,aAAa,SAAU,UAC/BlB,EAAQM,MAAMC,QAAU,OACxB/M,SAAS3lB,KAAKyzB,YAAYtB,GAC1BA,EAAQ+a,OACZ,sFAACjB,CAAA,CAtEoB,GCmBZkB,GAAY,SAAC1vC,EAAKC,GAAwB,IAAjB0vC,EAAM5kB,UAAArqB,OAAA,QAAArB,IAAA0rB,UAAA,GAAAA,UAAA,GAAG,IACvC6kB,EAAoB3vC,EAAQE,mBAAmBF,GAAS,GACxD6pC,EAAI,IAAIxqC,KACdwqC,EAAE+F,QAAQ/F,EAAEtmC,UAAsB,GAATmsC,EAAc,GAAK,GAAK,KACjD,IAAMG,EAAU,WAAahG,EAAEiG,cAC/B7nB,SAAS8nB,OAAS,GAAH5a,OAAMp1B,EAAG,KAAAo1B,OAAIwa,EAAiB,KAAAxa,OAAI0a,EAAO,uBAC1D,stBC1B2D,IAEtCG,GAAW,WAC9B,SAAAA,EAAYvb,gGAAS0H,CAAA,KAAA6T,GACnBvzC,KAAK2/B,GAAK3H,EACVh4B,KAAKklC,OAASllC,KAAK2/B,GAAGI,cAAc,gBACpC//B,KAAK6/B,MACP,WAmBC,SAnBA0T,KAAA,EAAAjwC,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACDowC,EDXiB,SAAAlwC,GACvB,IAAMmwC,EAAUjoB,SAAS8nB,OACzB,IAAIG,EAAS,OAAO,KACpB,IACMlwC,EADckwC,EAAQ9gB,MAAM,KAE/B+gB,QAAO,SAAAJ,GACN,KAA2B,MAArBA,EAAO7X,OAAO,IAAY6X,EAASA,EAAOb,UAAU,GAC1D,OAAOa,EAAO3gB,MAAM,KAAK,KAAOrvB,CAClC,IACC+B,KAAI,SAAAiuC,GACH,KAA2B,MAArBA,EAAO7X,OAAO,IAAY6X,EAASA,EAAOb,UAAU,GAC1D,OAAOa,EAAO3gB,MAAM,KAAK,EAC3B,IAAG,GAEL,OAAGpvB,EACMklC,mBAAmBllC,GAEnB,IAEX,CCRoBowC,CAAU,aAErBH,EAKc,QAAbA,GACFxzC,KAAK2/B,GAAGlB,UAAU9xB,OAAO,WAL5BqmC,GAAU,YAAa,OAAQ,GAC5BhzC,KAAK2/B,GAAGlB,UAAU9xB,OAAO,WAQ7B3M,KAAKklC,OAAOnb,iBAAiB,SAAS,SAAA0D,GAChCrqB,EAAKu8B,GAAGlB,UAAUC,IAAI,UACtBsU,GAAU,YAAa,QAAS,EAClC,GACN,sFAACO,CAAA,CAxB6B,2tBCFXK,GAAmB,WACtC,SAAAA,EAAY5b,gGAAS0H,CAAA,KAAAkU,GACnB5zC,KAAK2/B,GAAK3H,EACVh4B,KAAK6zC,UAAY7zC,KAAK2/B,GAAGqC,QAAQ8R,MACjC9zC,KAAK+zC,OAAS/zC,KAAK2/B,GAAGI,cAAc,WACpC//B,KAAKg0C,YAAch0C,KAAK2/B,GAAGI,cAAc,gBACzC//B,KAAKi0C,SAAWj0C,KAAK2/B,GAAGI,cAAc,aACtC//B,KAAKk0C,OAASl0C,KAAK2/B,GAAGI,cAAc,UACpC//B,KAAKm0C,WAAan0C,KAAK2/B,GAAGI,cAAc,qBACxC//B,KAAKo0C,YAAcp0C,KAAK2/B,GAAGI,cAAc,sBACzC//B,KAAKq0C,mBAAqBr0C,KAAKq0C,mBAAmBzX,KAAK58B,MACvDA,KAAKs0C,iBAAmBt0C,KAAKs0C,iBAAiB1X,KAAK58B,MACnDA,KAAKu0C,eAAiBv0C,KAAKu0C,eAAe3X,KAAK58B,MAC/CA,KAAKw0C,WAAax0C,KAAK2/B,GAAGI,cAAc,YACxC//B,KAAKy0C,KAAO,IAAI7xC,KAChB5C,KAAK00C,cAAgB10C,KAAK00C,cAAc9X,KAAK58B,MAC7CA,KAAK20C,uBAAyB30C,KAAK20C,uBAAuB/X,KAAK58B,MAC/DA,KAAK40C,gBAAiB,EACtB50C,KAAK60C,cAAe,EACpB70C,KAAK6/B,MACP,WAmIC,SAnIA+T,KAAA,EAAAtwC,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACC0xC,EAAU90C,KAAK00C,cAAc10C,KAAKy0C,KAAM,IAE9Cz0C,KAAKs0C,iBAAiBQ,EAAQC,eAE9B/0C,KAAK+zC,OAAOhqB,iBAAiB,UAAU,SAAA0D,GACZ,IAArBrqB,EAAK2wC,OAAOxwC,OACdH,EAAKwxC,gBAAiB,EAClBxxC,EAAKyxC,eACPzxC,EAAK8wC,OAAOc,UAAW,KAGzB5xC,EAAKwxC,gBAAiB,EACtBxxC,EAAK8wC,OAAOc,UAAW,EAE3B,IAEAh1C,KAAKg0C,YAAYjqB,iBAAiB,UAAU,SAAA0D,GACZ,IAA1BrqB,EAAK4wC,YAAYzwC,OACnBH,EAAKyxC,cAAe,EAChBzxC,EAAKwxC,iBACPxxC,EAAK8wC,OAAOc,UAAW,KAGzB5xC,EAAKyxC,cAAe,EACpBzxC,EAAK8wC,OAAOc,UAAW,EAE3B,IAEAh1C,KAAKk0C,OAAOnqB,iBAAiB,SAAS,SAAA0D,GACpCrqB,EAAKmxC,eAAeO,EAAQC,cAC9B,GACF,GAAC,CAAAzxC,IAAA,gBAAAC,MAED,SAAckxC,EAAMQ,GAClB,IAAMC,EAAW,IAAItyC,KAAK6xC,GAE1B,OADAS,EAASC,YAAYV,EAAKM,cAAgBE,GACnCC,CACT,GAAC,CAAA5xC,IAAA,mBAAAC,MAED,SAAiBivC,GAEf,IADA,IAAIyC,EAAQ,+CACHlxC,EAAI,KAAMA,GAAKyuC,EAAMzuC,IAC5BkxC,GAAgB,mBAAHvc,OAAsB30B,EAAC,MAAA20B,OAAK30B,EAAC,aAE5C/D,KAAKg0C,YAAY9N,UAAY+O,CAC/B,GAAC,CAAA3xC,IAAA,qBAAAC,MAED,WACE,IACM6xC,EADK9T,KAAKC,MAAMvhC,KAAKw0C,WAAWjU,aACjBl7B,KAAI,SAACgwC,EAAQhoB,GAChC,MAAO,aAAPqL,OACc,IAAVrL,EAAW,8FAAAqL,OAEMrL,EAAK,MAAAqL,OAAK2c,EAAOC,KAAI,qDAAA5c,OAErBrL,EAAK,MAAAqL,OAAK2c,EAAOC,KAAI,uBACvC,WAEL,IAAGhwC,KAAK,IAERtF,KAAK+zC,OAAO7N,UAAYkP,CAC1B,GAAC,CAAA9xC,IAAA,yBAAAC,MAEC,SAAuBgyC,GACvB,IAAIC,EAEAD,GAAe,MAAQA,EAAc,OACvCC,EAAgB,IAEdD,GAAe,MAAQA,EAAc,OACvCC,EAAgB,IAEdD,GAAe,MAAQA,EAAc,OACvCC,EAAgB,IAEdD,GAAe,MAAQA,EAAc,OACvCC,EAAgB,IAEdD,GAAe,MAAQA,EAAc,OACvCC,EAAgB,IAEdD,GAAe,MAAQA,EAAc,OACvCC,EAAgB,IAEdD,GAAe,MAAQA,EAAc,OACvCC,EAAgB,IAEdD,GAAe,MAAQA,EAAc,OACvCC,EAAgB,IAEdD,GAAe,OACjBC,EAAgB,IAGlB,IACIC,EAAsBD,GADhBx1C,KAAKy0C,KAAKM,cAAgBQ,GAOpC,OAJIE,EAAsB,IACxBA,EAAsB,GAGjBA,CACT,GAAC,CAAAnyC,IAAA,iBAAAC,MAED,WACE,IAAImyC,EAAgB11C,KAAK+zC,OAAOxwC,MAC5BgyC,EAAcv1C,KAAKg0C,YAAYzwC,MAC/BoyC,EAAoC,GAAzB7pB,OAAO9rB,KAAK6zC,WAEvB+B,EADqC,GAAxB9pB,OAAO4pB,GACSC,EAE3BF,EAAsBz1C,KAAK20C,uBAAuBY,GAEpDM,EAAeD,EAAgBH,EAE/BtB,EAAa,IAAI2B,KAAKC,aAAa,QAAQ,CAACzd,MAAO,WAAY0d,SAAU,QAAQC,OAAOL,GACxFM,EAAqB,IAAIJ,KAAKC,aAAa,QAAQ,CAACzd,MAAO,WAAY0d,SAAU,QAAQC,OAAOJ,GAEhGM,EAAO,IAAIL,KAAKC,aAAa,QAAQ,CAACzd,MAAO,WAAY0d,SAAU,QAAQC,OAAOL,GACtF9Y,QAAQjT,IAAI,SAAUssB,GAEtBn2C,KAAKm0C,WAAWzL,UAAYkN,GAAiB,EAAI,GAAHld,OAAMyb,GAAU,mBAE5Dn0C,KAAKo0C,YAAY1L,UADfkN,GAAiB,GAA4B,GAAvBH,EACK,GAAH/c,OAAOyb,GAEJ0B,GAAgB,EAAI,GAAHnd,OAAMwd,GAAkB,kBAG1E,sFAACtC,CAAA,CAvJqC,GCDjC,SAASwC,GAAe1tC,GAO7B,MALuB,gFAAHgwB,OAEdhwB,EAAK2tC,WAAWC,SAASC,OAAM,mBAIvC,CCRO,SAASC,GAAc9tC,GAE5B,IAAI+tC,EAAS,GAEb,OAAQ/tC,EAAK2tC,WAAWK,WAAWC,OACjC,IAAK,WACHF,EAAS,cACT,MACF,IAAK,UACHA,EAAS,aACT,MACF,IAAK,UAML,QACEA,EAAS,mBAJX,IAAK,YACHA,EAAS,eAoBb,MAbsB,gMAAH/d,OAEiG+d,EAAM,8MAAA/d,OAMzF,IAAzBhwB,EAAK2tC,WAAW5U,MAAc,4CAAH/I,OAA+ChwB,EAAK2tC,WAAW5U,MAAK,QAAS,GAAE,cAAA/I,OAC/E,IAA3BhwB,EAAK2tC,WAAW3U,QAAgB,GAAHhJ,OAAMhwB,EAAK2tC,WAAW3U,QAAQ6U,QAAW,GAAE,iCAKlF,CCnCO,SAASK,GAAgBluC,GAiB9B,MAbwB,yFAAHgwB,OAEU,IAAzBhwB,EAAK2tC,WAAW5U,MAAc,6EAAH/I,OAAgFhwB,EAAK2tC,WAAW5U,MAAK,SAAU,GAAE,oEAAA/I,OAIxIhwB,EAAK2tC,WAAWQ,cAAcC,MAAMzxC,KAAI,SAAC0xC,EAAe1pB,GACtD,OCZP,SAAuB3kB,GAgB5B,MAfsB,4VAAHgwB,OAKEhwB,EAAKg5B,QAAQ2U,WAAW5U,MAAK,yJAAA/I,OAAwJhwB,EAAKg5B,QAAQ2U,WAAW5U,MAAK,yYAAA/I,OAIzNhwB,EAAKg5B,QAAQ2U,WAAWnE,YAAYqE,OAAM,0GAO1D,CDLqBS,CAAcD,EACvB,IAAGzxC,KAAK,IAAG,6CAOvB,CEpBO,SAAS2xC,GAAYvuC,GAY1B,MAXoB,2aAAHgwB,OAKoChwB,EAAK2tC,WAAWa,MAAK,wBAAAxe,OAClC,IAA1BhwB,EAAK2tC,WAAWc,OAAe,6BAAHze,OAAgChwB,EAAK2tC,WAAWc,OAAM,QAAS,GAAE,sEAM7G,CCbO,SAASC,GAAY1uC,GAE1B,IAAM2uC,EAAY3uC,EAAK2tC,WAAWiB,MAAM,GAAGC,MAAMC,MAAK,SAAAC,GAAI,MAAmB,gBAAfA,EAAKC,KAAuB,IAU1F,MARoB,kOAAHhf,OAI8BhwB,EAAK2tC,WAAWiB,MAAM,GAAGn0C,IAAG,SAAAu1B,OAAQ2e,EAAUM,YAAW,GAAAjf,OAAI2e,EAAUM,YAAYC,GAAE,KAAAlf,OAAI2e,EAAUM,YAAYE,GAAE,KAAAnf,OAAI2e,EAAUM,YAAYG,GAAE,KAAApf,OAAI2e,EAAUM,YAAYI,IAAE,GAAK,WAAArf,OAAU2e,EAAU9qB,MAAK,YAAAmM,OAAW2e,EAAU/qB,OAAM,0HAKnR,qtBCT0D,IAErC0rB,GAAmB,WACtC,SAAAA,EAAYhgB,gGAAS0H,CAAA,KAAAsY,GACnBh4C,KAAK2/B,GAAK3H,EAEVh4B,KAAKi4C,QAAU,GACfj4C,KAAKk4C,WACLl4C,KAAKm4C,uBAAyBn4C,KAAK2/B,GAAGI,cAAc,4BACpD//B,KAAKo4C,UAAYp4C,KAAK2/B,GAAGqC,QAAQqW,UACjCr4C,KAAKs4C,gBAAkBt4C,KAAK2/B,GAAGqC,QAAQuW,gBACvCv4C,KAAKw4C,YAAcx4C,KAAKw4C,YAAY5b,KAAK58B,MACzCA,KAAKy4C,iBAAmBz4C,KAAKy4C,iBAAiB7b,KAAK58B,MACnDA,KAAK04C,UAAY14C,KAAK04C,UAAU9b,KAAK58B,MACrCA,KAAK24C,eAAiB34C,KAAK24C,eAAe/b,KAAK58B,MAC/CA,KAAK44C,kBAAoB54C,KAAK44C,kBAAkBhc,KAAK58B,MACrDA,KAAK6/B,MACP,WAkNC,SAlNAmY,KAAA,EAAA10C,IAAA,OAAAC,MACD,WAAO,IAAAH,EAAA,KACDy1C,EAAc74C,KAAK2/B,GAAGI,cAAc,UACpC8Y,GAAe74C,KAAKs4C,iBAEtBO,EAAY9uB,iBAAiB,SAAS,WACpC3mB,EAAKo1C,YAAYp1C,EAAKg1C,UACxB,GAEJ,GAAC,CAAA90C,IAAA,cAAAC,MAED,SAAYo5B,GAAI,IAAA8G,EAAA,KACRqV,EAAa,qCAAHpgB,OAAwCiE,GACxDgJ,MAAMmT,GACHtvC,MAAK,SAAC/D,GAAQ,OAAKA,EAASqgC,MAAM,IAClCt8B,MAAK,SAACV,GAAM,OAAK26B,EAAKgV,iBAAiB3vC,EAAO,IAC9Ci9B,OAAM,SAAC99B,GAAK,OAAK60B,QAAQjT,IAAI,QAAS5hB,EAAM,GACjD,GAAC,CAAA3E,IAAA,mBAAAC,MAED,SAAiBuiC,GAAM,IAAAQ,EAAA,KACfyS,EAAe,2IAAHrgB,OAEoDoN,EAAKkT,SAAQ,mDAAAtgB,OAExEoN,EAAKoM,YAAW,kCAAAxZ,QAIpB14B,KAAKi4C,QAAQj0C,OAAS,EAAKhE,KAAKi4C,QAAQj4C,KAAKi4C,QAAQj0C,OAAS,GAAG24B,IAAMmJ,EAAKnJ,IAAM38B,KAAKi4C,QAAQj0C,OAAS,EAAKhE,KAAKk4C,WAAal4C,KAAKi4C,QAAQj4C,KAAKi4C,QAAQj0C,OAAS,GAAG24B,GAAO38B,KAAKk4C,WAAal4C,KAAKi4C,QAAQj4C,KAAKi4C,QAAQj0C,OAAS,GAAG24B,GAAQ38B,KAAKk4C,WAAal4C,KAAKo4C,UACpQtS,EAAKnJ,IAAM38B,KAAKo4C,UAAS,mRAAA1f,OAE6O14B,KAAKk4C,WAAU,+OAM/Q,gHAAAxf,OAONoN,EAAKmS,QACF5yC,KAAI,SAAC4zC,EAAQ31C,GACZ,MAAO,mKAAPo1B,OAEsDp1B,EAAG,2BAAAo1B,OAA0BugB,EAAOC,OAAM,eAAAxgB,OAAcugB,EAAOE,SAAQ,oBAAAzgB,OAAmBugB,EAAOG,aAAY,MAAA1gB,OAAK4N,EAAK2R,QAAQoB,MAAK,SAAC3wC,GAAI,OAAKA,EAAKi0B,IAAMmJ,EAAKnJ,IAAMj0B,EAAKuwC,QAAUA,EAAOC,MAAM,IAAI,UAAH,GAAiB,wDAAAxgB,OACnOp1B,EAAG,MAAAo1B,OAAKugB,EAAOA,OAAM,4CAG5D,IACC3zC,KAAK,IAAG,uCAKjBtF,KAAKm4C,uBAAuBpuB,iBAC1B,iBACA,WACEuc,EAAK6R,uBAAuBjS,UAAY,GACxCI,EAAK6R,uBAAuB7M,mBAAmB,YAAayN,GAE5DzS,EAAK6R,uBAAuB1Z,UAAU9xB,OAAO,YAG1B25B,EAAK6R,uBAAuBna,iBAAiB,qBACnD7Q,SAAQ,SAACmsB,GACpBA,EAAYvvB,iBAAiB,UAAU,WACrCuc,EAAKsS,kBAAkB9S,EAAKnJ,GAAI2c,EAAY/1C,OACR,QAAhC+1C,EAAYtX,QAAQuX,SACtBjT,EAAKoS,UAAUY,EAAYtX,QAAQ1+B,KAEnCgjC,EAAKkS,YAAYc,EAAY/1C,MAEjC,GACF,IAGA,IAAIi2C,EAAalT,EAAK6R,uBAAuBpY,cAAc,uBACvDyZ,GACFA,EAAWzvB,iBAAiB,SAAS,WACnC,IAAM0vB,EAAeD,EAAWxX,QAAQ0X,OAElCrsB,EAAQiZ,EAAK2R,QAAQ0B,WAAU,SAACjxC,GAAI,OAAKA,EAAKi0B,KAAO8c,CAAY,IACvEnT,EAAK2R,QAAQ9pB,OAAOd,EAAO,GAE3BiZ,EAAKkS,YAAYiB,EACnB,GAEJ,GACA,CAAEG,MAAM,IAGV55C,KAAKm4C,uBAAuB1Z,UAAUC,IAAI,WAC5C,GAAC,CAAAp7B,IAAA,YAAAC,MAED,SAAUD,GAAK,IAAAu2C,EAAA,KACPf,EAAa,yCAAHpgB,OAA4Cp1B,GAG5DqiC,MAAMmT,EAFiB,CAAElT,QAAS,CAAE,UAAW,gBAG5Cp8B,MAAK,SAAC/D,GAAQ,OAAKA,EAASqgC,MAAM,IAClCt8B,MAAK,SAACV,GACLg0B,QAAQjT,IAAI,iBAAe/gB,GAC3B+wC,EAAKlB,eAAe7vC,EACtB,IACCi9B,OAAM,SAAC99B,GAAK,OAAK60B,QAAQjT,IAAI,QAAS5hB,EAAM,GACjD,GAAC,CAAA3E,IAAA,iBAAAC,MAED,SAAeuiC,GAAM,IAAAgU,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,KACfC,EAAa,uOAAH1hB,OAGgFoN,EAAKuQ,WAAWvtC,OAAM,+CAAA4vB,OACnFoN,EAAKuQ,WAAWgE,gBAAgB9D,OAAM,kDAAA7d,OAGhD,QAAfohB,EAAAhU,EAAKuQ,kBAAU,IAAAyD,GAAfA,EAAiBQ,YAAW,iBAAA5hB,OAIX,QADfqhB,EACAjU,EAAKuQ,kBAAU,IAAA0D,GAAa,QAAbC,EAAfD,EAAiBO,mBAAW,IAAAN,OAAb,EAAfA,EAA8BlD,MAC3BzxC,KAAI,SAACk1C,GACJ,OAAOJ,EAAKK,yBAAyBD,EACvC,IACCj1C,KAAK,IAAG,6BAGP,4GAAAozB,OAMS,QAAfuhB,EAAAnU,EAAKuQ,kBAAU,IAAA4D,GAAfA,EAAiB3C,MAAK,iBAAA5e,OAEC,QAFDwhB,EAEpBpU,EAAKuQ,WAAWiB,aAAK,IAAA4C,OAAA,EAArBA,EAAuB70C,KAAI,SAACiyC,GAE5B,MAAO,0FAAP5e,OAEe4e,EAAMn0C,IAAG,SAAAu1B,OAAQ4e,EAAMlmB,KAAI,8CAG5C,IAAE,qCAEI,wBAKdpxB,KAAKm4C,uBAAuB1Z,UAAUC,IAAI,YAC1C1S,YAAW,WACTmuB,EAAKhC,uBAAuBjS,UAAY,GACxCiU,EAAKhC,uBAAuB1Z,UAAU9xB,OAAO,YAC7CwtC,EAAKhC,uBAAuB7M,mBAAmB,YAAa8O,EAC9D,GAAG,IACL,GAAC,CAAA92C,IAAA,2BAAAC,MAED,SAAyBuiC,GAEvB,IACIpE,EAAU,GACd,OAFkBoE,EAAKpE,QAAQ/9B,aAG7B,IAAK,iBACH+9B,EAAU0U,GAAetQ,EAAKpE,SAC9B,MACF,IAAK,gBACHA,EAAU8U,GAAc1Q,EAAKpE,SAC7B,MACF,IAAK,kBACHA,EAAUkV,GAAgB9Q,EAAKpE,SAC/B,MACF,IAAK,cACHA,EAAU0V,GAAYtR,EAAKpE,SAC3B,MACF,IAAK,cACHA,EAAUuV,GAAYnR,EAAKpE,SAC3B,MACF,QACE,MAAO,GAEX,OAAOA,CACT,GAAC,CAAAp+B,IAAA,sBAAAC,MAED,WACE,IAAIk3C,EAAkBz6C,KAAK06C,eAAe1c,iBAAiB,oBACvDyc,GACFA,EAAgBttB,SAAQ,SAACzkB,GACvB,OAAQA,EAAKs5B,QAAQ2Y,WACnB,IAAK,YACH,IAAI/P,SAASliC,GACb,MACF,IAAK,YACH,IAAI84B,UAAU94B,GAIpB,GAEJ,GAAC,CAAApF,IAAA,oBAAAC,MAED,SAAkBo5B,EAAIsc,GAEhBj5C,KAAKi4C,QAAQoB,MAAK,SAAC3wC,GAAI,OAAKA,EAAKi0B,IAAMA,CAAE,IAC3C38B,KAAKi4C,QAAQT,MAAK,SAAC9uC,GAAI,OAAKA,EAAKi0B,IAAMA,CAAE,IAAEsc,OAASA,EAEpDj5C,KAAKi4C,QAAQ7oB,KAAK,CAAEuN,GAAIA,EAAIsc,OAAQA,GAExC,sFAACjB,CAAA,CAjOqC,GCH3B4C,GAAY,WACvB,OAAOj6C,OAAOk6C,WAAW,uBAAuBC,OAClD,ECLO,SAASC,GAAWC,EAAWC,EAAWtnB,GAM/C,MALmB,iFAAH+E,OAC4DuiB,EAAS,wKAAAviB,OACyE/E,EAAQ,0BAIxK,CCPO,SAASuR,GAAOx8B,EAAM1B,EAAMk0C,GAKjC,MAJe,YAAHxiB,OAA6B,MAAdhwB,EAAKyyC,MAAgBzyC,EAAKyyC,MAAMn4C,KAAO0F,EAAKvF,IAAG,MAAAu1B,OAAa,IAAR1xB,EAAa,2BAAH,GAAkC,sNAAA0xB,OAAsNwiB,EAAU,GAAG,kBAAsB,gCAAAxiB,OAA+BhwB,EAAK+4B,MAAK,6IAK/Z,CCNO,SAAS2Z,GAAeC,EAAgBC,EAAMjnB,GAWnD,MAVuB,sCAAHqE,OACarE,EAAQ,GAAHqE,OAAMrE,GAAK,GAAO,6NAAAqE,OAE4C4iB,EAAKC,YAAc,mBAAH,GAA0B,kFAAA7iB,OAE9G2iB,EAAc,8CAMhD,CCVO,SAASG,GAAqB1V,EAAM2V,GACzC,IAAIF,EAAcE,EAAYF,YAC1BG,EAAW5V,EAAKuQ,WAAWsF,wBAM/B,MAJ6B,SAAHjjB,OACtBoN,EAAKuQ,WAAWuF,YAAc9V,EAAKuQ,WAAWuF,WAAW53C,OAAS,GAAMu3C,GAAgBA,IAAgBG,EAAYxW,GAAOY,EAAKuQ,WAAWuF,WAAW,GAAI,cAAgB,GAAwC,IAAlC9V,EAAKuQ,WAAWgF,eAAuBD,GAAetV,EAAKuQ,WAAWgF,eAAgBI,GAAe,GAAE,oBAAA/iB,OACvRoN,EAAKuQ,WAAWuF,YAAc9V,EAAKuQ,WAAWuF,WAAW53C,OAAS,GAAK8hC,EAAKuQ,WAAWwF,sBAA0D,IAAlC/V,EAAKuQ,WAAWgF,eAAuBD,GAAetV,EAAKuQ,WAAWgF,eAAgBI,EAAaF,EAAc,GAAH,UAAoB,GAAE,QAGzP,CCXO,SAASO,GAAoBC,EAAUjW,EAAM4U,GAElDqB,EAASrI,QAAO,SAAChrC,GAAI,OAAKA,EAAKszC,aAAelW,EAAKnJ,EAAE,IAAE,GAAG4e,aAAc,EAExE,IAAIU,EAAkBvB,EAAe3a,cAAc,2BAGnD,OAFAkc,EAAgBxd,UAAUC,IAAI,WAC9Bud,EAAgBxd,UAAUC,IAAI,cACvBod,EACT,CCRO,SAASI,GAA+BxzC,EAAM1C,EAAMywB,GACzD,IAAI0lB,EAAgB,MAAHzjB,OAAsB,aAAbjC,EAA0B,sBAAH,GAA6B,KAAAiC,OAAI1yB,EAAI,QAGtF,OAFA0C,EAAK4iC,mBAAmB7U,EAAU0lB,GAE3BD,EACT,qtBCUqF,IAEhEE,GAAS,WAC5B,SAAAA,EAAYpkB,gGAAS0H,CAAA,KAAA0c,GACnBp8C,KAAK2/B,GAAK3H,EACVh4B,KAAKq8C,QAAUr8C,KAAK2/B,GAAGqC,QAAQsa,QAC/Bt8C,KAAK06C,eAAiB16C,KAAK2/B,GAAGI,cAAc,oBAC5C//B,KAAKu8C,UAAYv8C,KAAK2/B,GAAGqC,QAAQua,UACjCv8C,KAAK+7C,SAAW,CAAC,EACjB/7C,KAAKw8C,SAAW,GAChBx8C,KAAKy8C,kBAAoB,EACzBz8C,KAAK08C,OAAS18C,KAAK2/B,GAAGqC,QAAQ2a,IAE9B38C,KAAK48C,eAAiB58C,KAAK48C,eAAehgB,KAAK58B,MAC/CA,KAAK68C,kBAAoB78C,KAAK68C,kBAAkBjgB,KAAK58B,MACrDA,KAAK88C,cAAgB98C,KAAK88C,cAAclgB,KAAK58B,MAC7CA,KAAK+8C,iBAAmB/8C,KAAK+8C,iBAAiBngB,KAAK58B,MACnDA,KAAKg9C,kBAAoBh9C,KAAKg9C,kBAAkBpgB,KAAK58B,MACrDA,KAAKw6C,yBAA2Bx6C,KAAKw6C,yBAAyB5d,KAAK58B,MACnEA,KAAKi9C,oBAAsBj9C,KAAKi9C,oBAAoBrgB,KAAK58B,MACzDA,KAAKk9C,oBAAsBl9C,KAAKk9C,oBAAoBtgB,KAAK58B,MACzDA,KAAKm9C,eAAiBn9C,KAAKm9C,eAAevgB,KAAK58B,MAE/CA,KAAK6/B,MACP,WAkXC,SAlXAuc,IAAA,EAAA94C,IAAA,OAAAC,MACD,WACMvD,KAAKq8C,SACPr8C,KAAK88C,cAAc98C,KAAKq8C,QAAS,YAErC,GAAC,CAAA/4C,IAAA,iBAAAC,MAED,SAAe+4C,EAASc,GAAU,IAAAh6C,EAAA,KAC5BoiC,EAAY,IAAIC,QACpBD,EAAUE,OAAO,UAAW,cAE5B,IAAI2X,EAAiB,CACnBtgB,OAAQ,MACR6I,QAASJ,EACTK,SAAU,UAGZF,MAAM,yCAADjN,OAA0C4jB,GAAWe,GACvD7zC,MAAK,SAAC/D,GAAQ,OAAKA,EAASqgC,MAAM,IAClCt8B,MAAK,SAACV,GAEE,cADCs0C,EAEJh6C,EAAKy5C,kBAAkB/zC,IAIlB8xC,MACHx3C,EAAKu8B,GAAG2d,cAAc7e,UAAUC,IAAI,kBAEtCt7B,EAAK45C,kBAAkBl0C,GAG7B,IACCi9B,OAAM,SAAC99B,GAAK,OAAK60B,QAAQjT,IAAI,QAAS5hB,EAAM,GACjD,GAAC,CAAA3E,IAAA,oBAAAC,MAED,SAAkBuiC,GAAM,IAAArC,EAAA,KAClB8Z,EAAO,2KAAH7kB,OAG0B14B,KAAKu8C,UAAS,kGAAA7jB,OACsCoN,EAAKuQ,WAAW5U,MAAK,qBAAA/I,OACnGoN,EAAKuQ,WAAWnE,YAAYqE,OAAM,oEAAA7d,OAEEoN,EAAKuQ,WAAWK,WAAa5Q,EAAKuQ,WAAWK,WAAWC,MAAQ,GAAE,8BAAAje,OACtG14B,KAAK+8C,iBAAiB/8C,KAAK+7C,UAAS,gDAI5C/7C,KAAK06C,eAAepP,mBAAmB,YAAaiS,GACpD,IAAIC,EAAiBx9C,KAAK06C,eAAe1c,iBAAiB,2BACtDwf,GACFA,EAAerwB,SAAQ,SAACzkB,GACtBA,EAAKqhB,iBAAiB,SAAS,SAAC0D,GAC9BgW,EAAKmZ,eAAel0C,EAAKs5B,QAAQyb,QAAS,YAC5C,GACF,GAEJ,GAAC,CAAAn6C,IAAA,gBAAAC,MAED,SAAc+4C,EAAShB,GAAM,IAAAhV,EAAA,KACvBd,EAAY,IAAIC,QACpBD,EAAUE,OAAO,UAAW,cAE5B,IAAI2X,EAAiB,CACnBtgB,OAAQ,MACR6I,QAASJ,EACTK,SAAU,UAGZF,MAAM,eAADjN,OAAgB4jB,EAAO,oBAAA5jB,OAAmB14B,KAAK08C,QAAUW,GAC3D7zC,MAAK,SAAC/D,GAAQ,OAAKA,EAASqgC,MAAM,IAClCt8B,MAAK,SAACV,GACLw9B,EAAKmW,kBAAoB3zC,EAAO40C,eAChCpX,EAAKyV,SAAWjzC,EAAO60C,MAMnBrX,EAAKsW,eAAetW,EAAK+V,QAAS,YAGxC,IACCtW,OAAM,SAAC99B,GAAK,OAAK60B,QAAQjT,IAAI,QAAS5hB,EAAM,GACjD,GAAC,CAAA3E,IAAA,mBAAAC,MAED,SAAiBuiC,GAMf,OALcA,EACXzgC,KAAI,SAACqD,EAAM2kB,GACV,MAAO,yBAAPqL,OAAgChwB,EAAKszC,WAAU,sBAAAtjB,OAAqBhwB,EAAKk1C,UAAS,mQAAAllB,OAAkQhwB,EAAK6yC,YAAc,+BAAH,eAAkD,YAAA7iB,OAAWhwB,EAAKm1C,WAAU,qBAAAnlB,OAAoBhwB,EAAKo1C,UAAS,6BACpd,IACCx4C,KAAK,GAEV,GAAC,CAAAhC,IAAA,sBAAAC,MAED,SAAoBuiC,EAAM2V,GAMxB,OALc3V,EACXzgC,KAAI,SAACqD,EAAM2kB,GACV,MAAO,WAAPqL,OAAkB+iB,IAAgB/yC,EAAKszC,WAAa,mBAAH,GAA0B,oBAAAtjB,OAAmBhwB,EAAKszC,WAAU,sBAAAtjB,OAAqBhwB,EAAKk1C,UAAS,aAAAllB,OAAY+iB,IAAgB/yC,EAAKszC,WAAa,aAAH,GAAoB,sRAAAtjB,OAAqRhwB,EAAK6yC,YAAc,qBAAH,GAA4B,YAAA7iB,OAAWhwB,EAAKm1C,WAAU,0BAC5iB,IACCv4C,KAAK,GAEV,GAAC,CAAAhC,IAAA,oBAAAC,MAED,SAAkBuiC,EAAM8X,GAAW,IAAA/D,EAAA,KAC7BmB,EAAYh7C,KAAKu8C,UACjBtB,EAAYnV,EAAKuQ,WAAW5U,MAC5B9N,EAAWmS,EAAKuQ,WAAW1iB,SAC3BoqB,EAAOjY,EAAKuQ,WAAW3U,QAAQoV,MAC/BkH,EAAaD,EAAK,GAAGE,MAAMj6C,OACzBy3C,EAAcz7C,KAAK+7C,SAASrI,QAAO,SAAChrC,GAAI,OAAKA,EAAKszC,aAAelW,EAAKnJ,EAAE,IAAE,GAC1EuhB,EAAY,iJAAHxlB,OAEX14B,KAAKk9C,oBAAoBl9C,KAAK+7C,SAAUjW,EAAKnJ,IAAG,qPAAAjE,OAIkE14B,KAAKy8C,kBAAiB,6FAAA/jB,OAE9E14B,KAAKy8C,kBAAoB,IAAMz8C,KAAKy8C,kBAAoB,GAAK,mBAAH,GAA0B,KAAA/jB,OAAI14B,KAAKy8C,mBAAqB,GAAK,oBAAH,GAA2B,kBAAA/jB,OAAiB14B,KAAKy8C,kBAAiB,OAAA/jB,OAAM14B,KAAKy8C,kBAAiB,6LAAA/jB,OAKvO,IAAfslB,EAAmB,OAAH,GAAc,MAAAtlB,OAAKsiB,EAAS,kBAAAtiB,OAGjD,IAAfslB,GAAqBJ,EAAyD,GAA7C7C,GAAWC,EAAWC,EAAWtnB,GAAc,cAAA+E,OAIhFklB,EAAS,+EAAAllB,OAEyDoN,EAAKuQ,WAAW8H,aAAY,gEAAAzlB,OAChDoN,EAAKuQ,WAAW+H,mBAAmB7H,OAAM,sHAAA7d,OAEjFwM,GAAOY,EAAKuQ,WAAWgI,cAAc,GAAI,gBAAgB,GAAK,wCAG9D,0BAAA3lB,OAKPklB,EAgDoK,GAhD3J,wGAAAllB,OAMRqlB,EACG14C,KAAI,SAACqD,EAAM41C,GAEV,OAAO51C,EAAKu1C,MACT54C,KAAI,SAACk5C,EAAMlxB,GACV,MAAO,uDAAPqL,OACkC6lB,EAAKC,WAAU,wBAAA9lB,OAGzB,GAAxBqlB,EAAK,GAAGE,MAAMj6C,QAAyB,IAAVqpB,GAA8B,IAAfixB,EAAmBvD,GAAWlB,EAAK0C,UAAWzW,EAAKuQ,WAAW5U,MAAOqE,EAAKuQ,WAAW1iB,UAAY,GAAE,sBAAA+E,OAI/I6lB,EAAKzH,MACFzxC,KAAI,SAACk1C,GACJ,OAAOV,EAAKW,yBAAyBD,EACvC,IACCj1C,KAAK,IAAG,sBAAAozB,QAIV+iB,EAAYmC,WAAaU,EAAa,IAAMP,EAAK/5C,QAA8B,IAApBu6C,EAAKC,YAA8B,IAAVnxB,GAAeutB,KAAcY,GAAqB1V,EAAM2V,GAAe,GAAE,yCAGhK,IACCn2C,KAAK,GACV,IACCA,KAAK,IAAG,gCAAAozB,QAMT+iB,EAAYmC,WAAoD,IAAvCG,EAAKA,EAAK/5C,OAAS,GAAGi6C,MAAMj6C,QAAgB42C,OAAkBA,OAAgBa,EAAYmC,UAAU,8HAAAllB,OAGvH8iB,GAAqB1V,EAAM2V,GAAY,uDAGzC,0BAAA/iB,OAGR+iB,EAAYmC,UAAY,0EAAHllB,OCxOtB,SAAqBoe,EAAO6G,GACjC,IAAIc,GAA4B,EAEhCd,EAAMxwB,SAAQ,SAACzkB,GACRA,EAAKk1C,WACHl1C,EAAK6yC,cACRkD,GAA4B,EAGlC,IAEA,IACIC,EAAc5H,EACfzxC,KAAI,SAACqD,EAAM2kB,GACV,MAAO,4DAAPqL,OAC6D,IAAVrL,GAAeoxB,EAA4B,eAAH,GAAsB,kBAAA/lB,OAAiBrL,EAAK,mIAAAqL,OAE5EhwB,EAAKg5B,QAAQ2U,WAAW5U,MAAK,2DAAA/I,OAC7CrL,EAAQ,EAAC,OAAAqL,OAAMoe,EAAM9yC,OAAM,sFAAA00B,OAG9ChwB,EAAKg5B,QAAQ2U,WAAW4B,QAAQnB,MAC7CzxC,KAAI,SAAC4zC,EAAQ0F,GACZ,MAAO,2HAAPjmB,OAEqCugB,EAAOvX,QAAQ/E,GAAE,mBAAAjE,OAAkBrL,EAAQ,EAAC,aAAAqL,OAAYugB,EAAOvX,QAAQ2U,WAAWuI,UAAS,yEAAAlmB,OACvGugB,EAAOvX,QAAQ/E,GAAE,aAAAjE,OAA2B,GAAfimB,EAAmB,IAAqB,GAAfA,EAAmB,IAAqB,GAAfA,EAAmB,IAAM,IAAG,MAAAjmB,OAAKugB,EAAOvX,QAAQ2U,WAAWwI,eAAc,0DAGnL,IACCv5C,KAAK,IAAG,8QASrB,IACCA,KAAK,IAQR,MANc,8IAAHozB,OAESgmB,EAAW,uEAKjC,CDuL0GA,CAAY5Y,EAAKuQ,WAAWyI,KAAKhI,MAAO92C,KAAK+7C,UAAS,aAAa,YAE/J,YAAArjB,OAENklB,EAAY,SAAH,GAAgB,mHAAAllB,OAGD+iB,EAAYsD,SAAQ,+GAAArmB,OAAuI,OAAzB+iB,EAAYsD,SAAoB,YAAH,GAAmB,uJAAArmB,OAElL+iB,EAAYuD,SAAQ,+GAAAtmB,OAAuI,OAAzB+iB,EAAYuD,SAAoB,YAAH,GAAmB,oIAI9Mh/C,KAAK06C,eAAejc,UAAUC,IAAI,YAClC1S,YAAW,WACT6tB,EAAKa,eAAexU,UAAY,GAChC2T,EAAKa,eAAepP,mBAAmB,YAAa4S,GACpDrE,EAAKoD,sBAEL,IAAIgC,EAAuBpF,EAAKa,eAAe3a,cAAc,sBACzD1E,EAAQwe,EAAKa,eAAe3a,cAAc,UAC9C,GAAIkf,GAAwB5jB,EAAO,CACjC,IAAI6jB,EAAoBD,EAAqBpd,aAC7CxG,EAAM/C,MAAM6mB,UAAY,GAAHzmB,OAAMwmB,EAAiB,KAC9C,CAEA,IEhQAE,EFgQIN,EAAOjF,EAAKa,eAAe3a,cAAc,qBAC7C,GAAI+e,EAAM,EEjQVM,EFkQsBN,EElQD9gB,iBAAiB,uBAGxCohB,EAAcjyB,SAAQ,SAAC6rB,GACrBA,EAASjvB,iBAAiB,SAAS,SAAC0D,GAClC,GAAsB,SAAlBA,EAAE+M,OAAOj3B,MACXkqB,EAAE+M,OAAO8iB,cAAcA,cAAcA,cAAcA,cAAcvd,cAAc,gBAAgBtB,UAAU9xB,OAAO,iBAC3G,CACL8gB,EAAE+M,OAAO8iB,cAAcA,cAAcA,cAAcA,cAAcvd,cAAc,gBAAgBtB,UAAUC,IAAI,aAE7G,IAAI2gB,EAAW5xB,EAAE+M,OAAO8kB,QAAQ,eAC5BC,EAAYF,EAAS/B,cAGzB,GAAI+B,EAAS9X,mBAAoB,CAE/B,GAAI8X,EAASG,wBAA0B5E,KAAa,CAClD,IAAI6E,EAA2C,MAA3BJ,EAASrd,QAAQ3U,MAAgBgyB,EAASK,WAAa,GAAKL,EAASK,WACzFH,EAAUjnB,MAAMqnB,UAAY,oBAAHjnB,OAAuB+mB,EAAa,OAC/D,CAEA,IAAK7E,KAAa,CAChB,IAAI6E,EAA2C,MAA3BJ,EAASrd,QAAQ3U,MAAgBgyB,EAAS9X,mBAAmBmY,WAAa,GAAKL,EAAS9X,mBAAmBmY,WAC/HH,EAAUjnB,MAAMqnB,UAAY,oBAAHjnB,OAAuB+mB,EAAa,OAC/D,CAGAJ,EAAS5gB,UAAU9xB,OAAO,gBAC1B0yC,EAAS9X,mBAAmB9I,UAAUC,IAAI,eAC5C,CACF,CACF,GACF,IFoOI,IAEIkhB,EAFgBd,EAAK/e,cAAc,4BAEO/B,iBAAiB,uBAC3D4hB,IGzQL,SAA4B9Z,GAEjC,IAAI+Z,GAAqB,EAMzB,OALA/Z,EAAK3Y,SAAQ,SAACzkB,GACPA,EAAK6yC,cACRsE,GAAqB,EAEzB,IACOA,CACT,CHgQ0CA,CAAmBhG,EAAKkC,WACxD6D,EAA0BzyB,SAAQ,SAACzkB,GACjCA,EAAKqhB,iBAAiB,UAAU,SAAC0D,GAC3B/kB,EAAKm4B,SAA0B,SAAfn4B,EAAKnF,OACvBs2C,EAAKmD,kBAAkBlX,GAAM,EAEjC,GACF,GAEJ,CAEAnlC,OAAOgsB,SAAS,EAAG,GAEnBktB,EAAKa,eAAejc,UAAU9xB,OAAO,YAErC,IAAImzC,EAAcjG,EAAKa,eAAe1c,iBAAiB,kBACnD8hB,GACFA,EAAY3yB,SAAQ,SAACzkB,GACnBA,EAAKqhB,iBAAiB,SAAS,SAAC0D,GACC,SAA3B/kB,EAAKs5B,QAAQ+d,UACflG,EAAK+C,eAAel0C,EAAKs5B,QAAQyb,QAAS,eAE1C5D,EAAK+C,eAAel0C,EAAKs5B,QAAQyb,QAAS,YAE9C,GACF,IAEF,IAAI7B,EAAa/B,EAAKa,eAAe3a,cAAc,8BAC/CigB,EAAYnG,EAAKa,eAAe3a,cAAc,8BAqBlD,GAnBI6b,GACFA,EAAW7xB,iBAAiB,SAAS,SAAC0D,GAChCqY,EAAKuQ,WAAWwF,qBAClBmE,EAAUvhB,UAAU9xB,OAAO,WAE3BktC,EAAKsD,eAAe1B,EAAYO,WAAYnC,EAAK6C,OAAQ7C,EAAKwC,SAC9DP,GAAoBjC,EAAKkC,SAAUjW,EAAM+T,EAAKa,iBAG5C5U,EAAKuQ,WAAWsF,0BAClBC,EAAWnd,UAAU9xB,OAAO,WAC5BivC,EAAWnd,UAAUC,IAAI,WAEvBoH,EAAKuQ,WAAW4J,mBAClB/D,GAA+BN,EAAY9V,EAAKuQ,WAAW4J,kBAAmB,WAElF,IAGED,EAAW,CAEb,IAAIE,EAAeF,EAAUjgB,cAAc,SAC3CmgB,EAAan2B,iBAAiB,UAAU,SAAC0D,GACnCyyB,EAAarf,UACfgZ,EAAKsD,eAAe1B,EAAYO,WAAYnC,EAAK6C,OAAQ7C,EAAKwC,SAE9D6D,EAAalL,UAAW,EACxB8G,GAAoBjC,EAAKkC,SAAUjW,EAAM+T,EAAKa,gBAElD,IACIe,EAAYF,aAAezV,EAAKuQ,WAAWsF,yBAC7CO,GAA+B8D,EAAWla,EAAKuQ,WAAW4J,kBAAmB,cAEjF,CACF,GAAG,IACL,GAAC,CAAA38C,IAAA,iBAAAC,MAED,SAAe48C,EAASzD,EAAQ0D,GAAS,IAAAjG,EAAA,KACnC3U,EAAY,IAAIC,QACpBD,EAAUE,OAAO,eAAgB,oBAEjC,IAII2X,EAAiB,CACnBtgB,OAAQ,OACR6I,QAASJ,EACT3/B,KAPQy7B,KAAKj6B,UAAU,CACvBg5C,aAAa,IAObxa,SAAU,UAGZF,MAAM,eAADjN,OAAgB0nB,EAAO,WAAA1nB,OAAUynB,EAAO,0BAAAznB,OAAyBgkB,GAAUW,GAC7E7zC,MAAK,SAAC/D,GAAQ,OAAKA,EAASO,MAAM,IAClCwD,MAAK,SAACV,GACLqxC,EAAKsC,kBAAoBnb,KAAKC,MAAMz4B,GAAQ40C,eAE1BvD,EAAKO,eAAe3a,cAAc,sBACxCzH,MAAM/L,MAAQ,GAAHmM,OAAMyhB,EAAKsC,kBAAiB,KAEnD,IAAI6D,EAAkBnG,EAAKO,eAAe3a,cAAc,0BACxDugB,EAAgBpa,UAAY,GAAHxN,OAAMyhB,EAAKsC,kBAAiB,KACrD6D,EAAgBhoB,MAAM1B,KAAO,GAAH8B,OAAMyhB,EAAKsC,kBAAiB,KAEtD,IAAInB,EAAOnB,EAAK4B,SAASrI,QAAO,SAAChrC,GAAI,OAAKA,EAAKszC,aAAemE,CAAO,IAAE,GAElE7E,EAAKsC,WACRzD,EAAKyC,eAAetB,EAAK0D,SAAU,YAEvC,IACCjZ,OAAM,SAAC99B,GAAK,OAAK60B,QAAQjT,IAAI,QAAS5hB,EAAM,GACjD,GAAC,CAAA3E,IAAA,2BAAAC,MAED,SAAyBuiC,GAEvB,IACIpE,EAAU,GACd,OAFkBoE,EAAKpE,QAAQ/9B,aAG7B,IAAK,iBACH+9B,EAAU0U,GAAetQ,EAAKpE,SAC9B,MACF,IAAK,gBACHA,EAAU8U,GAAc1Q,EAAKpE,SAC7B,MACF,IAAK,kBACHA,EAAUkV,GAAgB9Q,EAAKpE,SAC/B,MACF,IAAK,cACHA,EAAU0V,GAAYtR,EAAKpE,SAC3B,MACF,IAAK,cACHA,EAAUuV,GAAYnR,EAAKpE,SAC3B,MACF,QACE,MAAO,GAEX,OAAOA,CACT,GAAC,CAAAp+B,IAAA,sBAAAC,MAED,WACE,IAAIk3C,EAAkBz6C,KAAK06C,eAAe1c,iBAAiB,oBACvDyc,GACFA,EAAgBttB,SAAQ,SAACzkB,GACvB,OAAQA,EAAKs5B,QAAQ2Y,WACnB,IAAK,YACH,IAAI/P,EAASliC,GACb,MACF,IAAK,YACH,IAAI84B,EAAU94B,GAIpB,GAEJ,uFAAC0zC,CAAA,CAxY2B,2tBIjBTmE,GAAa,WAChC,SAAAA,EAAYvoB,gGAAS0H,CAAA,KAAA6gB,GACnBvgD,KAAK2/B,GAAK3H,EACVh4B,KAAKwgD,YAAcxgD,KAAKwgD,YAAY5jB,KAAK58B,MACzCA,KAAKygD,YAAczgD,KAAKygD,YAAY7jB,KAAK58B,MACzCA,KAAKuwC,MAAQvwC,KAAK2/B,GAAGI,cAAc,SACnC//B,KAAK0gD,OAAS1gD,KAAK2/B,GAAGI,cAAc,UACpC//B,KAAK2gD,WAAa3gD,KAAK2/B,GAAGI,cAAc,gBACxC//B,KAAK08C,OAAS18C,KAAK2/B,GAAGqC,QAAQ4e,OAC9B5gD,KAAK6/B,MACP,WA8BC,SA9BA0gB,KAAA,EAAAj9C,IAAA,OAAAC,MAED,WACE,IACIs9C,EAAyB,EADhB7gD,KAAK0gD,OAAOjV,EAAEqV,QAAQv9C,MACF2zB,KAAK6pB,GACtC/gD,KAAK0gD,OAAOpoB,MAAM0oB,gBAAkB,GAAHtoB,OAAMmoB,EAAa,KAAAnoB,OAAImoB,GACxD7gD,KAAK0gD,OAAOpoB,MAAM2oB,iBAAmB,GAAHvoB,OAAMmoB,GACxC7gD,KAAKwgD,YAAYK,EACnB,GAAC,CAAAv9C,IAAA,cAAAC,MAED,SAAYs9C,GAAe,IAAAz9C,EAAA,KAEzBuiC,MAAM,2BAADjN,OAA4B14B,KAAK08C,SACnClzC,MAAK,SAAA/D,GAAQ,OAAIA,EAASqgC,MAAM,IAChCt8B,MAAK,SAAA5D,GACAA,EAAKs7C,qBACT99C,EAAKu8B,GAAGlB,UAAU9xB,OAAO,UACzBvJ,EAAKq9C,YAAY76C,EAAKu7C,iBAAiBv7C,EAAKu7C,iBAAiBn9C,OAAS,GAAG05C,eAAgBmD,IAEvFz9C,EAAKu8B,GAAGlB,UAAUC,IAAI,SAE1B,IACCqH,OAAM,SAAA99B,GAAK,OAAI60B,QAAQjT,IAAI,QAAS5hB,EAAM,GAC/C,GAAC,CAAA3E,IAAA,cAAAC,MAED,SAAY69C,EAASP,GACP,MAAZO,EAAkBphD,KAAK2/B,GAAGlB,UAAUC,IAAI,UAAY1+B,KAAK2/B,GAAGlB,UAAU9xB,OAAO,UAC7E,IAAMujB,EAAS2wB,EAAgBO,EAAU,IAAMP,EAC/C7gD,KAAK0gD,OAAOpoB,MAAM2oB,iBAAmB/wB,EACrClwB,KAAK2gD,WAAWza,UAAYkb,EAAU,GACxC,sFAACb,CAAA,CAxC+B,GCA3B,SAASc,GAAoBC,GAElC,MADmB,sDACDnL,KAAKmL,EACzB,CAsBO,SAASC,GAAiBn5C,GAO/B,OALuBA,EAAIlI,QAAQ,OAAQ,IAGRwyB,MAGrC,qtBChC6E,IAExD8uB,GAAQ,WAC3B,SAAAA,EAAYxpB,gGAAS0H,CAAA,KAAA8hB,GACnBxhD,KAAK2/B,GAAK3H,EACVh4B,KAAKyhD,KAAOzhD,KAAK2/B,GAAGI,cAAc,QAClC//B,KAAK0hD,aAAe1hD,KAAKyhD,KAAK1hB,cAAc,mBAC5C//B,KAAK2hD,WAAa3hD,KAAK0hD,aAAa3hB,cAAc,OAClD//B,KAAK4hD,UAAY5hD,KAAKyhD,KAAK1hB,cAAc,iBACzC//B,KAAK6hD,WAAa7hD,KAAKyhD,KAAK1hB,cAAc,yBAC1C//B,KAAK8hD,QAAU9hD,KAAKyhD,KAAK1hB,cAAc,oBACvC//B,KAAK+hD,UAAY/hD,KAAKyhD,KAAKzjB,iBAAiB,SAC5Ch+B,KAAKgiD,QAAUhiD,KAAK2/B,GAAGI,cAAc,aAAe,KACpD//B,KAAKkyC,YAAclyC,KAAK2/B,GAAGI,cAAc,iBAAmB,KAC5D//B,KAAKiiD,gBAAkBjiD,KAAK2/B,GAAGI,cAAc,mBAC7C//B,KAAKkiD,QAAUliD,KAAK2/B,GAAGI,cAAc,aAAe,KACpD//B,KAAKmiD,UAAYniD,KAAK4hD,UAAU7a,aAAa,cAC7C/mC,KAAKoiD,SAAWpiD,KAAKoiD,SAASxlB,KAAK58B,MACnCA,KAAKqiD,eAAiBriD,KAAKqiD,eAAezlB,KAAK58B,MAC/CA,KAAKsiD,YAActiD,KAAKsiD,YAAY1lB,KAAK58B,MACzCA,KAAK6/B,MACP,WAyGC,SAzGA2hB,KAAA,EAAAl+C,IAAA,OAAAC,MAED,WAAO,IAAAH,EAAA,KACLpD,KAAK+hD,UAAU50B,SAAQ,SAACojB,GACtBA,EAAMxmB,iBAAiB,SAAS,WAC1B3mB,EAAKm/C,aAAan/C,EAAKw+C,UAAUr+C,QAAU89C,GAAoBE,GAAiBn+C,EAAKy+C,WAAWt+C,SAAWH,EAAK0+C,QAAQjhB,SAC1Hz9B,EAAKs+C,aAAa1M,UAAW,EAC7B5xC,EAAKu+C,WAAWljB,UAAUC,IAAI,0BAC9Bt7B,EAAKu+C,WAAWljB,UAAUC,IAAI,uBAC9Bt7B,EAAKs+C,aAAa33B,iBAAiB,QAAS3mB,EAAKg/C,YAEjDh/C,EAAKs+C,aAAa1M,UAAW,EAC7B5xC,EAAKu+C,WAAWljB,UAAU9xB,OAAO,0BACjCvJ,EAAKu+C,WAAWljB,UAAU9xB,OAAO,uBACjCvJ,EAAKs+C,aAAazwB,oBAAoB,QAAS7tB,EAAKg/C,UAExD,GACF,IAEApiD,KAAK4hD,UAAU73B,iBAAiB,QAAQ,WACjC3mB,EAAKm/C,aAAan/C,EAAKw+C,UAAUr+C,QACpCH,EAAKw+C,UAAUra,mBAAmB9I,UAAU9xB,OAAO,SAEvD,IACA3M,KAAK4hD,UAAU73B,iBAAiB,SAAS,WACnC3mB,EAAKm/C,aAAan/C,EAAKw+C,UAAUr+C,QACnCH,EAAKw+C,UAAUra,mBAAmB9I,UAAUC,IAAI,SAEpD,IACA1+B,KAAK6hD,WAAW93B,iBAAiB,QAAQ,WAClCs3B,GAAoBE,GAAiBn+C,EAAKy+C,WAAWt+C,SACxDH,EAAKy+C,WAAWta,mBAAmB9I,UAAU9xB,OAAO,SAExD,IACA3M,KAAK6hD,WAAW93B,iBAAiB,SAAS,WACpCs3B,GAAoBE,GAAiBn+C,EAAKy+C,WAAWt+C,SACvDH,EAAKy+C,WAAWta,mBAAmB9I,UAAUC,IAAI,SAErD,GACF,GAAC,CAAAp7B,IAAA,eAAAC,MAED,SAAa6tB,GACX,SD3DG,SAA4BA,EAAIigB,GAAqC,IAAAmR,EAAAnR,EAAjCoR,UAAAA,OAAS,IAAAD,EAAG,EAACA,EAAAE,EAAArR,EAAE8Q,UAAAA,OAAS,IAAAO,EAAG,GAAEA,EAEtE,OADkB,IAAI9jB,OAAO,oBAADlG,OAAqB+pB,EAAS,KAAA/pB,OAAIypB,EAAS,OACtDhM,KAAK/kB,EACxB,CCwDSuxB,CAAmBvxB,EAAM,CAAE+wB,UAAWniD,KAAKmiD,cDtDjB/5C,ECsDqDgpB,GDrD9D,KACD+kB,KAAK/tC,KAFvB,IAA4BA,CC0DjC,GAAC,CAAA9E,IAAA,WAAAC,MAED,SAASkqB,GAAG,IAAAgW,EAAA,KACVhW,EAAEmK,iBAEF,IAAMxG,EAA6BpxB,KAAK4hD,UAAUr+C,MDxDzBrD,QAAQ,OAAQ,KAGRwyB,OCsD3B4uB,EAAcC,GAAiBvhD,KAAK6hD,WAAWt+C,OAC/Cu+C,EAAU9hD,KAAK8hD,QAAQjhB,QAE7B,GAAIwgB,GAAoBC,IAAgBthD,KAAKuiD,aAAanxB,IAAS0wB,EAAS,CAE1E9hD,KAAKqiD,iBAEL,IACMz8C,EAAO,CACXwrB,KAAMA,EACNkwB,YAAaA,EACbQ,QAASA,GAELzE,EAAiB,CACrBtgB,OAAQ,OACR6I,QAAS,CACP,eAAgB,oBAElB//B,KAAMy7B,KAAKj6B,UAAUzB,IAEvB+/B,MAbY,GAaD0X,GACV7zC,MAAK,SAAC/D,GACHg+B,EAAK6e,cACL7e,EAAKge,KAAKhuB,QACVqJ,QAAQjT,IAAI,iBAAkBpkB,GAC1Bg+B,EAAKue,UACHve,EAAKyO,aACPzO,EAAKyO,YAAYzT,UAAUC,IAAI,UAEjC+E,EAAKge,KAAKhjB,UAAUC,IAAI,UACxB+E,EAAKue,QAAQvjB,UAAU9xB,OAAO,UAElC,IACCo5B,OAAM,SAAC99B,GACN60B,QAAQjT,IAAI,iBAAkB5hB,GAC9Bw7B,EAAK6e,cACL7e,EAAKwe,gBAAgBxjB,UAAU9xB,OAAO,SACxC,GACJ,CACF,GAAC,CAAArJ,IAAA,iBAAAC,MAED,WACMvD,KAAKkiD,UACPliD,KAAK0hD,aAAappB,MAAMsqB,WAAa,SACrC5iD,KAAKkiD,QAAQ5pB,MAAMsqB,WAAa,UAEpC,GAAC,CAAAt/C,IAAA,cAAAC,MAED,WACMvD,KAAKkiD,UACPliD,KAAK0hD,aAAappB,MAAMsqB,WAAa,UACrC5iD,KAAKkiD,QAAQ5pB,MAAMsqB,WAAa,SAEpC,sFAACpB,CAAA,CA5H0B,2tBCHRqB,GAAY,WAC/B,SAAAA,EAAY7qB,gGAAS0H,CAAA,KAAAmjB,GACnB7iD,KAAK2/B,GAAK3H,EACVh4B,KAAK8iD,WAAa9iD,KAAK2/B,GAAGqC,QAAQ8gB,WAClC9iD,KAAK+iD,gBAAkB/iD,KAAK+iD,gBAAgBnmB,KAAK58B,MACjDA,KAAKgjD,eAAiBhjD,KAAKgjD,eAAepmB,KAAK58B,MAC/CA,KAAKijD,WAAajjD,KAAK2/B,GAAGqC,QAAQihB,WAClCjjD,KAAKkjD,QAAUljD,KAAK2/B,GAAGqC,QAAQkhB,QAC/BljD,KAAKmjD,SAAWnjD,KAAK2/B,GAAGqC,QAAQmhB,SAChCnjD,KAAK6/B,MACP,WAgCC,SAhCAgjB,KAAA,EAAAv/C,IAAA,OAAAC,MAED,WACEvD,KAAK+iD,iBACP,GAAC,CAAAz/C,IAAA,kBAAAC,MAED,WAAkB,IAAAH,EAAA,KAMhBuiC,MAAM,kCALiB,CACrB5I,OAAQ,MACR8I,SAAU,WAITr8B,MAAK,SAAC/D,GAAQ,OAAKA,EAASO,MAAM,IAClCwD,MAAK,SAACV,GAAM,OAAK1F,EAAK4/C,eAAel6C,EAAO,IAC5Ci9B,OAAM,SAAC99B,GAAK,OAAK60B,QAAQ70B,MAAMA,EAAM,GAC1C,GAAC,CAAA3E,IAAA,iBAAAC,MAED,SAAeuF,GACb,IAAIs6C,EAAe9hB,KAAKC,MAAMz4B,GAC1Bu6C,EAAkC,QAApBrjD,KAAKijD,WAAuB,cAAgBjjD,KAAKkjD,QAAUljD,KAAKkjD,QAAU,aACxFI,EAAWtjD,KAAKmjD,SAAWnjD,KAAKmjD,SAAW,aAC3CI,EAAgC,cAApBvjD,KAAKijD,WAA6B,aAAe,OAC3DO,EAAa,qCAAH9qB,OACc0qB,EAAaK,SAAQ,2FAAA/qB,OACA0qB,EAAaM,SAAQ,uDAAAhrB,OAC3B0qB,EAAaO,MAAK,+BAAAjrB,OAC1C2qB,EAAW,8BAAA3qB,OAA6B6qB,EAAS,+GAAA7qB,OAA8G14B,KAAK8iD,WAAU,yDAAApqB,OAAwD4qB,EAAQ,uIAInQtjD,KAAK2/B,GAAGuG,UAAYsd,CACtB,sFAACX,CAAA,CA1C8B,6gDCwCjCe,KAAAA,IAAAA,UAA0B,WAC1BA,KAAAA,IAAAA,YAA4B,SAC5BA,KAAAA,IAAAA,YAA4B,CAC1B,UAAW,qBACX,WAAY,sBACZ,UAAW,sBAGb,IAAMC,GAAa,CACjB,CAAEC,MAAOrkB,EAAKskB,aAAc,OAC5B,CAAED,MAAO1jB,EAAkB2jB,aAAc,qBACzC,CAAED,MAAOzjB,EAAU0jB,aAAc,aACjC,CAAED,MAAOtjB,EAAcujB,aAAc,iBACrC,CAAED,MAAO7iB,EAAU8iB,aAAc,aACjC,CAAED,MAAOtiB,EAAWuiB,aAAc,aAClC,CAAED,MAAOhiB,EAAaiiB,aAAc,gBACpC,CAAED,MAAO7f,EAAQ8f,aAAc,UAC/B,CAAED,MAAOnd,EAAYod,aAAc,eACnC,CAAED,MAAOza,EAAc0a,aAAc,iBACrC,CAAED,MAAOha,EAAWia,aAAc,cAClC,CAAED,MAAO3Z,EAAa4Z,aAAc,gBACpC,CAAED,MAAOlZ,EAAUmZ,aAAc,aACjC,CAAED,MAAOjT,GAAiBkT,aAAc,oBACxC,CAAED,MAAOrS,GAAWsS,aAAc,cAClC,CAAED,MAAOhS,GAAMiS,aAAc,QAC7B,CAAED,MAAOvQ,GAAawQ,aAAc,gBACpC,CAAED,MAAOlQ,GAAqBmQ,aAAc,wBAC5C,CAAED,MAAO9L,GAAqB+L,aAAc,uBAC5C,CAAED,MAAO1H,GAAW2H,aAAc,aAClC,CAAED,MAAOE,GAAeD,aAAc,kBACtC,CAAED,MAAOtC,GAAUuC,aAAc,mBACjC,CAAED,MAAOjB,GAAckB,aAAc,kBAMjCE,GAAqB,WACzB,SAAAA,IAGE,mGAHYvkB,CAAA,KAAAukB,GACZjkD,KAAKkkD,mBACLlkD,KAAKmkD,gBACEnkD,IACT,WA2BC,SA3BAikD,KAAA,EAAA3gD,IAAA,mBAAAC,MAED,WAAmB,IAAAH,EAAA,KACjBpD,KAAKokD,uBAAyB,CAAC,EAE/BP,GAAWx+C,KAAI,SAACs1C,GACd,IAAM0J,EAAQ,GAECrZ,GAAOxf,SAASwS,iBAAiB,oBAAsB2c,EAAUoJ,aAAe,OAErF1+C,KAAI,SAACi/C,GAEbD,EAAMj1B,KAAK,IAAIurB,EAAUmJ,MAAMQ,GACjC,IAGID,EAAMrgD,SAAQZ,EAAKghD,uBAAuBzJ,EAAUoJ,cAAgBM,EAC1E,GACF,GAAC,CAAA/gD,IAAA,gBAAAC,MAED,WACE,IAAMy8B,EAAQ,IAAIG,YAAYd,EAAWE,sBACzCH,EAASpR,cAAcgS,EACzB,GAAC,CAAA18B,IAAA,gBAAAC,MAED,SAAcwgD,GACZ,OAAOA,EAAe/jD,KAAKokD,uBAAuBL,GAAgB/jD,KAAKokD,sBACzE,sFAACH,CAAA,CAhCwB,GAqCvB,kBAAmBM,WAErB5jD,OAAOopB,iBAAiB,QAAQ,WAC9Bw6B,UAAUC,cACPC,SAAS,qBACTj7C,MAAK,SAACmnC,GAAS,IACf5K,OAAM,SAAC5hC,GAAG,OAAK24B,QAAQjT,IAAI,gCAAiC1lB,EAAI,GACrE,IAIFxD,OAAO8+B,IAAM,IAAIwkB,qBC9GjB,SAASS,EAAQ37C,GACf,GAAIA,EAAK,OAWX,SAAeA,GACb,IAAK,IAAIzF,KAAOohD,EAAQniD,UACtBwG,EAAIzF,GAAOohD,EAAQniD,UAAUe,GAE/B,OAAOyF,CACT,CAhBkB47C,CAAM57C,EACxB,CAXEE,EAAOlJ,QAAU2kD,EAqCnBA,EAAQniD,UAAU8sB,GAClBq1B,EAAQniD,UAAUwnB,iBAAmB,SAASiW,EAAOoR,GAInD,OAHApxC,KAAK4kD,WAAa5kD,KAAK4kD,YAAc,CAAC,GACrC5kD,KAAK4kD,WAAW,IAAM5kB,GAAShgC,KAAK4kD,WAAW,IAAM5kB,IAAU,IAC7D5Q,KAAKgiB,GACDpxC,IACT,EAYA0kD,EAAQniD,UAAUq3C,KAAO,SAAS5Z,EAAOoR,GACvC,SAAS/hB,IACPrvB,KAAKwvB,IAAIwQ,EAAO3Q,GAChB+hB,EAAG9iB,MAAMtuB,KAAMquB,UACjB,CAIA,OAFAgB,EAAG+hB,GAAKA,EACRpxC,KAAKqvB,GAAG2Q,EAAO3Q,GACRrvB,IACT,EAYA0kD,EAAQniD,UAAUitB,IAClBk1B,EAAQniD,UAAUsiD,eAClBH,EAAQniD,UAAUuiD,mBAClBJ,EAAQniD,UAAU0uB,oBAAsB,SAAS+O,EAAOoR,GAItD,GAHApxC,KAAK4kD,WAAa5kD,KAAK4kD,YAAc,CAAC,EAGlC,GAAKv2B,UAAUrqB,OAEjB,OADAhE,KAAK4kD,WAAa,CAAC,EACZ5kD,KAIT,IAUI+kD,EAVAC,EAAYhlD,KAAK4kD,WAAW,IAAM5kB,GACtC,IAAKglB,EAAW,OAAOhlD,KAGvB,GAAI,GAAKquB,UAAUrqB,OAEjB,cADOhE,KAAK4kD,WAAW,IAAM5kB,GACtBhgC,KAKT,IAAK,IAAI+D,EAAI,EAAGA,EAAIihD,EAAUhhD,OAAQD,IAEpC,IADAghD,EAAKC,EAAUjhD,MACJqtC,GAAM2T,EAAG3T,KAAOA,EAAI,CAC7B4T,EAAU72B,OAAOpqB,EAAG,GACpB,KACF,CASF,OAJyB,IAArBihD,EAAUhhD,eACLhE,KAAK4kD,WAAW,IAAM5kB,GAGxBhgC,IACT,EAUA0kD,EAAQniD,UAAU0iD,KAAO,SAASjlB,GAChChgC,KAAK4kD,WAAa5kD,KAAK4kD,YAAc,CAAC,EAKtC,IAHA,IAAIvnB,EAAO,IAAI14B,MAAM0pB,UAAUrqB,OAAS,GACpCghD,EAAYhlD,KAAK4kD,WAAW,IAAM5kB,GAE7Bj8B,EAAI,EAAGA,EAAIsqB,UAAUrqB,OAAQD,IACpCs5B,EAAKt5B,EAAI,GAAKsqB,UAAUtqB,GAG1B,GAAIihD,EAEG,CAAIjhD,EAAI,EAAb,IAAK,IAAWmhD,GADhBF,EAAYA,EAAUl4B,MAAM,IACI9oB,OAAQD,EAAImhD,IAAOnhD,EACjDihD,EAAUjhD,GAAGuqB,MAAMtuB,KAAMq9B,EADKr5B,CAKlC,OAAOhE,IACT,EAUA0kD,EAAQniD,UAAU2wB,UAAY,SAAS8M,GAErC,OADAhgC,KAAK4kD,WAAa5kD,KAAK4kD,YAAc,CAAC,EAC/B5kD,KAAK4kD,WAAW,IAAM5kB,IAAU,EACzC,EAUA0kB,EAAQniD,UAAU4iD,aAAe,SAASnlB,GACxC,QAAUhgC,KAAKkzB,UAAU8M,GAAOh8B,MAClC,qBC9KC,SAASrD,EAAQykD,GACjB,IAAIxB,EAWL,SAAWjjD,EAAQ6qB,EAAU5oB,GAC5B,aAGA,IAAIyiD,EAIHC,EAuCD,GArCA,WACC,IAAIC,EAEAC,EAAoB,CACvBC,UAAW,WACXC,YAAa,aACbC,aAAc,cACdC,aAAc,cACdC,WAAY,YAEZC,eAAgB,gBAChBC,gBAAiB,eACjBC,eAAgB,EAChBC,QAAS,WACTC,WAAY,cACZC,UAAW,aAEXC,QAAS,GACTC,YAAa,CAAC,EACdxmB,MAAM,EACNymB,UAAW,IACXC,KAAM,GACNC,SAAU,EACVC,YAAY,EACZC,WAAY,EACZC,cAAe,KAKhB,IAAIpB,KAFJD,EAAe3kD,EAAOimD,iBAAmBjmD,EAAOkmD,iBAAmB,CAAC,EAExDrB,EACND,KAAQD,IACZA,EAAaC,GAAQC,EAAkBD,GAGzC,CAnCD,IAqCK/5B,IAAaA,EAASs7B,uBAC1B,MAAO,CACNjnB,KAAM,WAAa,EAInBknB,IAAKzB,EAIL0B,WAAW,GAIb,IAAIC,EAAUz7B,EAAS6Z,gBAEnB6hB,EAAiBvmD,EAAOwmD,mBAExBC,EAAoB,mBAEpBC,EAAgB,eAMhBt9B,EAAmBppB,EAAOymD,GAAmBxqB,KAAKj8B,GAElDqrB,EAAarrB,EAAOqrB,WAEpBsQ,EAAwB37B,EAAO27B,uBAAyBtQ,EAExDs7B,EAAsB3mD,EAAO2mD,oBAE7BC,EAAa,aAEbC,EAAa,CAAC,OAAQ,QAAS,eAAgB,eAE/CC,EAAgB,CAAC,EAEjBt6B,EAAUxoB,MAAMpC,UAAU4qB,QAM1Bu6B,EAAW,SAASC,EAAKC,GAI5B,OAHIH,EAAcG,KACjBH,EAAcG,GAAO,IAAIhpB,OAAO,UAAUgpB,EAAI,YAExCH,EAAcG,GAAKzR,KAAKwR,EAAIN,GAAe,UAAY,KAAOI,EAAcG,EACpF,EAMIzuB,EAAW,SAASwuB,EAAKC,GACvBF,EAASC,EAAKC,IAClBD,EAAIzuB,aAAa,SAAUyuB,EAAIN,GAAe,UAAY,IAAI30B,OAAS,IAAMk1B,EAE/E,EAMIztB,EAAc,SAASwtB,EAAKC,GAC/B,IAAIC,GACCA,EAAMH,EAASC,EAAIC,KACvBD,EAAIzuB,aAAa,SAAUyuB,EAAIN,GAAe,UAAY,IAAInnD,QAAQ2nD,EAAK,KAE7E,EAEIC,EAAsB,SAASC,EAAK3W,EAAI1S,GAC3C,IAAIspB,EAAStpB,EAAM0oB,EAAoB,sBACpC1oB,GACFopB,EAAoBC,EAAK3W,GAE1BoW,EAAWr6B,SAAQ,SAAS86B,GAC3BF,EAAIC,GAAQC,EAAK7W,EAClB,GACD,EAUI8W,EAAe,SAASp4B,EAAMsB,EAAM0G,EAAQqwB,EAAWC,GAC1D,IAAIpoB,EAAQxU,EAASsC,YAAY,SAajC,OAXIgK,IACHA,EAAS,CAAC,GAGXA,EAAO9uB,SAAWq8C,EAElBrlB,EAAMjS,UAAUqD,GAAO+2B,GAAYC,GAEnCpoB,EAAMlI,OAASA,EAEfhI,EAAK9B,cAAcgS,GACZA,CACR,EAEIqoB,EAAiB,SAAU1oB,EAAI2oB,GAClC,IAAIC,GACCrB,IAAoBqB,EAAY5nD,EAAO6nD,aAAelD,EAAamD,KACpEH,GAAQA,EAAKllB,MAAQzD,EAAG0nB,GAAe,WACzC1nB,EAAGzG,aAAa,SAAUovB,EAAKllB,KAEhCmlB,EAAS,CAACG,YAAY,EAAMn9B,SAAU,CAACoU,MAC9B2oB,GAAQA,EAAKllB,MACtBzD,EAAGyD,IAAMklB,EAAKllB,IAEhB,EAEIulB,EAAS,SAAU74B,EAAMwI,GAC5B,OAAQ4C,iBAAiBpL,EAAM,OAAS,CAAC,GAAGwI,EAC7C,EASIswB,EAAW,SAAS94B,EAAM+4B,EAAQt8B,GAGrC,IAFAA,EAAQA,GAASuD,EAAKub,YAEhB9e,EAAQ+4B,EAAac,SAAWyC,IAAW/4B,EAAKg5B,iBACrDv8B,EAASs8B,EAAOxd,YAChBwd,EAASA,EAAO94B,WAGjB,OAAOxD,CACR,EAEIiB,GAECu7B,GAAW,GACXC,GAAY,GACZC,GAAMF,GAEN5X,GAAM,WACT,IAAI+X,EAASD,GAOb,IALAA,GAAMF,GAAS/kD,OAASglD,GAAYD,GAEpCI,IAAU,EACVC,IAAU,EAEJF,EAAOllD,QACZklD,EAAOG,OAAPH,GAGDC,IAAU,CACX,EAEIG,GAAW,SAASlY,EAAImY,GACxBJ,KAAYI,EACdnY,EAAG9iB,MAAMtuB,KAAMquB,YAEf46B,GAAI75B,KAAKgiB,GAELgY,KACHA,IAAU,GACT59B,EAASg+B,OAASx9B,EAAasQ,GAAuB6U,KAG1D,EAEAmY,GAASG,SAAWtY,GAEbmY,IAGJI,EAAQ,SAAStY,EAAIuY,GACxB,OAAOA,EACN,WACCn8B,EAAI4jB,EACL,EACA,WACC,IAAIwY,EAAO5pD,KACPq9B,EAAOhP,UACXb,GAAI,WACH4jB,EAAG9iB,MAAMs7B,EAAMvsB,EAChB,GACD,CAEF,EAEIwsB,EAAW,SAASzY,GACvB,IAAI+X,EACAhtB,EAAW,EACX2tB,EAASxE,EAAaqB,cACtBoD,EAAazE,EAAaoB,WAC1BvV,EAAM,WACTgY,GAAU,EACVhtB,EAAWv5B,EAAKg4B,MAChBwW,GACD,EACI4Y,EAAe1C,GAAuByC,EAAa,GACtD,WACCzC,EAAoBnW,EAAK,CAAC3wC,QAASupD,IAEhCA,IAAezE,EAAaoB,aAC9BqD,EAAazE,EAAaoB,WAE5B,EACAgD,GAAM,WACL19B,EAAWmlB,EACZ,IAAG,GAGJ,OAAO,SAAS8Y,GACf,IAAIC,GAEAD,GAA4B,IAAfA,KAChBF,EAAa,IAGXZ,IAIHA,GAAW,GAEXe,EAAQJ,GAAUlnD,EAAKg4B,MAAQuB,IAEpB,IACV+tB,EAAQ,GAGND,GAAcC,EAAQ,EACxBF,IAEAh+B,EAAWg+B,EAAcE,GAE3B,CACD,EAGIC,EAAW,SAAS7sB,GACvB,IAAI98B,EAASm6B,EACTyvB,EAAO,GACPjZ,EAAM,WACT3wC,EAAU,KACV88B,GACD,EACI+sB,EAAQ,WACX,IAAIC,EAAO1nD,EAAKg4B,MAAQD,EAEpB2vB,EAAOF,EACVp+B,EAAWq+B,EAAOD,EAAOE,IAExBhD,GAAuBnW,GAAKA,EAE/B,EAEA,OAAO,WACNxW,EAAY/3B,EAAKg4B,MAEZp6B,IACJA,EAAUwrB,EAAWq+B,EAAOD,GAE9B,CACD,EAEIG,GAKCC,EAAS,SACTC,EAAY,YAEZC,EAAiB,aAAc/pD,IAAa,eAAew1C,KAAKoO,UAAUoG,WAE1EC,EAAe,EACfC,EAAgB,EAEhBC,EAAY,EACZC,IAAW,EAEXC,GAAkB,SAASv9B,GAC9Bq9B,MACIr9B,GAAKq9B,EAAY,IAAMr9B,EAAE+M,UAC5BswB,EAAY,EAEd,EAEIG,GAAY,SAAUn7B,GAKzB,OAJoB,MAAhBo7B,IACHA,EAAsD,UAAvCvC,EAAOn9B,EAAS3lB,KAAM,eAG/BqlD,KAA2D,UAAzCvC,EAAO74B,EAAKC,WAAY,eAA2D,UAA9B44B,EAAO74B,EAAM,cAC5F,EAEIq7B,GAAkB,SAASr7B,EAAMs7B,GACpC,IAAIC,EACAxC,EAAS/4B,EACTw7B,EAAUL,GAAUn7B,GAOxB,IALAy7B,GAASH,EACTI,GAAYJ,EACZK,GAAUL,EACVM,GAAWN,EAELE,IAAYzC,EAASA,EAAO8C,eAAiB9C,GAAUr9B,EAAS3lB,MAAQgjD,GAAU5B,IACvFqE,GAAY3C,EAAOE,EAAQ,YAAc,GAAK,IAEF,WAA9BF,EAAOE,EAAQ,cAC5BwC,EAAYxC,EAAOvqB,wBACnBgtB,EAAUI,EAAUL,EAAUz0B,MAC7B60B,EAASJ,EAAU5xB,OACnB+xB,EAAWH,EAAU10B,IAAM,GAC3B40B,EAAQF,EAAU7xB,OAAS,GAK9B,OAAO8xB,CACR,EAEIM,GAAgB,WACnB,IAAIC,EAAO9nD,EAAGw6B,EAAMutB,EAAcC,EAAiBX,EAAYY,EAAoBC,EAClFC,EAAiBC,EAAeC,EAAe7F,EAC5C8F,EAAgBhH,EAAU95B,SAE9B,IAAIi7B,EAAWlB,EAAakB,WAAasE,EAAY,IAAMe,EAAQQ,EAAcroD,QAAQ,CAMxF,IAJAD,EAAI,EAEJgnD,KAEMhnD,EAAI8nD,EAAO9nD,IAEhB,GAAIsoD,EAActoD,KAAMsoD,EAActoD,GAAGuoD,UAEzC,IAAI5B,GAAkBrF,EAAUkH,iBAAmBlH,EAAUkH,gBAAgBF,EAActoD,IAAMyoD,GAAcH,EAActoD,SAoC7H,IAlCKkoD,EAAgBI,EAActoD,GAAGsjD,GAAe,kBAAqB+D,EAA6B,EAAhBa,KACtFb,EAAaP,GAGTsB,IACJA,GAAkB7G,EAAamH,QAAUnH,EAAamH,OAAS,EAC9DxF,EAAQyF,aAAe,KAAOzF,EAAQ0F,YAAc,IAAM,IAAM,IAChErH,EAAamH,OAEdpH,EAAUuH,OAAST,EAEnBC,EAAgBD,EAAgB7G,EAAagB,UAC7CC,EAAOjB,EAAaiB,KACpB2E,EAAe,KAEZL,EAAgBuB,GAAiBtB,EAAY,GAAKC,GAAU,GAAKvE,EAAW,IAAMh7B,EAASg+B,QAC7FqB,EAAgBuB,EAChBrB,GAAU,GAEVF,EADSrE,EAAW,GAAKuE,GAAU,GAAKD,EAAY,EACpCqB,EAEAvB,GAIfsB,IAAoBd,IACtByB,EAAOC,WAAc1B,EAAa7E,EAClCwG,EAAOC,YAAc5B,EACrBY,GAAmC,EAAdZ,EACrBc,EAAkBd,GAGnB7sB,EAAO8tB,EAActoD,GAAGu6B,yBAEnBktB,EAAWjtB,EAAK/E,SAAWwyB,IAC9BT,EAAQhtB,EAAK5H,MAAQo2B,IACrBrB,EAAUntB,EAAK9E,QAAUuyB,EAAqBzF,IAC9CkF,EAASltB,EAAK3H,OAASi2B,IACvBrB,GAAYE,GAAWD,GAAUF,KACjCjG,EAAamB,YAAcwE,GAAUoB,EAActoD,OAClDw3C,GAAeuP,EAAY,IAAMmB,IAAkBzF,EAAW,GAAKuE,GAAU,IAAOI,GAAgBkB,EAActoD,GAAIqnD,KAGxH,GAFAoB,GAAcH,EAActoD,IAC5BgoD,GAAkB,EACfjB,EAAY,EAAG,WACRiB,GAAmBxQ,IAAgBuQ,GAC7ChB,EAAY,GAAKC,GAAU,GAAKvE,EAAW,IAC1CyG,EAAa,IAAM3H,EAAa4H,oBAChCD,EAAa,KAAQhB,IAAmBT,GAAYE,GAAWD,GAAUF,GAAqE,QAA3Dc,EAActoD,GAAGsjD,GAAe/B,EAAaa,eACjI2F,EAAemB,EAAa,IAAMZ,EAActoD,IAI/C+nD,IAAiBC,GACnBS,GAAcV,EAEhB,CACD,EAEIqB,GAAyBtD,EAAS+B,IAElCwB,GAAqB,SAAS3/B,GACjC,IAAIqC,EAAOrC,EAAE+M,OAET1K,EAAKu9B,kBACDv9B,EAAKu9B,YAIbrC,GAAgBv9B,GAChB0L,EAASrJ,EAAMw1B,EAAaI,aAC5BvrB,EAAYrK,EAAMw1B,EAAaK,cAC/BmC,EAAoBh4B,EAAMw9B,IAC1BpF,EAAap4B,EAAM,cACpB,EACIy9B,GAA0B7D,EAAM0D,IAChCE,GAAwB,SAAS7/B,GACpC8/B,GAAwB,CAAC/yB,OAAQ/M,EAAE+M,QACpC,EAEIgzB,GAAkB,SAAS19B,EAAMsT,GACpC,IAAIojB,EAAW12B,EAAKiX,aAAa,mBAAqBue,EAAaU,eAGnD,GAAZQ,EACH12B,EAAK29B,cAAcxlB,SAAS/nC,QAAQkjC,GACd,GAAZojB,IACV12B,EAAKsT,IAAMA,EAEb,EAEIsqB,GAAgB,SAASC,GAC5B,IAAItH,EAEAuH,EAAeD,EAAOtG,GAAe/B,EAAaY,aAEjDG,EAAcf,EAAae,YAAYsH,EAAOtG,GAAe,eAAiBsG,EAAOtG,GAAe,YACxGsG,EAAOz0B,aAAa,QAASmtB,GAG3BuH,GACFD,EAAOz0B,aAAa,SAAU00B,EAEhC,EAEIC,GAAanE,GAAM,SAAU55B,EAAMgI,EAAQg2B,EAAQC,EAAOC,GAC7D,IAAI5qB,EAAK6qB,EAAQpF,EAAQqF,EAAWluB,EAAOmuB,GAEtCnuB,EAAQkoB,EAAap4B,EAAM,mBAAoBgI,IAASs2B,mBAEzDL,IACCD,EACF30B,EAASrJ,EAAMw1B,EAAaQ,gBAE5Bh2B,EAAKoJ,aAAa,QAAS60B,IAI7BE,EAASn+B,EAAKu3B,GAAe/B,EAAaY,YAC1C9iB,EAAMtT,EAAKu3B,GAAe/B,EAAaW,SAEpC+H,IAEFE,GADArF,EAAS/4B,EAAKC,aACQw3B,EAAWpR,KAAK0S,EAAOjrB,UAAY,KAG1DuwB,EAAYr2B,EAAOq2B,WAAe,QAASr+B,IAAUm+B,GAAU7qB,GAAO8qB,GAEtEluB,EAAQ,CAACxF,OAAQ1K,GAEjBqJ,EAASrJ,EAAMw1B,EAAaK,cAEzBwI,IACFn9B,aAAaq9B,GACbA,EAAuBriC,EAAWg/B,GAAiB,MACnDlD,EAAoBh4B,EAAMw9B,IAAuB,IAG/CY,GACF/gC,EAAQiB,KAAKy6B,EAAOvlB,qBAAqB,UAAWoqB,IAGlDO,EACFn+B,EAAKoJ,aAAa,SAAU+0B,GACnB7qB,IAAQ8qB,IACdzD,EAAUtU,KAAKrmB,EAAK8N,UACtB4vB,GAAgB19B,EAAMsT,GAEtBtT,EAAKsT,IAAMA,GAIV4qB,IAAUC,GAAUC,IACtB7F,EAAev4B,EAAM,CAACsT,IAAKA,KAI1BtT,EAAKw8B,kBACAx8B,EAAKw8B,UAEbnyB,EAAYrK,EAAMw1B,EAAaG,WAE/Bj4B,GAAI,WAEH,IAAI8gC,EAAWx+B,EAAK+f,UAAY/f,EAAKy+B,aAAe,EAE/CJ,IAAaG,IACbA,GACHn1B,EAASrJ,EAAMw1B,EAAaS,iBAE7BqH,GAAmBptB,GACnBlQ,EAAKu9B,YAAa,EAClBrhC,GAAW,WACN,eAAgB8D,UACZA,EAAKu9B,UAEd,GAAG,IAEgB,QAAhBv9B,EAAK0+B,SACR1D,GAEF,IAAG,EACJ,IAMI0B,GAAgB,SAAU18B,GAC7B,IAAIA,EAAKw8B,UAAT,CACA,IAAIx0B,EAEAk2B,EAAQxD,EAAOrU,KAAKrmB,EAAK8N,UAGzBmwB,EAAQC,IAAUl+B,EAAKu3B,GAAe/B,EAAaa,YAAcr2B,EAAKu3B,GAAe,UACrFyG,EAAkB,QAATC,IAERD,GAAWvS,IAAgByS,IAAUl+B,EAAKu3B,GAAe,SAAUv3B,EAAKm+B,QAAYn+B,EAAK+f,UAAa6X,EAAS53B,EAAMw1B,EAAaO,cAAe6B,EAAS53B,EAAMw1B,EAAaG,cAElL3tB,EAASowB,EAAap4B,EAAM,kBAAkBgI,OAE3Cg2B,GACDW,EAAUC,WAAW5+B,GAAM,EAAMA,EAAKub,aAGxCvb,EAAKw8B,WAAY,EACjBxB,IAEA+C,GAAW/9B,EAAMgI,EAAQg2B,EAAQC,EAAOC,GApBZ,CAqB7B,EAEIW,GAAcxE,GAAS,WAC1B7E,EAAakB,SAAW,EACxB2G,IACD,IAEIyB,GAA2B,WACF,GAAzBtJ,EAAakB,WACflB,EAAakB,SAAW,GAEzBmI,IACD,EAEIE,GAAS,WACTtT,IACA34C,EAAKg4B,MAAQk0B,EAAU,IACzB9iC,EAAW6iC,GAAQ,MAKpBtT,GAAc,EAEd+J,EAAakB,SAAW,EAExB2G,KAEApjC,EAAiB,SAAU6kC,IAA0B,IACtD,EAEO,CACNG,EAAG,WACFD,EAAUlsD,EAAKg4B,MAEfyqB,EAAU95B,SAAWC,EAASs7B,uBAAuBxB,EAAaG,WAClEwH,EAAezhC,EAASs7B,uBAAuBxB,EAAaG,UAAY,IAAMH,EAAaM,cAE3F77B,EAAiB,SAAUojC,IAAwB,GAEnDpjC,EAAiB,SAAUojC,IAAwB,GAEnDpjC,EAAiB,YAAY,SAAU0D,GACtC,GAAIA,EAAEuhC,UAAW,CAChB,IAAIC,EAAkBzjC,EAASwS,iBAAiB,IAAMsnB,EAAaK,cAE/DsJ,EAAgBjrD,QAAUirD,EAAgB9hC,SAC7CmP,GAAsB,WACrB2yB,EAAgB9hC,SAAS,SAAU+hC,GAC9BA,EAAIrf,UACP2c,GAAc0C,EAEhB,GACD,GAEF,CACD,IAEGvuD,EAAOwuD,iBACT,IAAIA,iBAAkBhC,IAAyBiC,QAASnI,EAAS,CAACoI,WAAW,EAAMC,SAAS,EAAMC,YAAY,KAE9GtI,EAAQG,GAAmB,kBAAmB+F,IAAwB,GACtElG,EAAQG,GAAmB,kBAAmB+F,IAAwB,GACtEqC,YAAYrC,GAAwB,MAGrCpjC,EAAiB,aAAcojC,IAAwB,GAGvD,CAAC,QAAS,YAAa,QAAS,OAAQ,gBAAiB,gBAAgBhgC,SAAQ,SAASiE,GACzF5F,EAAS47B,GAAmBh2B,EAAM+7B,IAAwB,EAC3D,IAEI,QAAQhX,KAAK3qB,EAASikC,YACzBZ,MAEA9kC,EAAiB,OAAQ8kC,IACzBrjC,EAAS47B,GAAmB,mBAAoB+F,IAChDnhC,EAAW6iC,GAAQ,MAGjBxJ,EAAU95B,SAASvnB,QACrB4nD,KACAp+B,EAAIi8B,YAEJ0D,IAEF,EACAuC,WAAYvC,GACZwC,OAAQnD,GACRoD,MAAOhB,KAKLH,GAGCoB,EAAcnG,GAAM,SAAS55B,EAAM+4B,EAAQ7oB,EAAOzT,GACrD,IAAIujC,EAAS/rD,EAAGmhD,EAMhB,GALAp1B,EAAKg5B,gBAAkBv8B,EACvBA,GAAS,KAETuD,EAAKoJ,aAAa,QAAS3M,GAExBg7B,EAAWpR,KAAK0S,EAAOjrB,UAAY,IAErC,IAAI75B,EAAI,EAAGmhD,GADX4K,EAAUjH,EAAOvlB,qBAAqB,WACbt/B,OAAQD,EAAImhD,EAAKnhD,IACzC+rD,EAAQ/rD,GAAGm1B,aAAa,QAAS3M,GAI/ByT,EAAMlI,OAAOi4B,UAChB1H,EAAev4B,EAAMkQ,EAAMlI,OAE7B,IAOIk4B,EAAiB,SAAUlgC,EAAMigC,EAAUxjC,GAC9C,IAAIyT,EACA6oB,EAAS/4B,EAAKC,WAEf84B,IACFt8B,EAAQq8B,EAAS94B,EAAM+4B,EAAQt8B,IAC/ByT,EAAQkoB,EAAap4B,EAAM,kBAAmB,CAACvD,MAAOA,EAAOwjC,WAAYA,KAE/D3B,mBACT7hC,EAAQyT,EAAMlI,OAAOvL,QAETA,IAAUuD,EAAKg5B,iBAC1B+G,EAAY//B,EAAM+4B,EAAQ7oB,EAAOzT,GAIrC,EAcI0jC,EAA+B9F,GAZT,WACzB,IAAIpmD,EACAmhD,EAAMgL,EAAelsD,OACzB,GAAGkhD,EAGF,IAFAnhD,EAAI,EAEEA,EAAImhD,EAAKnhD,IACdisD,EAAeE,EAAensD,GAGjC,IAIO,CACNgrD,EAAG,WACFmB,EAAiB1kC,EAASs7B,uBAAuBxB,EAAaQ,gBAC9D/7B,EAAiB,SAAUkmC,EAC5B,EACAP,WAAYO,EACZvB,WAAYsB,IAIVnwB,EAAO,YACNA,EAAK97B,GAAKynB,EAASs7B,yBACtBjnB,EAAK97B,GAAI,EACT0qD,EAAUM,IACVxE,EAAOwE,IAET,EA3EgB,IACXmB,EAEAL,EAwBAG,EA8BAC,EAnbQ,IACRhD,EAAc1R,EAAa8S,EAAsB7H,EAAUsI,EAE3DjC,EAAME,EAAMxB,EAAOE,EAAQC,EAASF,EAAUN,EAE9CV,EACAC,EAEAC,EAEAE,EACAC,EAEAC,EACAC,GAEAC,GAOAC,GAQAE,GA0BAS,GA2EAuB,GAEAC,GAcAG,GACAD,GAIAE,GAWAE,GAcAG,GAmFArB,GAwBAmC,GAKAC,GAOAC,GA5aK,IACL1F,GAASC,GACTL,GACAC,GACAC,GAEA9X,GAeAmY,GA4kBL,OAvBAt9B,GAAW,WACPs5B,EAAazlB,MACfA,GAEF,IAEAwlB,EAAY,CAIX0B,IAAKzB,EACLmJ,UAAWA,EACXlE,OAAQA,EACR1qB,KAAMA,EACNswB,GAAI9H,EACJ+H,GAAIj3B,EACJk3B,GAAIl2B,EACJm2B,GAAI5I,EACJ6I,KAAMrI,EACNsI,GAAI5H,EACJp7B,IAAKA,EAIP,CA3yBiB43B,CAAQzkD,EAAQA,EAAO6qB,SAAU5oB,MACjDjC,EAAOijD,UAAYA,EACa36C,EAAOlJ,UACtCkJ,EAAOlJ,QAAU6jD,EAEnB,CANA,CAMmB,oBAAVjjD,OACHA,OAAS,CAAC,yBCPhB,yBAMCykD,EAAUA,EAAQxoB,KAAK,KAAMj8B,EAAQA,EAAO6qB,UAEZviB,EAAOlJ,QACtCqlD,EAAQ,EAAQ,QAEhB,EAAO,CAAC,cAAqB,0BAAP,EAAF,GAAS,+BAM/B,CAjBA,CAiBEzkD,QAAQ,SAASA,EAAQ6qB,EAAUo4B,GACpC,aACA,GAAIjjD,EAAOopB,iBAAX,CAEA,IAAIu7B,EAAe1B,EAAUmD,IACzB0J,EAAW,OACXC,EAAc,qBACdC,EAAY,uDACZC,EAAU,uCACVC,EAAiB,UACjBC,EAAwB,CAACC,QAAS,EAAGC,MAAO,GAoB5CC,EAAiB,SAAStD,EAAQzqD,GACrC,GAAGA,EAAM,CACR,IAAIguD,EAAYhuD,EAAMA,MAAM0tD,GACzBM,GAAaA,EAAU,GACzBvD,EAAOz0B,aAAa,OAAQg4B,EAAU,IAEtCvD,EAAOz0B,aAAa,QAASosB,EAAae,YAAYnjD,IAAUA,EAElE,CACD,EAkEIiuD,EAAY,SAAS1jC,GACxB,GAAIA,EAAE+M,OAAO42B,WAAb,CAEA,IAAI9Z,EAAQ7pB,EAAE+M,OACV1K,EAAOwnB,EAAM8Z,WACbC,EAAK/Z,EAAMga,YAAcha,EAAMlU,IAGnC,GAAGiuB,EAAG,CACL,IAAIE,EAASV,EAAe1a,KAAKkb,GAAM/vB,KAAKj6B,UAAUgqD,GAAMA,EACxDrxB,EAAQ4jB,EAAU2M,KAAKzgC,EAAM,aAAc,CAC9CsT,IAAKiuB,EACLE,OAAQA,EACRC,QAAS,OAGNxxB,EAAMouB,mBACTt+B,EAAKwI,MAAMm5B,gBAAkBzxB,EAAMlI,OAAO05B,SAAW,OAASxxB,EAAMlI,OAAOy5B,OAAS,IAEtF,CAEGja,EAAMoa,oBACR9N,EAAU2M,KAAKzgC,EAAM,cAAe,CAAC,GAAG,GAAO,UACxCwnB,EAAMoa,kBAtBkB,CAwBjC,EAEA3nC,iBAAiB,oBAAoB,SAAS0D,GAC7C,IAAI7mB,EAAK0wC,EAAOxnB,GAEbrC,EAAE2gC,mBAAsBxnD,EAAM6mB,EAAE+M,OAAOuM,aAAa,iBAEvDjX,EAAOrC,EAAE+M,QACT8c,EAAQ9rB,EAASqN,cAAc,QAEzB84B,IAAM,GAEZra,EAAMoa,mBAAoB,EAC1BjkC,EAAEqK,OAAOq2B,WAAY,EAvGF,SAASyD,EAAM9hC,EAAMo/B,GACxC,IAAI2C,EAAUrmC,EAASqN,cAAc,WACjCk1B,EAAQj+B,EAAKiX,aAAaue,EAAaa,WACvC2L,EAAQhiC,EAAKiX,aAAa,cAC1BgrB,EAAWjiC,EAAKiX,aAAa,iBAE9BjX,EAAKshC,YAActhC,EAAKshC,WAAWrhC,YAAcD,GACnDA,EAAK6J,YAAY7J,EAAKshC,YAGvBtrD,OAAO6lC,eAAeujB,EAAK,aAAc,CACxC3rD,MAAOusB,EACPuc,UAAU,IAEXvmC,OAAO6lC,eAAe7b,EAAM,aAAc,CACzCvsB,MAAOsuD,EACPxlB,UAAU,IAGXulB,EAAOA,EAAK1xD,QAAQuwD,EAAU,KAAK99B,MAAM+9B,GAEzCmB,EAAQv5B,MAAMC,QAAU,OACxB22B,EAAIvwB,UAAY2mB,EAAaG,UAEX,GAAfmM,EAAK5tD,QAAgB+pD,IACvBA,EAAQ,QAGT6D,EAAKzkC,SAAQ,SAASvmB,GACrB,IAAI1D,EACAyqD,EAASniC,EAASqN,cAAc,UAEjCk1B,GAAkB,QAATA,GACXJ,EAAOz0B,aAAa,QAAS60B,IAG1B7qD,EAAQ0D,EAAI1D,MAAMytD,KACrBhD,EAAOz0B,aAAaosB,EAAaY,WAAYhjD,EAAM,IAEnD+tD,EAAetD,EAAQzqD,EAAM,IAC7B+tD,EAAetD,EAAQzqD,EAAM,KAE7ByqD,EAAOz0B,aAAaosB,EAAaY,WAAYt/C,GAG9CirD,EAAQv4B,YAAYq0B,EACrB,IAEGI,IACFmB,EAAIh2B,aAAaosB,EAAaa,UAAW4H,GACzCj+B,EAAKsV,gBAAgBkgB,EAAaa,WAClCr2B,EAAKsV,gBAAgB,UAEnB2sB,GACF7C,EAAIh2B,aAAa,gBAAiB64B,GAEhCD,GACF5C,EAAIh2B,aAAa,aAAc44B,GAGhCD,EAAQv4B,YAAY41B,GAEpBp/B,EAAKwJ,YAAYu4B,EAClB,CA0CCG,CAAcprD,EAAKkpB,EAAMwnB,GAEzBtrB,YAAW,WACV43B,EAAU2G,OAAOoF,OAAOrY,GAExBsM,EAAUp2B,KAAI,WACbo2B,EAAU2M,KAAKjZ,EAAO,cAAe,CAAC,GAAG,GAAM,GAC5CA,EAAMzH,UACRshB,EAAU,CAAC32B,OAAQ8c,GAErB,GACD,IAED,IAEA9rB,EAASzB,iBAAiB,OAAQonC,GAAW,GAE7CxwD,EAAOopB,iBAAiB,mBAAmB,SAAS0D,GACnD,GAAGA,EAAEqK,OAAO9uB,UAAY46C,GACrBn2B,EAAE+M,OAAO42B,YAAc3jC,EAAEqK,OAAOi4B,SAAS,CAC3C,IACIkC,EAnJU,SAASniC,GACxB,IAAImiC,EAQJ,OANAA,GAAU/2B,iBAAiBpL,IAAS,CAACsW,iBAAkB,WAAW,IAAIA,iBAAiB,oBAEnF0qB,EAAsBmB,IAAWnB,EAAsBhhC,EAAKwI,MAAM45B,kBACrED,EAASniC,EAAKwI,MAAM45B,gBAGdD,CACR,CAyIeE,CADF1kC,EAAE+M,OAAO42B,YAGjBN,EAAsBmB,KACxBxkC,EAAE+M,OAAO43B,oBAAsBH,EAE/BrO,EAAUp2B,KAAI,WACbC,EAAE+M,OAAOtB,aAAa,kBAAmB+4B,GACtCxkC,EAAE+M,OAAO43B,4BACJ3kC,EAAE+M,OAAO43B,mBAElB,IAEF,CACD,IAAG,GAEH5mC,EAAS6Z,gBAAgBtb,iBAAiB,mBAAmB,SAAS0D,GA1KrD,IAASqC,EACrBvD,GA0KDkB,EAAE2gC,kBAAqB3gC,EAAE+M,OAAO42B,YAAc3jC,EAAEqK,OAAO9uB,UAAY46C,IACtEn2B,EAAEqK,OAAOvL,OA5KgBuD,EA4KGrC,EAAE+M,OAAO42B,WA3KjC7kC,EAAQq3B,EAAU4M,GAAG1gC,EAAMA,EAAKC,cAEhCD,EAAKg5B,iBAAmBv8B,EAAQuD,EAAKg5B,mBACxCh5B,EAAKg5B,gBAAkBv8B,GAEjBuD,EAAKg5B,iBAuKb,GAtLoC,CAuLrC,0BC1MA,yBACC,GAAInoD,EAAJ,CAMAykD,EAAUA,EAAQxoB,KAAK,KAAMj8B,EAAQA,EAAO6qB,UAEZviB,EAAOlJ,QACtCqlD,EAAQ,EAAQ,QAEhB,EAAO,CAAC,cAAqB,0BAAP,EAAF,GAAS,+BAXV,CAiBrB,CAlBA,CAkBmB,oBAAVzkD,OACRA,OAAS,GAAG,SAASA,EAAQ6qB,EAAUo4B,GACvC,aAEA,GAAIjjD,EAAOopB,iBAAX,CAEA,IAAIsoC,EAAiB,6BACjBC,EAAY,mDACZC,EAAe,2DACfhL,EAAa,aACbR,EAAMnD,EAAUmD,IAMhByL,EAAY,CAEfC,UAAW,SAASz6B,EAAS06B,GAC5B,IAAI7J,EAAS7wB,EACTjI,EAAaiI,EAAQjI,WAoBzB,OAlBK2iC,GAA0B,QAAbA,IAAwB3iC,IAAcw3B,EAAWpR,KAAKpmB,EAAW6N,UAAY,MAC9F7N,EAAaA,EAAWA,YAGT,QAAb2iC,IAED7J,EADe,QAAb6J,EACO16B,EAAQwnB,uBACRkT,IAAc3iC,EAAWuvB,SAAW3+C,EAAOgyD,UAC1C5iC,EAAWuvB,QACnBvvB,EAAWuvB,QAAQoT,GACnBC,OAAO5iC,GAAYuvB,QAAQoT,GAAW,KAI/B3iC,GAIJ84B,CACR,EAEA+J,OAAQ,SAAS56B,GAChB,IAAI66B,EAAUC,EACVh8B,EAhCGoE,iBAgCUlD,EAhCa,OAAS,CAAC,EAiCpC0J,EAAU5K,EAAI4K,SAAW5K,EAAIi8B,WAC7BhqD,EAAM,CACTiqD,IAAKh7B,EAAQo6B,qBAAuBp6B,EAAQ+O,aAAa,oBAqB1D,OAlBIh+B,EAAIiqD,KAAOtxB,IAAYmxB,EAAWnxB,EAAQx+B,MAAMovD,MACnDvpD,EAAIiqD,IAAMH,EAAS,IAGjB9pD,EAAIiqD,OACNF,EAAY96B,EAAQi7B,2BAA6Bj7B,EAAQ+O,aAAa,2BAErDrF,IAAYmxB,EAAWnxB,EAAQx+B,MAAMqvD,MACrDO,EAAYD,EAAS,IAGtB9pD,EAAI8/C,OAAS2J,EAAUC,UAAUz6B,EAAS86B,IAI1C/pD,EAAIiqD,IAAMl8B,EAAIo8B,UAGRnqD,CACR,EAEAoqD,cAAe,SAASn7B,GACvB,IAAIj0B,EAAGkqD,EAAQmF,EAAOtB,EAAO5uD,EAAOqpB,EAAOD,EACvCu8B,EAAS7wB,EAAQjI,WACjBxE,EAAWs9B,GAAUtB,EAAWpR,KAAK0S,EAAOjrB,UAAY,IAC1DirB,EAAO7qB,iBAAiB,eACxB,CAAChG,GAGH,IAAIj0B,EAAI,EAAGA,EAAIwnB,EAASvnB,OAAQD,IAM/B,GAJAkqD,GADAj2B,EAAUzM,EAASxnB,IACFgjC,aAAaggB,EAAIb,aAAeluB,EAAQ+O,aAAa,WAAa/O,EAAQ+O,aAAa,kBAAoB/O,EAAQ+O,aAAa,kBAAoB,GACrKqsB,EAAQp7B,EAAQq7B,UAAYr7B,EAAQ+O,aAAa,SACjDqsB,EAAQrM,EAAIV,YAAYruB,EAAQ+O,aAAa,eAAiBqsB,IAAUA,EAErEnF,KAAYmF,IAAUzyD,EAAOk6C,YAAcA,WAAWuY,IAAU,CAAC,GAAGtY,SAAU,EAChFgX,EAAQxpD,WAAW0vB,EAAQ+O,aAAa,yBAGvC7jC,EAAQ+qD,EAAO/qD,MAAMmvD,IAGL,KAAZnvD,EAAM,IACRqpB,EAAQrpB,EAAM,GACdopB,EAASppB,EAAM,KAEfqpB,EAAQrpB,EAAM,GACdopB,EAASppB,EAAM,KAGhBqpB,EAAQyL,EAAQ+O,aAAa,SAC7Bza,EAAS0L,EAAQ+O,aAAa,WAG/B+qB,EAAQvlC,EAAQD,GAGjB,KACD,CAGD,OAAOwlC,CACR,EAEAwB,cAAe,SAASt7B,EAASzL,GAChC,IAAIgnC,EAAsBC,EAAYC,EAClCC,EAAS1zD,KAAK4yD,OAAO56B,GACrBg7B,EAAMU,EAAOV,IACbW,EAAUD,EAAO7K,OAErB,MAAU,SAAPmK,IAA2B,WAAPA,GAA2B,SAAPA,KAAqBQ,EAAaxzD,KAAKmzD,cAAcn7B,KAI7F27B,EACFpnC,EAAQonC,EAAQhH,YAEhBgH,EAAU37B,EAGXy7B,EAAWlnC,EAED,SAAPymC,EACFS,EAAWlnC,GAIPgnC,EAAgBhnC,EAFXonC,EAAQjH,gBAE+B,SAAPsG,GAAkBO,EAAeC,GAAuB,WAAPR,GAAoBO,EAAeC,KAC5HC,EAAWlnC,GAASinC,EAAaD,IAI5BE,GArBClnC,CAsBT,GAGDq3B,EAAU4O,UAAYA,EAEtBhnC,EAASzB,iBAAiB,mBAAmB,SAAS0D,GACrD,IAAGA,EAAE2gC,kBAAoB3gC,EAAEqK,OAAO9uB,UAAY46C,EAA9C,CAEA,IAAI5rB,EAAUvK,EAAE+M,OAChB/M,EAAEqK,OAAOvL,MAAQimC,EAAUc,cAAct7B,EAASvK,EAAEqK,OAAOvL,MAHK,CAIjE,GAtJoC,CAuJrC,0BC7KA,yBACC,GAAI5rB,EAAJ,CAMAykD,EAAUA,EAAQxoB,KAAK,KAAMj8B,EAAQA,EAAO6qB,UAEZviB,EAAOlJ,QACtCqlD,EAAQ,EAAQ,QAEhB,EAAO,CAAC,cAAqB,0BAAP,EAAF,GAAS,+BAXV,CAiBrB,CAlBA,CAkBmB,oBAAVzkD,OACRA,OAAS,GAAG,SAASA,EAAQ6qB,EAAUo4B,GAEvC,aACA,IAAI2E,EAMC8J,EACAllC,EAgHCymC,EACAC,EACAC,EACAC,EAtCDC,EAGAC,EA+BAC,EAgCAC,EAqBAC,EAuCAC,EAYAC,EAoCAnnB,EAmBConB,EApRFjP,EAAe1B,EAAUmD,IACzBmI,EAAM1jC,EAASqN,cAAc,OAC7B27B,EAAiB,UAAWtF,GAAS,WAAYA,EACjDuF,EAAW,WACXC,GACCrC,EAAiB,6BACjBllC,EAAUxoB,MAAMpC,UAAU4qB,QAEvB,WACN,IAAI+hC,EAAM1jC,EAASqN,cAAc,OAC7B87B,EAAqB,SAAShH,GACjC,IAAImE,EAAO5uD,EACP+qD,EAASN,EAAO5mB,aAAaue,EAAaY,YAC3C+H,IACE/qD,EAAQ+qD,EAAO/qD,MAAMmvD,OAEvBP,EADc,KAAZ5uD,EAAM,GACAA,EAAM,GAAKA,EAAM,GAEjBA,EAAM,GAAKA,EAAM,KAIzByqD,EAAOz0B,aAAa,mBAAoB44B,GAEzCnE,EAAOz0B,aAAaosB,EAAaY,WAAY+H,EAAO/tD,QAAQu0D,EAAU,KAGzE,EACIG,EAAU,SAASnnC,GACtB,GAAGA,EAAEqK,OAAO9uB,UAAY46C,EAAxB,CACA,IAAIiO,EAAUpkC,EAAE+M,OAAOzK,WAEpB8hC,GAA+B,WAApBA,EAAQj0B,UACrBzQ,EAAQiB,KAAKyjC,EAAQvuB,qBAAqB,UAAWqxB,GAEtDA,EAAmBlnC,EAAE+M,OANqB,CAO3C,EAEI2b,EAAO,WACL+Y,EAAIoC,YACR9lC,EAASyF,oBAAoB,mBAAoB2jC,EAEnD,EAEAppC,EAASzB,iBAAiB,mBAAoB6qC,GAE9C1F,EAAIL,OAAS1Y,EACb+Y,EAAI2F,QAAU1e,EAEd+Y,EAAIjB,OAAS,gBAEViB,EAAIrf,UACNsG,GAEF,IAGGmP,EAAawP,eAChBxP,EAAawP,aAAe,SAAS9tD,GACpC,OAAQA,CACT,GAGGrG,EAAOwmD,oBAAsBqN,IAC5B5Q,EAAUmR,mBAAqBvpC,EAASwpC,sBAC3CpR,EAAUmR,mBAAoB,EAC9BL,KAKC/zD,EAAO6nD,aAAelD,EAAamD,KAEtCnD,EAAamD,GAAK,SAASv+B,GAC1B,IAAInmB,EAAGmhD,EACP,IAAGvkD,EAAO6nD,YACV,IAAIzkD,EAAI,EAAGmhD,EAAMh7B,EAAQqB,SAASvnB,OAAQD,EAAImhD,EAAKnhD,IAClDwkD,EAASr+B,EAAQqB,SAASxnB,GAE5B,EAIKiwD,EAAgB,SAAUrlC,EAAGC,GAChC,OAAOD,EAAEsmC,EAAIrmC,EAAEqmC,CAChB,EACIhB,EAAc,sBAiCbJ,EAAiB,8BACjBC,EAAc,KACdC,EAAe,SAAS7wD,EAAOgyD,EAAW/xD,EAAKgyD,GAClDvB,EAAWxkC,KAAK,CACf0c,EAAGopB,EACHlpB,EAAG7oC,EACH8xD,EAAiB,EAAdE,GAEL,EAsBGhB,EAAgB,WAIQ,IACtBiB,EACAC,EACAlkB,EANFgjB,EAAct0B,OAEjBs0B,EAAct0B,MAAO,EACrB9V,iBAAiB,UAEZsrC,EAAkB7pC,EAASs7B,uBAAuB,kBAClD3V,EAAM,WACT,IAAIptC,EAAGmhD,EACP,IAAInhD,EAAI,EAAGmhD,EAAMmQ,EAAgBrxD,OAAQD,EAAImhD,EAAKnhD,IACjDwkD,EAAS8M,EAAgBtxD,GAE3B,EAEO,WACNitB,aAAaokC,GACbA,EAAQppC,WAAWmlB,EAAK,GACzB,IAEF,EAEIijB,EAAe,SAAStkC,EAAMwlC,GACjC,IAAIC,EACAC,EAAS1lC,EAAKiX,aAAa,WAAajX,EAAKiX,aAAaue,EAAaY,aAEvEsP,GAAUF,IACbE,EAAU1lC,EAAK2lC,cAEd3lC,EAAK2lC,cAAcC,KADlB5lC,EAAKiX,aAAaue,EAAaW,UAAYn2B,EAAKiX,aAAa,QAK5DjX,EAAK2lC,eAAiB3lC,EAAK2lC,cAAcC,MAAQF,IAEpDD,EAAYrB,EAAcsB,GAAU,IACjCF,GAAWxlC,EAAKC,aAClBwlC,EAAUrH,UAAsD,WAA1Cp+B,EAAKC,WAAW6N,SAAS/2B,cAE5C0uD,EAAUrH,WACTvtD,EAAOk6C,aACT+I,EAAUwM,GAAGtgC,EAAM,kBACnBqkC,MAKHoB,EAAUG,KAAOF,EACjB1vD,OAAO6lC,eAAe7b,EAAM,gBAAiB,CAC5CvsB,MAAOgyD,EACPlpB,UAAU,IAGb,EAQIgoB,EAAe,SAASjB,GAC3B,OAAGzyD,EAAOk6C,YACTwZ,EAAe,SAASjB,GACvB,OAAQA,IAAUvY,WAAWuY,IAAU,CAAC,GAAGtY,OAC5C,EAKMuZ,EAAajB,KAHXA,CAIV,EAEIkB,EAAe,SAASxkC,GAC3B,IAAIggC,EAAS/rD,EAAGmhD,EAAYyI,EAAQgI,EAAOvyB,EAAK7W,EAMhD,GAHA6nC,EADAzG,EAAS79B,GACY,IACrB6lC,EAAQhI,EAAO8H,eAENvH,UACR,IAAInqD,EAAI,EAA6DmhD,GAA1D4K,EAAUhgC,EAAKC,WAAWuT,qBAAqB,WAAyBt/B,OAAQD,EAAImhD,EAAKnhD,IACnG,GAAIuhD,EAAawP,aAAahF,EAAQ/rD,GAAGgjC,aAAa,QAASjX,IAASukC,EAAcvE,EAAQ/rD,GAAGgjC,aAAa,UAAW,CACxH4mB,EAASmC,EAAQ/rD,GACjBqwD,EAAazG,GACbgI,EAAQhI,EAAO8H,cACf,KACD,CAmBF,OAfGE,EAAM3xD,OAAS,GACjBuoB,EAAQohC,EAAO5mB,aAAa,UAAY,GACxCxa,EAAQ0nC,EAAY9d,KAAK5pB,IAAUlkB,SAASkkB,EAAO,KAAOq3B,EAAU4M,GAAG1gC,EAAMA,EAAKC,YAClF4lC,EAAMvoB,EAvCG,SAAStd,GACnB,IAAI8lC,EAAMj1D,EAAOk1D,kBAAoB,EACjCC,EAAUlS,EAAUmS,MAAQnS,EAAUmS,KAAKjmC,GAC/C,OAAOoH,KAAKoD,IAAIw7B,GAAWF,EAAK,IAAKA,EACtC,CAmCYG,CAAKjmC,IACX6lC,EAAMvyB,MAAQuyB,EAAMV,GAAKU,EAAMV,EAAI1oC,GACtCopC,EAAMV,EAAI1oC,EACV6W,EA9JmB,SAAUuyB,GAM/B,IALA,IAAIK,EAAgBC,EAChB/Q,EAAMyQ,EAAM3xD,OACZkxD,EAAYS,EAAMzQ,EAAK,GACvBnhD,EAAI,EAEDA,EAAImhD,EAAInhD,IAId,IAHAmxD,EAAYS,EAAM5xD,IACRqpC,EAAI8nB,EAAUD,EAAIU,EAAMV,EAE/BC,EAAU9nB,GAAKuoB,EAAMvoB,EAAE,EACrB8nB,EAAUgB,SAAWF,EAAiBL,EAAM5xD,EAAI,KACnDiyD,EAAe5oB,EAAIuoB,EAAMvoB,EAAK,IAAOlW,KAAKi/B,IAAIR,EAAMvoB,EAAG,OAEvD6oB,EAAc/+B,KAAKi/B,IAAIH,EAAe5oB,EAAI,GAAK,KAE5C4oB,EAAeE,SACjBF,EAAe5oB,GAAK,IAAO6oB,GAGzBD,EAAe5oB,GAAM8nB,EAAU9nB,EAAIuoB,EAAMvoB,GAAK6oB,EAAeN,EAAMvoB,IACrE8nB,EAAYc,IAGd,KACD,CAED,OAAOd,CACR,CAkISkB,CAAgBT,EAAMjnC,KAAKslC,IACjC2B,EAAMvyB,IAAMA,GAEZA,EAAMuyB,EAAMvyB,KAGbA,EAAMuyB,EAAM,GAGNvyB,CACR,GAEI+J,EAAI,SAASrd,GAChB,IAAG0kC,IAAiB1kC,EAAKC,YAAwD,WAA1CD,EAAKC,WAAW6N,SAAS/2B,cAAhE,CACA,IAAIquD,EAAYZ,EAAaxkC,GAE1BolC,GAAaA,EAAUlpB,GAAKlc,EAAK2lC,cAAcY,KAAOnB,EAAUlpB,IAClElc,EAAK2lC,cAAcY,IAAMnB,EAAUlpB,EACnCkpB,EAAUgB,QAAS,EACnBpmC,EAAKoJ,aAAaosB,EAAaW,QAASiP,EAAUlpB,GAClDlc,EAAKoJ,aAAa,MAAOg8B,EAAUlpB,GAP+D,CASpG,GAEEzK,MAxJE2yB,EAYI,SAAS3jB,GAgBf,OAfAqjB,EAAa,IACbrjB,EAAQA,EAAM7d,QAEZxyB,QAAQu0D,EAAU,IAClBv0D,QAAQ2zD,EAAgBE,GAGtBH,EAAW5vD,SAAUusC,GAAUujB,EAAY3d,KAAK5F,IACnDqjB,EAAWxkC,KAAK,CACf0c,EAAGyE,EACHvE,EAAGuE,EACH0kB,EAAG,KAIErB,CACR,EAhEFrL,EA6LQpb,EAGLmY,EAAaI,aAAeJ,EAAaK,eAEtC4O,EAAO,GACX,CAAC,4BAA6B,gCAAgCpnC,SAAQ,SAASmpC,GAC9E/B,EAAKnlC,KAAKknC,EAAMhR,EAAaI,aAC7B6O,EAAKnlC,KAAKknC,EAAMhR,EAAaK,aAC9B,IACAL,EAAamD,GAAG,CACfl9B,SAAUC,EAASwS,iBAAiBu2B,EAAKjvD,KAAK,UAKlD,wBCtTA,WAkCC,SAAS3E,EAAQykD,GAMjBA,EAAUA,EAAQxoB,KAAK,KAAMj8B,EAAQA,EAAO6qB,UAEZviB,EAAOlJ,QACtCqlD,EAAQ,EAAQ,QAEhB,EAAO,CAAC,cAAqB,0BAAP,EAAF,GAAS,+BAM/B,CAjBA,CAiBEzkD,QAAQ,SAASA,EAAQ6qB,EAAUo4B,GAEpC,aACA,IAAI2S,EAAQ1F,EACR2F,EAAa,CAAC,EAwGlB,SAASC,EAAerzB,EAAK9K,EAAOysB,GACnC,IAAGyR,EAAWpzB,GAAd,CAGA,IAAItT,EAAOtE,EAASqN,cAAcP,EAAQ,OAAS,UAC/Co+B,EAAalrC,EAAS8X,qBAAqB,UAAU,GAEtDhL,GACFxI,EAAK6mC,IAAM,aACX7mC,EAAK8mC,KAAOxzB,IAEZtT,EAAK++B,OAAS,WACb/+B,EAAK+kC,QAAU,KACf/kC,EAAK++B,OAAS,KACd9J,GACD,EACAj1B,EAAK+kC,QAAU/kC,EAAK++B,OAEpB/+B,EAAKsT,IAAMA,GAEZozB,EAAWpzB,IAAO,EAClBozB,EAAW1mC,EAAKsT,KAAOtT,EAAK8mC,OAAQ,EACpCF,EAAW3mC,WAAW6I,aAAa9I,EAAM4mC,EAnBzC,CAoBD,CA7HGlrC,EAASzB,mBACX8mC,EAAiB,aAEjB0F,EAAS,SAAUpzD,EAAK4hD,GACvB,IAAImK,EAAM1jC,EAASqN,cAAc,OACjCq2B,EAAIL,OAAS,WACZK,EAAIL,OAAS,KACbK,EAAI2F,QAAU,KACd3F,EAAM,KACNnK,GACD,EACAmK,EAAI2F,QAAU3F,EAAIL,OAElBK,EAAI9rB,IAAMjgC,EAEP+rD,GAAOA,EAAIrf,UAAYqf,EAAIL,QAC7BK,EAAIL,QAEN,EAEA9kC,iBAAiB,oBAAoB,SAAS0D,GAG7C,IAAIopC,EAAWxF,EAAIyF,EAFnB,GAAGrpC,EAAEqK,OAAO9uB,UAAY46C,IAGpBn2B,EAAE2gC,iBAAkB,CAEvB,IAAI5zB,EAAS/M,EAAE+M,OAMf,GAJqB,QAAlBA,EAAOu8B,UACTv8B,EAAOu8B,QAAUv8B,EAAOuM,aAAa,iBAAmB,QAGb,MAAxCvM,EAAOuM,aAAa,iBACvB,GAAIvM,EAAOuM,aAAa,iBAAmBvM,EAAOw8B,SACjD,IACCx8B,EAAOy8B,MACR,CAAE,MAAOC,GAAK,MAEd56B,uBAAsB,WACrB9B,EAAOtB,aAAa,cAAe,OACnC0qB,EAAUwM,GAAG51B,EAAQopB,EAAUmD,IAAItB,UACpC,KAIFoR,EAAMr8B,EAAOuM,aAAa,eAEzB0vB,EAAeI,GAAK,IAIrBA,EAAMr8B,EAAOuM,aAAa,kBAEzBtZ,EAAEqK,OAAOq2B,WAAY,EAKrBsI,EAAeI,EAAK,MAJb,WACNppC,EAAEqK,OAAOq2B,WAAY,EACrBvK,EAAU2M,KAAK/1B,EAAQ,cAAe,CAAC,GAAG,GAAM,EACjD,MAKDq8B,EAAMr8B,EAAOuM,aAAa,mBAEtB6c,EAAUmD,IAAIoQ,UAChBvT,EAAUmD,IAAIoQ,UAAU,CAACN,IAEzBJ,EAAeI,KAKjBxF,EAAK72B,EAAOuM,aAAa,cAExBtZ,EAAEqK,OAAOq2B,WAAY,EAOrBoI,EAAOlF,GANA,WACN72B,EAAOlC,MAAMm5B,gBAAkB,QAAUZ,EAAe1a,KAAKkb,GAAM/vB,KAAKj6B,UAAUgqD,GAAMA,GAAO,IAC/F5jC,EAAEqK,OAAOq2B,WAAY,EACrBvK,EAAU2M,KAAK/1B,EAAQ,cAAe,CAAC,GAAG,GAAM,EACjD,MAMDs8B,EAASt8B,EAAOuM,aAAa,kBAE5BtZ,EAAEqK,OAAOq2B,WAAY,EAOrBoI,EAAOO,GANA,WACNt8B,EAAOs8B,OAASA,EAChBrpC,EAAEqK,OAAOq2B,WAAY,EACrBvK,EAAU2M,KAAK/1B,EAAQ,cAAe,CAAC,GAAG,GAAM,EACjD,IAKF,CACD,IAAG,GA4BL,mCC7JA,SAASh3B,EAAeuF,EAAKw8C,GAC3B,OAAOz/C,OAAOvD,UAAUiB,eAAe4qB,KAAKrlB,EAAKw8C,EACnD,CAEAt8C,EAAOlJ,QAAU,SAASq3D,EAAIC,EAAKC,EAAIptC,GACrCmtC,EAAMA,GAAO,IACbC,EAAKA,GAAM,IACX,IAAIvuD,EAAM,CAAC,EAEX,GAAkB,iBAAPquD,GAAiC,IAAdA,EAAGpzD,OAC/B,OAAO+E,EAGT,IAAIwuD,EAAS,MACbH,EAAKA,EAAGzkC,MAAM0kC,GAEd,IAAIG,EAAU,IACVttC,GAAsC,iBAApBA,EAAQstC,UAC5BA,EAAUttC,EAAQstC,SAGpB,IAAItS,EAAMkS,EAAGpzD,OAETwzD,EAAU,GAAKtS,EAAMsS,IACvBtS,EAAMsS,GAGR,IAAK,IAAIzzD,EAAI,EAAGA,EAAImhD,IAAOnhD,EAAG,CAC5B,IAEI0zD,EAAMC,EAAM7uD,EAAG00B,EAFfo6B,EAAIP,EAAGrzD,GAAG7D,QAAQq3D,EAAQ,OAC1BK,EAAMD,EAAExoC,QAAQmoC,GAGhBM,GAAO,GACTH,EAAOE,EAAEj8B,OAAO,EAAGk8B,GACnBF,EAAOC,EAAEj8B,OAAOk8B,EAAM,KAEtBH,EAAOE,EACPD,EAAO,IAGT7uD,EAAI4/B,mBAAmBgvB,GACvBl6B,EAAIkL,mBAAmBivB,GAElBl0D,EAAeuF,EAAKF,GAEdlE,MAAMC,QAAQmE,EAAIF,IAC3BE,EAAIF,GAAGumB,KAAKmO,GAEZx0B,EAAIF,GAAK,CAACE,EAAIF,GAAI00B,GAJlBx0B,EAAIF,GAAK00B,CAMb,CAEA,OAAOx0B,CACT,iCCxDA,IAAI8uD,EAAqB,SAASt6B,GAChC,cAAeA,GACb,IAAK,SACH,OAAOA,EAET,IAAK,UACH,OAAOA,EAAI,OAAS,QAEtB,IAAK,SACH,OAAOu6B,SAASv6B,GAAKA,EAAI,GAE3B,QACE,MAAO,GAEb,EAEAt0B,EAAOlJ,QAAU,SAASgJ,EAAKsuD,EAAKC,EAAIlmC,GAOtC,OANAimC,EAAMA,GAAO,IACbC,EAAKA,GAAM,IACC,OAARvuD,IACFA,OAAMpG,GAGW,iBAARoG,EACFjD,OAAOC,KAAKgD,GAAK1D,KAAI,SAASwD,GACnC,IAAIkvD,EAAKt0D,mBAAmBo0D,EAAmBhvD,IAAMyuD,EACrD,OAAI3yD,MAAMC,QAAQmE,EAAIF,IACbE,EAAIF,GAAGxD,KAAI,SAASk4B,GACzB,OAAOw6B,EAAKt0D,mBAAmBo0D,EAAmBt6B,GACpD,IAAGj4B,KAAK+xD,GAEDU,EAAKt0D,mBAAmBo0D,EAAmB9uD,EAAIF,IAE1D,IAAG6qC,OAAO9vC,SAAS0B,KAAK+xD,GAIrBjmC,EACE3tB,mBAAmBo0D,EAAmBzmC,IAASkmC,EAC/C7zD,mBAAmBo0D,EAAmB9uD,IAF3B,EAGpB,qCC7DAhJ,EAAQi4D,OAASj4D,EAAQwhC,MAAQ,EAAhB,MACjBxhC,EAAQk4D,OAASl4D,EAAQsH,UAAY,EAApB,wBCIjB,IAAI6wD,EAAW,SAAUn4D,GACvB,aAEA,IAEI4C,EAFAw1D,EAAKryD,OAAOvD,UACZ61D,EAASD,EAAG30D,eAEZ60D,EAA4B,mBAAXzsB,OAAwBA,OAAS,CAAC,EACnD0sB,EAAiBD,EAAQxsB,UAAY,aACrC0sB,EAAsBF,EAAQtsB,eAAiB,kBAC/CysB,EAAoBH,EAAQpsB,aAAe,gBAE/C,SAASK,EAAKmsB,EAASC,EAASlnB,EAAMmnB,GAEpC,IAAIC,EAAiBF,GAAWA,EAAQn2D,qBAAqBgqC,EAAYmsB,EAAUnsB,EAC/EssB,EAAY/yD,OAAO8F,OAAOgtD,EAAer2D,WACzCu2D,EAAU,IAAItsB,EAAQmsB,GAAe,IAMzC,OAFAE,EAAUtrB,QAkMZ,SAA0BkrB,EAASjnB,EAAMsnB,GACvC,IAAIzkC,EAAQ0kC,EAEZ,OAAO,SAAgBh8B,EAAQ4P,GAC7B,GAAItY,IAAU2kC,EACZ,MAAM,IAAIzzD,MAAM,gCAGlB,GAAI8uB,IAAU4kC,EAAmB,CAC/B,GAAe,UAAXl8B,EACF,MAAM4P,EAKR,OAAOusB,GACT,CAKA,IAHAJ,EAAQ/7B,OAASA,EACjB+7B,EAAQnsB,IAAMA,IAED,CACX,IAAIkB,EAAWirB,EAAQjrB,SACvB,GAAIA,EAAU,CACZ,IAAIsrB,EAAiBrrB,EAAoBD,EAAUirB,GACnD,GAAIK,EAAgB,CAClB,GAAIA,IAAmBC,EAAkB,SACzC,OAAOD,CACT,CACF,CAEA,GAAuB,SAAnBL,EAAQ/7B,OAGV+7B,EAAQ/qB,KAAO+qB,EAAQ9qB,MAAQ8qB,EAAQnsB,SAElC,GAAuB,UAAnBmsB,EAAQ/7B,OAAoB,CACrC,GAAI1I,IAAU0kC,EAEZ,MADA1kC,EAAQ4kC,EACFH,EAAQnsB,IAGhBmsB,EAAQ7qB,kBAAkB6qB,EAAQnsB,IAEpC,KAA8B,WAAnBmsB,EAAQ/7B,QACjB+7B,EAAQ5qB,OAAO,SAAU4qB,EAAQnsB,KAGnCtY,EAAQ2kC,EAER,IAAIK,EAAS3sB,EAAS+rB,EAASjnB,EAAMsnB,GACrC,GAAoB,WAAhBO,EAAOryD,KAAmB,CAO5B,GAJAqtB,EAAQykC,EAAQ91B,KACZi2B,EACAK,EAEAD,EAAO1sB,MAAQysB,EACjB,SAGF,MAAO,CACL71D,MAAO81D,EAAO1sB,IACd3J,KAAM81B,EAAQ91B,KAGlB,CAA2B,UAAhBq2B,EAAOryD,OAChBqtB,EAAQ4kC,EAGRH,EAAQ/7B,OAAS,QACjB+7B,EAAQnsB,IAAM0sB,EAAO1sB,IAEzB,CACF,CACF,CA9QsBF,CAAiBgsB,EAASjnB,EAAMsnB,GAE7CD,CACT,CAaA,SAASnsB,EAAS0E,EAAIroC,EAAK4jC,GACzB,IACE,MAAO,CAAE3lC,KAAM,SAAU2lC,IAAKyE,EAAGhjB,KAAKrlB,EAAK4jC,GAC7C,CAAE,MAAOxoC,GACP,MAAO,CAAE6C,KAAM,QAAS2lC,IAAKxoC,EAC/B,CACF,CAlBApE,EAAQusC,KAAOA,EAoBf,IAAIysB,EAAyB,iBACzBO,EAAyB,iBACzBN,EAAoB,YACpBC,EAAoB,YAIpBG,EAAmB,CAAC,EAMxB,SAAS7sB,IAAa,CACtB,SAASU,IAAqB,CAC9B,SAASC,IAA8B,CAIvC,IAAIqsB,EAAoB,CAAC,EACzBA,EAAkBjB,GAAkB,WAClC,OAAOt4D,IACT,EAEA,IAAIw5D,EAAW1zD,OAAOunC,eAClBosB,EAA0BD,GAAYA,EAASA,EAASjpC,EAAO,MAC/DkpC,GACAA,IAA4BtB,GAC5BC,EAAOhqC,KAAKqrC,EAAyBnB,KAGvCiB,EAAoBE,GAGtB,IAAIC,EAAKxsB,EAA2B3qC,UAClCgqC,EAAUhqC,UAAYuD,OAAO8F,OAAO2tD,GAQtC,SAASjsB,EAAsB/qC,GAC7B,CAAC,OAAQ,QAAS,UAAU4qB,SAAQ,SAAS4P,GAC3Cx6B,EAAUw6B,GAAU,SAAS4P,GAC3B,OAAO3sC,KAAKutC,QAAQxQ,EAAQ4P,EAC9B,CACF,GACF,CAiCA,SAASa,EAAcqrB,GACrB,SAASprB,EAAO1Q,EAAQ4P,EAAK7kC,EAASC,GACpC,IAAIsxD,EAAS3sB,EAASmsB,EAAU97B,GAAS87B,EAAWlsB,GACpD,GAAoB,UAAhB0sB,EAAOryD,KAEJ,CACL,IAAI8B,EAASuwD,EAAO1sB,IAChBppC,EAAQuF,EAAOvF,MACnB,OAAIA,GACiB,iBAAVA,GACP60D,EAAOhqC,KAAK7qB,EAAO,WACdsE,QAAQC,QAAQvE,EAAMoqC,SAASnkC,MAAK,SAASjG,GAClDkqC,EAAO,OAAQlqC,EAAOuE,EAASC,EACjC,IAAG,SAAS5D,GACVspC,EAAO,QAAStpC,EAAK2D,EAASC,EAChC,IAGKF,QAAQC,QAAQvE,GAAOiG,MAAK,SAASmwD,GAI1C7wD,EAAOvF,MAAQo2D,EACf7xD,EAAQgB,EACV,IAAG,SAASb,GAGV,OAAOwlC,EAAO,QAASxlC,EAAOH,EAASC,EACzC,GACF,CAzBEA,EAAOsxD,EAAO1sB,IA0BlB,CAEA,IAAIitB,EAgCJ55D,KAAKutC,QA9BL,SAAiBxQ,EAAQ4P,GACvB,SAASiB,IACP,OAAO,IAAI/lC,SAAQ,SAASC,EAASC,GACnC0lC,EAAO1Q,EAAQ4P,EAAK7kC,EAASC,EAC/B,GACF,CAEA,OAAO6xD,EAaLA,EAAkBA,EAAgBpwD,KAChCokC,EAGAA,GACEA,GACR,CAKF,CAyGA,SAASE,EAAoBD,EAAUirB,GACrC,IAAI/7B,EAAS8Q,EAAShC,SAASitB,EAAQ/7B,QACvC,GAAIA,IAAWp6B,EAAW,CAKxB,GAFAm2D,EAAQjrB,SAAW,KAEI,UAAnBirB,EAAQ/7B,OAAoB,CAE9B,GAAI8Q,EAAShC,SAAiB,SAG5BitB,EAAQ/7B,OAAS,SACjB+7B,EAAQnsB,IAAMhqC,EACdmrC,EAAoBD,EAAUirB,GAEP,UAAnBA,EAAQ/7B,QAGV,OAAOq8B,EAIXN,EAAQ/7B,OAAS,QACjB+7B,EAAQnsB,IAAM,IAAIyB,UAChB,iDACJ,CAEA,OAAOgrB,CACT,CAEA,IAAIC,EAAS3sB,EAAS3P,EAAQ8Q,EAAShC,SAAUitB,EAAQnsB,KAEzD,GAAoB,UAAhB0sB,EAAOryD,KAIT,OAHA8xD,EAAQ/7B,OAAS,QACjB+7B,EAAQnsB,IAAM0sB,EAAO1sB,IACrBmsB,EAAQjrB,SAAW,KACZurB,EAGT,IAAI/oC,EAAOgpC,EAAO1sB,IAElB,OAAMtc,EAOFA,EAAK2S,MAGP81B,EAAQjrB,EAASQ,YAAche,EAAK9sB,MAGpCu1D,EAAQxqB,KAAOT,EAASU,QAQD,WAAnBuqB,EAAQ/7B,SACV+7B,EAAQ/7B,OAAS,OACjB+7B,EAAQnsB,IAAMhqC,GAUlBm2D,EAAQjrB,SAAW,KACZurB,GANE/oC,GA3BPyoC,EAAQ/7B,OAAS,QACjB+7B,EAAQnsB,IAAM,IAAIyB,UAAU,oCAC5B0qB,EAAQjrB,SAAW,KACZurB,EA+BX,CAqBA,SAAS5qB,EAAaqrB,GACpB,IAAIC,EAAQ,CAAErrB,OAAQorB,EAAK,IAEvB,KAAKA,IACPC,EAAMprB,SAAWmrB,EAAK,IAGpB,KAAKA,IACPC,EAAMnrB,WAAakrB,EAAK,GACxBC,EAAMlrB,SAAWirB,EAAK,IAGxB75D,KAAK6uC,WAAWzf,KAAK0qC,EACvB,CAEA,SAAShrB,EAAcgrB,GACrB,IAAIT,EAASS,EAAM/qB,YAAc,CAAC,EAClCsqB,EAAOryD,KAAO,gBACPqyD,EAAO1sB,IACdmtB,EAAM/qB,WAAasqB,CACrB,CAEA,SAAS7sB,EAAQmsB,GAIf34D,KAAK6uC,WAAa,CAAC,CAAEJ,OAAQ,SAC7BkqB,EAAYxrC,QAAQqhB,EAAcxuC,MAClCA,KAAKyzB,OAAM,EACb,CA6BA,SAASlD,EAAOwpC,GACd,GAAIA,EAAU,CACZ,IAAIC,EAAiBD,EAASzB,GAC9B,GAAI0B,EACF,OAAOA,EAAe5rC,KAAK2rC,GAG7B,GAA6B,mBAAlBA,EAASzrB,KAClB,OAAOyrB,EAGT,IAAK/qB,MAAM+qB,EAAS/1D,QAAS,CAC3B,IAAID,GAAK,EAAGuqC,EAAO,SAASA,IAC1B,OAASvqC,EAAIg2D,EAAS/1D,QACpB,GAAIo0D,EAAOhqC,KAAK2rC,EAAUh2D,GAGxB,OAFAuqC,EAAK/qC,MAAQw2D,EAASh2D,GACtBuqC,EAAKtL,MAAO,EACLsL,EAOX,OAHAA,EAAK/qC,MAAQZ,EACb2rC,EAAKtL,MAAO,EAELsL,CACT,EAEA,OAAOA,EAAKA,KAAOA,CACrB,CACF,CAGA,MAAO,CAAEA,KAAM4qB,EACjB,CAGA,SAASA,IACP,MAAO,CAAE31D,MAAOZ,EAAWqgC,MAAM,EACnC,CA8MA,OAxmBAiK,EAAkB1qC,UAAYm3D,EAAGjoC,YAAcyb,EAC/CA,EAA2Bzb,YAAcwb,EACzCC,EAA2BsrB,GACzBvrB,EAAkBgC,YAAc,oBAYlClvC,EAAQmvC,oBAAsB,SAAS+qB,GACrC,IAAIC,EAAyB,mBAAXD,GAAyBA,EAAOxoC,YAClD,QAAOyoC,IACHA,IAASjtB,GAG2B,uBAAnCitB,EAAKjrB,aAAeirB,EAAK9oC,MAEhC,EAEArxB,EAAQovC,KAAO,SAAS8qB,GAUtB,OATIn0D,OAAOspC,eACTtpC,OAAOspC,eAAe6qB,EAAQ/sB,IAE9B+sB,EAAO5qB,UAAYnC,EACbsrB,KAAqByB,IACzBA,EAAOzB,GAAqB,sBAGhCyB,EAAO13D,UAAYuD,OAAO8F,OAAO8tD,GAC1BO,CACT,EAMAl6D,EAAQuvC,MAAQ,SAAS3C,GACvB,MAAO,CAAEgB,QAAShB,EACpB,EAqEAW,EAAsBE,EAAcjrC,WACpCirC,EAAcjrC,UAAUg2D,GAAuB,WAC7C,OAAOv4D,IACT,EACAD,EAAQytC,cAAgBA,EAKxBztC,EAAQwvC,MAAQ,SAASkpB,EAASC,EAASlnB,EAAMmnB,GAC/C,IAAIwB,EAAO,IAAI3sB,EACblB,EAAKmsB,EAASC,EAASlnB,EAAMmnB,IAG/B,OAAO54D,EAAQmvC,oBAAoBwpB,GAC/ByB,EACAA,EAAK7rB,OAAO9kC,MAAK,SAASV,GACxB,OAAOA,EAAOk6B,KAAOl6B,EAAOvF,MAAQ42D,EAAK7rB,MAC3C,GACN,EAqKAhB,EAAsBosB,GAEtBA,EAAGlB,GAAqB,YAOxBkB,EAAGpB,GAAkB,WACnB,OAAOt4D,IACT,EAEA05D,EAAG52D,SAAW,WACZ,MAAO,oBACT,EAiCA/C,EAAQgG,KAAO,SAASq0D,GACtB,IAAIr0D,EAAO,GACX,IAAK,IAAIzC,KAAO82D,EACdr0D,EAAKqpB,KAAK9rB,GAMZ,OAJAyC,EAAKmnB,UAIE,SAASohB,IACd,KAAOvoC,EAAK/B,QAAQ,CAClB,IAAIV,EAAMyC,EAAKypC,MACf,GAAIlsC,KAAO82D,EAGT,OAFA9rB,EAAK/qC,MAAQD,EACbgrC,EAAKtL,MAAO,EACLsL,CAEX,CAMA,OADAA,EAAKtL,MAAO,EACLsL,CACT,CACF,EAoCAvuC,EAAQwwB,OAASA,EAMjBic,EAAQjqC,UAAY,CAClBkvB,YAAa+a,EAEb/Y,MAAO,SAAS4mC,GAcd,GAbAr6D,KAAKyvC,KAAO,EACZzvC,KAAKsuC,KAAO,EAGZtuC,KAAK+tC,KAAO/tC,KAAKguC,MAAQrrC,EACzB3C,KAAKgjC,MAAO,EACZhjC,KAAK6tC,SAAW,KAEhB7tC,KAAK+8B,OAAS,OACd/8B,KAAK2sC,IAAMhqC,EAEX3C,KAAK6uC,WAAW1hB,QAAQ2hB,IAEnBurB,EACH,IAAK,IAAIjpC,KAAQpxB,KAEQ,MAAnBoxB,EAAKqK,OAAO,IACZ28B,EAAOhqC,KAAKpuB,KAAMoxB,KACjB4d,OAAO5d,EAAKtE,MAAM,MACrB9sB,KAAKoxB,GAAQzuB,EAIrB,EAEA+sC,KAAM,WACJ1vC,KAAKgjC,MAAO,EAEZ,IACIs3B,EADYt6D,KAAK6uC,WAAW,GACLE,WAC3B,GAAwB,UAApBurB,EAAWtzD,KACb,MAAMszD,EAAW3tB,IAGnB,OAAO3sC,KAAK2vC,IACd,EAEA1B,kBAAmB,SAASssB,GAC1B,GAAIv6D,KAAKgjC,KACP,MAAMu3B,EAGR,IAAIzB,EAAU94D,KACd,SAAS4vC,EAAO4qB,EAAKC,GAYnB,OAXApB,EAAOryD,KAAO,QACdqyD,EAAO1sB,IAAM4tB,EACbzB,EAAQxqB,KAAOksB,EAEXC,IAGF3B,EAAQ/7B,OAAS,OACjB+7B,EAAQnsB,IAAMhqC,KAGN83D,CACZ,CAEA,IAAK,IAAI12D,EAAI/D,KAAK6uC,WAAW7qC,OAAS,EAAGD,GAAK,IAAKA,EAAG,CACpD,IAAI+1D,EAAQ95D,KAAK6uC,WAAW9qC,GACxBs1D,EAASS,EAAM/qB,WAEnB,GAAqB,SAAjB+qB,EAAMrrB,OAIR,OAAOmB,EAAO,OAGhB,GAAIkqB,EAAMrrB,QAAUzuC,KAAKyvC,KAAM,CAC7B,IAAIirB,EAAWtC,EAAOhqC,KAAK0rC,EAAO,YAC9Ba,EAAavC,EAAOhqC,KAAK0rC,EAAO,cAEpC,GAAIY,GAAYC,EAAY,CAC1B,GAAI36D,KAAKyvC,KAAOqqB,EAAMprB,SACpB,OAAOkB,EAAOkqB,EAAMprB,UAAU,GACzB,GAAI1uC,KAAKyvC,KAAOqqB,EAAMnrB,WAC3B,OAAOiB,EAAOkqB,EAAMnrB,WAGxB,MAAO,GAAI+rB,GACT,GAAI16D,KAAKyvC,KAAOqqB,EAAMprB,SACpB,OAAOkB,EAAOkqB,EAAMprB,UAAU,OAG3B,KAAIisB,EAMT,MAAM,IAAIp1D,MAAM,0CALhB,GAAIvF,KAAKyvC,KAAOqqB,EAAMnrB,WACpB,OAAOiB,EAAOkqB,EAAMnrB,WAKxB,CACF,CACF,CACF,EAEAT,OAAQ,SAASlnC,EAAM2lC,GACrB,IAAK,IAAI5oC,EAAI/D,KAAK6uC,WAAW7qC,OAAS,EAAGD,GAAK,IAAKA,EAAG,CACpD,IAAI+1D,EAAQ95D,KAAK6uC,WAAW9qC,GAC5B,GAAI+1D,EAAMrrB,QAAUzuC,KAAKyvC,MACrB2oB,EAAOhqC,KAAK0rC,EAAO,eACnB95D,KAAKyvC,KAAOqqB,EAAMnrB,WAAY,CAChC,IAAIisB,EAAed,EACnB,KACF,CACF,CAEIc,IACU,UAAT5zD,GACS,aAATA,IACD4zD,EAAansB,QAAU9B,GACvBA,GAAOiuB,EAAajsB,aAGtBisB,EAAe,MAGjB,IAAIvB,EAASuB,EAAeA,EAAa7rB,WAAa,CAAC,EAIvD,OAHAsqB,EAAOryD,KAAOA,EACdqyD,EAAO1sB,IAAMA,EAETiuB,GACF56D,KAAK+8B,OAAS,OACd/8B,KAAKsuC,KAAOssB,EAAajsB,WAClByqB,GAGFp5D,KAAK6vC,SAASwpB,EACvB,EAEAxpB,SAAU,SAASwpB,EAAQzqB,GACzB,GAAoB,UAAhByqB,EAAOryD,KACT,MAAMqyD,EAAO1sB,IAcf,MAXoB,UAAhB0sB,EAAOryD,MACS,aAAhBqyD,EAAOryD,KACThH,KAAKsuC,KAAO+qB,EAAO1sB,IACM,WAAhB0sB,EAAOryD,MAChBhH,KAAK2vC,KAAO3vC,KAAK2sC,IAAM0sB,EAAO1sB,IAC9B3sC,KAAK+8B,OAAS,SACd/8B,KAAKsuC,KAAO,OACa,WAAhB+qB,EAAOryD,MAAqB4nC,IACrC5uC,KAAKsuC,KAAOM,GAGPwqB,CACT,EAEAtpB,OAAQ,SAASnB,GACf,IAAK,IAAI5qC,EAAI/D,KAAK6uC,WAAW7qC,OAAS,EAAGD,GAAK,IAAKA,EAAG,CACpD,IAAI+1D,EAAQ95D,KAAK6uC,WAAW9qC,GAC5B,GAAI+1D,EAAMnrB,aAAeA,EAGvB,OAFA3uC,KAAK6vC,SAASiqB,EAAM/qB,WAAY+qB,EAAMlrB,UACtCE,EAAcgrB,GACPV,CAEX,CACF,EAEA,MAAS,SAAS3qB,GAChB,IAAK,IAAI1qC,EAAI/D,KAAK6uC,WAAW7qC,OAAS,EAAGD,GAAK,IAAKA,EAAG,CACpD,IAAI+1D,EAAQ95D,KAAK6uC,WAAW9qC,GAC5B,GAAI+1D,EAAMrrB,SAAWA,EAAQ,CAC3B,IAAI4qB,EAASS,EAAM/qB,WACnB,GAAoB,UAAhBsqB,EAAOryD,KAAkB,CAC3B,IAAI6zD,EAASxB,EAAO1sB,IACpBmC,EAAcgrB,EAChB,CACA,OAAOe,CACT,CACF,CAIA,MAAM,IAAIt1D,MAAM,wBAClB,EAEAwqC,cAAe,SAASgqB,EAAU1rB,EAAYE,GAa5C,OAZAvuC,KAAK6tC,SAAW,CACdhC,SAAUtb,EAAOwpC,GACjB1rB,WAAYA,EACZE,QAASA,GAGS,SAAhBvuC,KAAK+8B,SAGP/8B,KAAK2sC,IAAMhqC,GAGNy2D,CACT,GAOKr5D,CAET,CAzrBc,CA8rBiBkJ,EAAOlJ,SAGtC,IACE+6D,mBAAqB5C,CACvB,CAAE,MAAO6C,GAUPlrC,SAAS,IAAK,yBAAdA,CAAwCqoC,EAC1C,oBCrtBA,SAAS8C,IACPh7D,KAAKi7D,UAAY,EACnB,CAEA,CAAC,MAAO,KAAM,OAAQ,MAAO,QAAS,OAAQ,SAAU,OAAQ,kBAAmB,YAAa,QAAS,KAAM,YAC9G,UAAW,SAAU,YAAa,QAAS,KAAM,MAAO,MAAO,QAAQ9tC,SAAQ,SAASikB,GAEvF4pB,EAAMz4D,UAAU6uC,GAAM,WAEpB,OADApxC,KAAKi7D,UAAU7rC,KAAK,CAACgiB,GAAGA,EAAI/iB,UAAUA,YAC/BruB,IACT,CACF,IAEAg7D,EAAMz4D,UAAU24D,aAAe,SAASC,GACpCn7D,KAAKi7D,UAAU9tC,SAAQ,SAASiuC,GAC9BD,EAAIC,EAAIhqB,IAAI9iB,MAAM6sC,EAAKC,EAAI/sC,UAC7B,GACJ,EAEAplB,EAAOlJ,QAAUi7D,uBCfjB,IAAI/4D,EACkB,oBAAXtB,OACTsB,EAAOtB,OACkB,oBAAT6wC,KAChBvvC,EAAOuvC,MAEP1U,QAAQu+B,KAAK,uEACbp5D,EAAOjC,MAGT,IAAI0kD,EAAU,EAAQ,MAClB4W,EAAc,EAAQ,MACtBC,EAAW,EAAQ,MACnBC,EAAe,EAAQ,MACvBR,EAAQ,EAAQ,MAMpB,SAASS,IAAO,CAMhB,IAAI/0D,EAAU3G,EAAUkJ,EAAOlJ,QAAU,SAASg9B,EAAQ55B,GAExD,MAAI,mBAAqBA,EAChB,IAAIpD,EAAQ27D,QAAQ,MAAO3+B,GAAQ/0B,IAAI7E,GAI5C,GAAKkrB,UAAUrqB,OACV,IAAIjE,EAAQ27D,QAAQ,MAAO3+B,GAG7B,IAAIh9B,EAAQ27D,QAAQ3+B,EAAQ55B,EACrC,EAEApD,EAAQ27D,QAAUA,EAMlBh1D,EAAQi1D,OAAS,WACf,MAAI15D,EAAK25D,gBACA35D,EAAKgmC,UAAY,SAAWhmC,EAAKgmC,SAAS4zB,UACvC55D,EAAK65D,eACf,OAAO,IAAIF,eAEX,IAAM,OAAO,IAAIE,cAAc,oBAAsB,CAAE,MAAMruC,GAAI,CACjE,IAAM,OAAO,IAAIquC,cAAc,qBAAuB,CAAE,MAAMruC,GAAI,CAClE,IAAM,OAAO,IAAIquC,cAAc,qBAAuB,CAAE,MAAMruC,GAAI,CAClE,IAAM,OAAO,IAAIquC,cAAc,iBAAmB,CAAE,MAAMruC,GAAI,CAEhE,MAAMloB,MAAM,wDACd,EAUA,IAAImtB,EAAO,GAAGA,KACV,SAASqa,GAAK,OAAOA,EAAEra,MAAQ,EAC/B,SAASqa,GAAK,OAAOA,EAAE7sC,QAAQ,eAAgB,GAAK,EAUxD,SAAS67D,EAAUhzD,GACjB,IAAKwyD,EAASxyD,GAAM,OAAOA,EAC3B,IAAIizD,EAAQ,GACZ,IAAK,IAAI14D,KAAOyF,EACdkzD,EAAwBD,EAAO14D,EAAKyF,EAAIzF,IAE1C,OAAO04D,EAAM12D,KAAK,IACpB,CAWA,SAAS22D,EAAwBD,EAAO14D,EAAKgyB,GAC3C,GAAW,MAAPA,EACF,GAAI3wB,MAAMC,QAAQ0wB,GAChBA,EAAInI,SAAQ,SAASoQ,GACnB0+B,EAAwBD,EAAO14D,EAAKi6B,EACtC,SACK,GAAIg+B,EAASjmC,GAClB,IAAI,IAAI4mC,KAAU5mC,EAChB2mC,EAAwBD,EAAO14D,EAAM,IAAM44D,EAAS,IAAK5mC,EAAI4mC,SAG/DF,EAAM5sC,KAAK3rB,mBAAmBH,GAC1B,IAAMG,mBAAmB6xB,SAEd,OAARA,GACT0mC,EAAM5sC,KAAK3rB,mBAAmBH,GAElC,CAgBA,SAAS64D,EAAY/zD,GAMnB,IALA,IAEIg0D,EACA1vC,EAHA3jB,EAAM,CAAC,EACPizD,EAAQ5zD,EAAIuqB,MAAM,KAIb5uB,EAAI,EAAGmhD,EAAM8W,EAAMh4D,OAAQD,EAAImhD,IAAOnhD,GAGjC,IADZ2oB,GADA0vC,EAAOJ,EAAMj4D,IACForB,QAAQ,MAEjBpmB,EAAI0/B,mBAAmB2zB,IAAS,GAEhCrzD,EAAI0/B,mBAAmB2zB,EAAKtvC,MAAM,EAAGJ,KACnC+b,mBAAmB2zB,EAAKtvC,MAAMJ,EAAM,IAI1C,OAAO3jB,CACT,CA2FA,SAASszD,EAAOC,GACd,MAAO,cAAcnmB,KAAKmmB,EAC5B,CAgDA,SAASC,EAASpB,GAChBn7D,KAAKm7D,IAAMA,EACXn7D,KAAKw8D,IAAMx8D,KAAKm7D,IAAIqB,IAEpBx8D,KAAKgG,KAA2B,QAAlBhG,KAAKm7D,IAAIp+B,SAA8C,KAA1B/8B,KAAKw8D,IAAI90D,cAAiD,SAA1B1H,KAAKw8D,IAAI90D,oBAA8D,IAA1B1H,KAAKw8D,IAAI90D,aAC5H1H,KAAKw8D,IAAIC,aACT,KACLz8D,KAAK08D,WAAa18D,KAAKm7D,IAAIqB,IAAIE,WAC/B,IAAI/2D,EAAS3F,KAAKw8D,IAAI72D,OAEP,OAAXA,IACFA,EAAS,KAEX3F,KAAK28D,qBAAqBh3D,GAC1B3F,KAAKmH,OAASnH,KAAK4lC,QA9FrB,SAAqBx9B,GAQnB,IAPA,IAEIilB,EACAuvC,EACAp1D,EACA8tB,EALAunC,EAAQz0D,EAAIuqB,MAAM,SAClBmqC,EAAS,CAAC,EAML/4D,EAAI,EAAGmhD,EAAM2X,EAAM74D,OAAQD,EAAImhD,IAAOnhD,GAG9B,KADfspB,GADAuvC,EAAOC,EAAM94D,IACAorB,QAAQ,QAIrB3nB,EAAQo1D,EAAK9vC,MAAM,EAAGO,GAAOsO,cAC7BrG,EAAM5C,EAAKkqC,EAAK9vC,MAAMO,EAAQ,IAC9ByvC,EAAOt1D,GAAS8tB,GAGlB,OAAOwnC,CACT,CA0E+BC,CAAY/8D,KAAKw8D,IAAIQ,yBAIlDh9D,KAAKmH,OAAO,gBAAkBnH,KAAKw8D,IAAIS,kBAAkB,gBACzDj9D,KAAKk9D,qBAAqBl9D,KAAKmH,QAE3B,OAASnH,KAAKgG,MAAQm1D,EAAIgC,cAC5Bn9D,KAAK6F,KAAO7F,KAAKw8D,IAAI/2D,SAErBzF,KAAK6F,KAA0B,QAAnB7F,KAAKm7D,IAAIp+B,OACjB/8B,KAAKo9D,WAAWp9D,KAAKgG,KAAOhG,KAAKgG,KAAOhG,KAAKw8D,IAAI/2D,UACjD,IAER,CA+DA,SAASi2D,EAAQ3+B,EAAQ55B,GACvB,IAAIquC,EAAOxxC,KACXA,KAAKq9D,OAASr9D,KAAKq9D,QAAU,GAC7Br9D,KAAK+8B,OAASA,EACd/8B,KAAKmD,IAAMA,EACXnD,KAAKmH,OAAS,CAAC,EACfnH,KAAKs9D,QAAU,CAAC,EAChBt9D,KAAKqvB,GAAG,OAAO,WACb,IA0BIkuC,EA1BAp5D,EAAM,KACNwsC,EAAM,KAEV,IACEA,EAAM,IAAI4rB,EAAS/qB,EACrB,CAAE,MAAM/jB,GAgBN,OAfAtpB,EAAM,IAAIoB,MAAM,2CACZg8B,OAAQ,EACZp9B,EAAIq5D,SAAW/vC,EAEX+jB,EAAKgrB,KAEPr4D,EAAIs5D,iBAA8C,IAAzBjsB,EAAKgrB,IAAI90D,aAA8B8pC,EAAKgrB,IAAIC,aAAejrB,EAAKgrB,IAAI/2D,SAEjGtB,EAAIwB,OAAS6rC,EAAKgrB,IAAI72D,OAAS6rC,EAAKgrB,IAAI72D,OAAS,KACjDxB,EAAIu5D,WAAav5D,EAAIwB,SAErBxB,EAAIs5D,YAAc,KAClBt5D,EAAIwB,OAAS,MAGR6rC,EAAK/e,SAAStuB,EACvB,CAEAqtC,EAAKyT,KAAK,WAAYtU,GAGtB,IACOa,EAAKmsB,cAAchtB,KACtB4sB,EAAU,IAAIh4D,MAAMorC,EAAI+rB,YAAc,8BAE1C,CAAE,MAAMkB,GACNL,EAAUK,CACZ,CAGIL,GACFA,EAAQC,SAAWr5D,EACnBo5D,EAAQ93D,SAAWkrC,EACnB4sB,EAAQ53D,OAASgrC,EAAIhrC,OACrB6rC,EAAK/e,SAAS8qC,EAAS5sB,IAEvBa,EAAK/e,SAAS,KAAMke,EAExB,GACF,CAgaA,SAASktB,EAAI16D,EAAKyC,EAAMwrC,GACtB,IAAI+pB,EAAMz0D,EAAQ,SAAUvD,GAI5B,MAHI,mBAAqByC,IAAOwrC,EAAKxrC,EAAQA,EAAO,MAChDA,GAAMu1D,EAAI/zD,KAAKxB,GACfwrC,GAAI+pB,EAAInzD,IAAIopC,GACT+pB,CACT,CA/tBAz0D,EAAQo3D,gBAAkB/B,EAkC1Br1D,EAAQy1D,YAAcA,EAStBz1D,EAAQq3D,MAAQ,CACdxgB,KAAM,YACNzX,KAAM,mBACNk4B,IAAK,WACLC,WAAY,oCACZ,KAAQ,oCACR,YAAa,qCAYfv3D,EAAQq1D,UAAY,CAClB,oCAAqCA,EACrC,mBAAoBz6B,KAAKj6B,WAY3BX,EAAQ66B,MAAQ,CACd,oCAAqC46B,EACrC,mBAAoB76B,KAAKC,OA0H3Bi6B,EAAae,EAASh6D,WAatBg6D,EAASh6D,UAAU66D,WAAa,SAASh1D,GACvC,IAAIm5B,EAAQ76B,EAAQ66B,MAAMvhC,KAAKgH,MAC/B,OAAIhH,KAAKm7D,IAAI+C,QACJl+D,KAAKm7D,IAAI+C,QAAQl+D,KAAMoI,KAE3Bm5B,GAAS86B,EAAOr8D,KAAKgH,QACxBu6B,EAAQ76B,EAAQ66B,MAAM,qBAEjBA,GAASn5B,IAAQA,EAAIpE,QAAUoE,aAAetC,QACjDy7B,EAAMn5B,GACN,KACN,EASAm0D,EAASh6D,UAAU47D,QAAU,WAC3B,IAAIhD,EAAMn7D,KAAKm7D,IACXp+B,EAASo+B,EAAIp+B,OACb55B,EAAMg4D,EAAIh4D,IAEVi7D,EAAM,UAAYrhC,EAAS,IAAM55B,EAAM,KAAOnD,KAAK2F,OAAS,IAC5DxB,EAAM,IAAIoB,MAAM64D,GAKpB,OAJAj6D,EAAIwB,OAAS3F,KAAK2F,OAClBxB,EAAI44B,OAASA,EACb54B,EAAIhB,IAAMA,EAEHgB,CACT,EAMAuC,EAAQ61D,SAAWA,EAqEnB7X,EAAQgX,EAAQn5D,WAChB+4D,EAAYI,EAAQn5D,WAwBpBm5D,EAAQn5D,UAAUyE,KAAO,SAASA,GAEhC,OADAhH,KAAK4G,IAAI,eAAgBF,EAAQq3D,MAAM/2D,IAASA,GACzChH,IACT,EAsBA07D,EAAQn5D,UAAUkF,OAAS,SAAST,GAElC,OADAhH,KAAK4G,IAAI,SAAUF,EAAQq3D,MAAM/2D,IAASA,GACnChH,IACT,EAYA07D,EAAQn5D,UAAUoE,KAAO,SAAS03D,EAAMC,EAAMp0C,GACxC,IAAMmE,UAAUrqB,SAAQs6D,EAAO,IACf,iBAATA,GAA8B,OAATA,IAC9Bp0C,EAAUo0C,EACVA,EAAO,IAEJp0C,IACHA,EAAU,CACRljB,KAAM,mBAAsBu3D,KAAO,QAAU,SAWjD,OAAOv+D,KAAKw+D,MAAMH,EAAMC,EAAMp0C,GAPhB,SAASu0C,GACrB,GAAI,mBAAsBF,KACxB,OAAOA,KAAKE,GAEd,MAAM,IAAIl5D,MAAM,gDAClB,GAGF,EAgBAm2D,EAAQn5D,UAAUwE,MAAQ,SAASuuB,GAGjC,MAFI,iBAAmBA,IAAKA,EAAMymC,EAAUzmC,IACxCA,GAAKt1B,KAAKq9D,OAAOjuC,KAAKkG,GACnBt1B,IACT,EAmBA07D,EAAQn5D,UAAUgF,OAAS,SAASC,EAAOk3D,EAAMx0C,GAC/C,GAAIw0C,EAAM,CACR,GAAI1+D,KAAK2+D,MACP,MAAMp5D,MAAM,8CAGdvF,KAAK4+D,eAAel5B,OAAOl+B,EAAOk3D,EAAMx0C,GAAWw0C,EAAKttC,KAC1D,CACA,OAAOpxB,IACT,EAEA07D,EAAQn5D,UAAUq8D,aAAe,WAI/B,OAHK5+D,KAAK6+D,YACR7+D,KAAK6+D,UAAY,IAAI58D,EAAK68D,UAErB9+D,KAAK6+D,SACd,EAWAnD,EAAQn5D,UAAUkwB,SAAW,SAAStuB,EAAKwsC,GACzC,GAAI3wC,KAAK++D,aAAa56D,EAAKwsC,GACzB,OAAO3wC,KAAKg/D,SAGd,IAAI5tB,EAAKpxC,KAAKi/D,UACdj/D,KAAKgxB,eAED7sB,IACEnE,KAAKk/D,cAAa/6D,EAAIg7D,QAAUn/D,KAAKo/D,SAAW,GACpDp/D,KAAKilD,KAAK,QAAS9gD,IAGrBitC,EAAGjtC,EAAKwsC,EACV,EAQA+qB,EAAQn5D,UAAU88D,iBAAmB,WACnC,IAAIl7D,EAAM,IAAIoB,MAAM,gKACpBpB,EAAIm7D,aAAc,EAElBn7D,EAAIwB,OAAS3F,KAAK2F,OAClBxB,EAAI44B,OAAS/8B,KAAK+8B,OAClB54B,EAAIhB,IAAMnD,KAAKmD,IAEfnD,KAAKyyB,SAAStuB,EAChB,EAGAu3D,EAAQn5D,UAAUg9D,OAAS7D,EAAQn5D,UAAUi9D,GAAK9D,EAAQn5D,UAAU3B,MAAQ,WAE1E,OADAk8B,QAAQu+B,KAAK,0DACNr7D,IACT,EAGA07D,EAAQn5D,UAAUk9D,KAAO/D,EAAQn5D,UAAUm9D,MAAQ,WACjD,MAAMn6D,MAAM,8DACd,EAUAm2D,EAAQn5D,UAAUo9D,QAAU,SAAiB52D,GAE3C,OAAOA,GAAO,iBAAoBA,IAAQpE,MAAMC,QAAQmE,IAAgD,oBAAxCjD,OAAOvD,UAAUO,SAASsrB,KAAKrlB,EACjG,EAWA2yD,EAAQn5D,UAAUyF,IAAM,SAASopC,GAY/B,OAXIpxC,KAAK4/D,YACP9iC,QAAQu+B,KAAK,yEAEfr7D,KAAK4/D,YAAa,EAGlB5/D,KAAKi/D,UAAY7tB,GAAMqqB,EAGvBz7D,KAAK6/D,uBAEE7/D,KAAK8/D,MACd,EAEApE,EAAQn5D,UAAUu9D,KAAO,WACvB,IAAItuB,EAAOxxC,KACPw8D,EAAOx8D,KAAKw8D,IAAM91D,EAAQi1D,SAC1B/1D,EAAO5F,KAAK6+D,WAAa7+D,KAAK2+D,MAElC3+D,KAAK+/D,eAGLvD,EAAIwD,mBAAqB,WACvB,IAAIvQ,EAAa+M,EAAI/M,WAIrB,GAHIA,GAAc,GAAKje,EAAKyuB,uBAC1BjvC,aAAawgB,EAAKyuB,uBAEhB,GAAKxQ,EAAT,CAMA,IAAI9pD,EACJ,IAAMA,EAAS62D,EAAI72D,MAAO,CAAE,MAAM8nB,GAAK9nB,EAAS,CAAG,CAEnD,IAAKA,EAAQ,CACX,GAAI6rC,EAAK0uB,UAAY1uB,EAAK2uB,SAAU,OACpC,OAAO3uB,EAAK6tB,kBACd,CACA7tB,EAAKyT,KAAK,MAXV,CAYF,EAGA,IAAImb,EAAiB,SAASC,EAAW5yC,GACnCA,EAAE6yC,MAAQ,IACZ7yC,EAAE2zB,QAAU3zB,EAAE8yC,OAAS9yC,EAAE6yC,MAAQ,KAEnC7yC,EAAE4yC,UAAYA,EACd7uB,EAAKyT,KAAK,WAAYx3B,EACxB,EACA,GAAIztB,KAAKmlD,aAAa,YACpB,IACEqX,EAAIgE,WAAaJ,EAAexjC,KAAK,KAAM,YACvC4/B,EAAIhjD,SACNgjD,EAAIhjD,OAAOgnD,WAAaJ,EAAexjC,KAAK,KAAM,UAEtD,CAAE,MAAMnP,GAIR,CAIF,IACMztB,KAAKygE,UAAYzgE,KAAKoqC,SACxBoyB,EAAIkE,KAAK1gE,KAAK+8B,OAAQ/8B,KAAKmD,KAAK,EAAMnD,KAAKygE,SAAUzgE,KAAKoqC,UAE1DoyB,EAAIkE,KAAK1gE,KAAK+8B,OAAQ/8B,KAAKmD,KAAK,EAEpC,CAAE,MAAOgB,GAEP,OAAOnE,KAAKyyB,SAAStuB,EACvB,CAMA,GAHInE,KAAK2gE,mBAAkBnE,EAAI50D,iBAAkB,IAG5C5H,KAAK6+D,WAAa,OAAS7+D,KAAK+8B,QAAU,QAAU/8B,KAAK+8B,QAAU,iBAAmBn3B,IAAS5F,KAAK2/D,QAAQ/5D,GAAO,CAEtH,IAAIjC,EAAc3D,KAAKs9D,QAAQ,gBAC3BvB,EAAY/7D,KAAK4gE,aAAel6D,EAAQq1D,UAAUp4D,EAAcA,EAAYgvB,MAAM,KAAK,GAAK,KAC3FopC,GAAaM,EAAO14D,KACvBo4D,EAAYr1D,EAAQq1D,UAAU,qBAE5BA,IAAWn2D,EAAOm2D,EAAUn2D,GAClC,CAGA,IAAK,IAAI4B,KAASxH,KAAKmH,OACjB,MAAQnH,KAAKmH,OAAOK,IAEpBxH,KAAKmH,OAAO3D,eAAegE,IAC7Bg1D,EAAIqE,iBAAiBr5D,EAAOxH,KAAKmH,OAAOK,IAa5C,OAVIxH,KAAKm9D,gBACPX,EAAI90D,aAAe1H,KAAKm9D,eAI1Bn9D,KAAKilD,KAAK,UAAWjlD,MAIrBw8D,EAAIp1D,UAAqB,IAATxB,EAAuBA,EAAO,MACvC5F,IACT,EAEA0G,EAAQ9F,MAAQ,WACd,OAAO,IAAIo6D,CACb,EAEA,CAAC,MAAO,OAAQ,UAAW,QAAS,MAAO,UAAU7tC,SAAQ,SAAS4P,GACpEi+B,EAAMz4D,UAAUw6B,EAAOpB,eAAiB,SAASx4B,EAAKiuC,GACpD,IAAI+pB,EAAM,IAAIz0D,EAAQg1D,QAAQ3+B,EAAQ55B,GAKtC,OAJAnD,KAAKk7D,aAAaC,GACd/pB,GACF+pB,EAAInzD,IAAIopC,GAEH+pB,CACT,CACF,IAEAH,EAAMz4D,UAAUs7D,IAAM7C,EAAMz4D,UAAkB,OAY9CmE,EAAQ2D,IAAM,SAASlH,EAAKyC,EAAMwrC,GAChC,IAAI+pB,EAAMz0D,EAAQ,MAAOvD,GAIzB,MAHI,mBAAqByC,IAAOwrC,EAAKxrC,EAAQA,EAAO,MAChDA,GAAMu1D,EAAIp0D,MAAMnB,GAChBwrC,GAAI+pB,EAAInzD,IAAIopC,GACT+pB,CACT,EAYAz0D,EAAQo6D,KAAO,SAAS39D,EAAKyC,EAAMwrC,GACjC,IAAI+pB,EAAMz0D,EAAQ,OAAQvD,GAI1B,MAHI,mBAAqByC,IAAOwrC,EAAKxrC,EAAQA,EAAO,MAChDA,GAAMu1D,EAAIp0D,MAAMnB,GAChBwrC,GAAI+pB,EAAInzD,IAAIopC,GACT+pB,CACT,EAYAz0D,EAAQwjB,QAAU,SAAS/mB,EAAKyC,EAAMwrC,GACpC,IAAI+pB,EAAMz0D,EAAQ,UAAWvD,GAI7B,MAHI,mBAAqByC,IAAOwrC,EAAKxrC,EAAQA,EAAO,MAChDA,GAAMu1D,EAAI/zD,KAAKxB,GACfwrC,GAAI+pB,EAAInzD,IAAIopC,GACT+pB,CACT,EAoBAz0D,EAAa,IAAIm3D,EACjBn3D,EAAgB,OAAIm3D,EAYpBn3D,EAAQq6D,MAAQ,SAAS59D,EAAKyC,EAAMwrC,GAClC,IAAI+pB,EAAMz0D,EAAQ,QAASvD,GAI3B,MAHI,mBAAqByC,IAAOwrC,EAAKxrC,EAAQA,EAAO,MAChDA,GAAMu1D,EAAI/zD,KAAKxB,GACfwrC,GAAI+pB,EAAInzD,IAAIopC,GACT+pB,CACT,EAYAz0D,EAAQs6D,KAAO,SAAS79D,EAAKyC,EAAMwrC,GACjC,IAAI+pB,EAAMz0D,EAAQ,OAAQvD,GAI1B,MAHI,mBAAqByC,IAAOwrC,EAAKxrC,EAAQA,EAAO,MAChDA,GAAMu1D,EAAI/zD,KAAKxB,GACfwrC,GAAI+pB,EAAInzD,IAAIopC,GACT+pB,CACT,EAYAz0D,EAAQu6D,IAAM,SAAS99D,EAAKyC,EAAMwrC,GAChC,IAAI+pB,EAAMz0D,EAAQ,MAAOvD,GAIzB,MAHI,mBAAqByC,IAAOwrC,EAAKxrC,EAAQA,EAAO,MAChDA,GAAMu1D,EAAI/zD,KAAKxB,GACfwrC,GAAI+pB,EAAInzD,IAAIopC,GACT+pB,CACT,iCCv4BAlyD,EAAOlJ,QAJP,SAAkBgJ,GAChB,OAAO,OAASA,GAAO,iBAAoBA,CAC7C,qCCPA,IAAIwyD,EAAW,EAAQ,MAcvB,SAASD,EAAYvyD,GACnB,GAAIA,EAAK,OAWX,SAAeA,GACb,IAAK,IAAIzF,KAAOg4D,EAAY/4D,UAC1BwG,EAAIzF,GAAOg4D,EAAY/4D,UAAUe,GAEnC,OAAOyF,CACT,CAhBkB47C,CAAM57C,EACxB,CAVAE,EAAOlJ,QAAUu7D,EAkCjBA,EAAY/4D,UAAUyuB,aAAe,WAKnC,OAJAA,aAAahxB,KAAKkhE,QAClBlwC,aAAahxB,KAAKigE,8BACXjgE,KAAKkhE,cACLlhE,KAAKigE,sBACLjgE,IACT,EAWAs7D,EAAY/4D,UAAUg/B,MAAQ,SAAe6P,GAE3C,OADApxC,KAAKk+D,QAAU9sB,EACRpxC,IACT,EAoBAs7D,EAAY/4D,UAAUmF,aAAe,SAAS4tB,GAE5C,OADAt1B,KAAKm9D,cAAgB7nC,EACdt1B,IACT,EAWAs7D,EAAY/4D,UAAUw5D,UAAY,SAAmB3qB,GAEnD,OADApxC,KAAK4gE,YAAcxvB,EACZpxC,IACT,EAeAs7D,EAAY/4D,UAAU/B,QAAU,SAAiB0pB,GAC/C,IAAKA,GAAW,iBAAoBA,EAGlC,OAFAlqB,KAAKmhE,SAAWj3C,EAChBlqB,KAAKohE,iBAAmB,EACjBphE,KAGT,IAAI,IAAI6+B,KAAU3U,EAChB,OAAO2U,GACL,IAAK,WACH7+B,KAAKmhE,SAAWj3C,EAAQm3C,SACxB,MACF,IAAK,WACHrhE,KAAKohE,iBAAmBl3C,EAAQzkB,SAChC,MACF,QACEq3B,QAAQu+B,KAAK,yBAA0Bx8B,GAG7C,OAAO7+B,IACT,EAaAs7D,EAAY/4D,UAAU++D,MAAQ,SAAeC,EAAOnwB,GAOlD,OALyB,IAArB/iB,UAAUrqB,SAA0B,IAAVu9D,IAAgBA,EAAQ,GAClDA,GAAS,IAAGA,EAAQ,GACxBvhE,KAAKk/D,YAAcqC,EACnBvhE,KAAKo/D,SAAW,EAChBp/D,KAAKwhE,eAAiBpwB,EACfpxC,IACT,EAEA,IAAIyhE,EAAc,CAChB,aACA,YACA,YACA,mBAWFnG,EAAY/4D,UAAUw8D,aAAe,SAAS56D,EAAKwsC,GACjD,IAAK3wC,KAAKk/D,aAAel/D,KAAKo/D,YAAcp/D,KAAKk/D,YAC/C,OAAO,EAET,GAAIl/D,KAAKwhE,eACP,IACE,IAAIE,EAAW1hE,KAAKwhE,eAAer9D,EAAKwsC,GACxC,IAAiB,IAAb+wB,EAAmB,OAAO,EAC9B,IAAiB,IAAbA,EAAoB,OAAO,CAEjC,CAAE,MAAMj0C,GACNqP,QAAQ70B,MAAMwlB,EAChB,CAEF,GAAIkjB,GAAOA,EAAIhrC,QAAUgrC,EAAIhrC,QAAU,KAAqB,KAAdgrC,EAAIhrC,OAAe,OAAO,EACxE,GAAIxB,EAAK,CACP,GAAIA,EAAIw9D,OAASF,EAAYtyC,QAAQhrB,EAAIw9D,MAAO,OAAO,EAEvD,GAAIx9D,EAAI3D,SAAuB,gBAAZ2D,EAAIw9D,KAAwB,OAAO,EACtD,GAAIx9D,EAAIm7D,YAAa,OAAO,CAC9B,CACA,OAAO,CACT,EASAhE,EAAY/4D,UAAUy8D,OAAS,WAa7B,OAXAh/D,KAAKgxB,eAGDhxB,KAAKm7D,MACPn7D,KAAKm7D,IAAM,KACXn7D,KAAKm7D,IAAMn7D,KAAK0G,WAGlB1G,KAAKmgE,UAAW,EAChBngE,KAAKkgE,UAAW,EAETlgE,KAAK8/D,MACd,EAUAxE,EAAY/4D,UAAUiH,KAAO,SAAc1B,EAASC,GAClD,IAAK/H,KAAK4hE,mBAAoB,CAC5B,IAAIpwB,EAAOxxC,KACPA,KAAK4/D,YACP9iC,QAAQu+B,KAAK,kIAEfr7D,KAAK4hE,mBAAqB,IAAI/5D,SAAQ,SAASg6D,EAAcC,GAC3DtwB,EAAKxpC,KAAI,SAAS7D,EAAKwsC,GACjBxsC,EAAK29D,EAAY39D,GAChB09D,EAAalxB,EACpB,GACF,GACF,CACA,OAAO3wC,KAAK4hE,mBAAmBp4D,KAAK1B,EAASC,EAC/C,EAEAuzD,EAAY/4D,UAAUwjC,MAAQ,SAASgf,GACrC,OAAO/kD,KAAKwJ,UAAK7G,EAAWoiD,EAC9B,EAMAuW,EAAY/4D,UAAUw/D,IAAM,SAAa3wB,GAEvC,OADAA,EAAGpxC,MACIA,IACT,EAEAs7D,EAAY/4D,UAAUy/D,GAAK,SAASjd,GAClC,GAAI,mBAAsBA,EAAI,MAAMx/C,MAAM,qBAE1C,OADAvF,KAAKiiE,YAAcld,EACZ/kD,IACT,EAEAs7D,EAAY/4D,UAAUo7D,cAAgB,SAAShtB,GAC7C,QAAKA,IAID3wC,KAAKiiE,YACAjiE,KAAKiiE,YAAYtxB,GAGnBA,EAAIhrC,QAAU,KAAOgrC,EAAIhrC,OAAS,IAC3C,EAWA21D,EAAY/4D,UAAU8H,IAAM,SAAS7C,GACnC,OAAOxH,KAAKs9D,QAAQ91D,EAAMm0B,cAC5B,EAcA2/B,EAAY/4D,UAAU2/D,UAAY5G,EAAY/4D,UAAU8H,IAuBxDixD,EAAY/4D,UAAUqE,IAAM,SAASY,EAAO8tB,GAC1C,GAAIimC,EAAS/zD,GAAQ,CACnB,IAAK,IAAIlE,KAAOkE,EACdxH,KAAK4G,IAAItD,EAAKkE,EAAMlE,IAEtB,OAAOtD,IACT,CAGA,OAFAA,KAAKs9D,QAAQ91D,EAAMm0B,eAAiBrG,EACpCt1B,KAAKmH,OAAOK,GAAS8tB,EACdt1B,IACT,EAcAs7D,EAAY/4D,UAAU4/D,MAAQ,SAAS36D,GAGrC,cAFOxH,KAAKs9D,QAAQ91D,EAAMm0B,sBACnB37B,KAAKmH,OAAOK,GACZxH,IACT,EAqBAs7D,EAAY/4D,UAAUiF,MAAQ,SAAS4pB,EAAMkE,GAE3C,GAAI,MAASlE,EACX,MAAM,IAAI7rB,MAAM,2CAOlB,GAJIvF,KAAK2+D,OACP7hC,QAAQ70B,MAAM,mGAGZszD,EAASnqC,GAAO,CAClB,IAAK,IAAI9tB,KAAO8tB,EACdpxB,KAAKwH,MAAMlE,EAAK8tB,EAAK9tB,IAEvB,OAAOtD,IACT,CAEA,GAAI2E,MAAMC,QAAQ0wB,GAAM,CACtB,IAAK,IAAIvxB,KAAKuxB,EACZt1B,KAAKwH,MAAM4pB,EAAMkE,EAAIvxB,IAEvB,OAAO/D,IACT,CAGA,GAAI,MAASs1B,EACX,MAAM,IAAI/vB,MAAM,0CAMlB,MAJI,kBAAqB+vB,IACvBA,EAAM,GAAKA,GAEbt1B,KAAK4+D,eAAel5B,OAAOtU,EAAMkE,GAC1Bt1B,IACT,EAQAs7D,EAAY/4D,UAAU6/D,MAAQ,WAC5B,OAAIpiE,KAAKmgE,WAGTngE,KAAKmgE,UAAW,EAChBngE,KAAKw8D,KAAOx8D,KAAKw8D,IAAI4F,QACrBpiE,KAAKm7D,KAAOn7D,KAAKm7D,IAAIiH,QACrBpiE,KAAKgxB,eACLhxB,KAAKilD,KAAK,UANDjlD,IAQX,EAEAs7D,EAAY/4D,UAAUi8D,MAAQ,SAASH,EAAMC,EAAMp0C,EAASm4C,GAC1D,OAAQn4C,EAAQljB,MACd,IAAK,QACHhH,KAAK4G,IAAI,gBAAiB,SAAWy7D,EAAchE,EAAO,IAAMC,IAChE,MAEF,IAAK,OACHt+D,KAAKygE,SAAWpC,EAChBr+D,KAAKoqC,SAAWk0B,EAChB,MAEF,IAAK,SACHt+D,KAAK4G,IAAI,gBAAiB,UAAYy3D,GAG1C,OAAOr+D,IACT,EAaAs7D,EAAY/4D,UAAUqF,gBAAkB,SAASynB,GAI/C,OAFU1sB,MAAN0sB,IAAiBA,GAAK,GAC1BrvB,KAAK2gE,iBAAmBtxC,EACjBrvB,IACT,EAUAs7D,EAAY/4D,UAAU+/D,UAAY,SAAS52B,GAEzC,OADA1rC,KAAKuiE,cAAgB72B,EACd1rC,IACT,EASAs7D,EAAY/4D,UAAUigE,gBAAkB,SAAS92B,GAC/C,GAAI,iBAAoBA,EACtB,MAAM0C,UAAU,oBAGlB,OADApuC,KAAKyiE,iBAAmB/2B,EACjB1rC,IACT,EAWAs7D,EAAY/4D,UAAUM,OAAS,WAC7B,MAAO,CACLk6B,OAAQ/8B,KAAK+8B,OACb55B,IAAKnD,KAAKmD,IACVyC,KAAM5F,KAAK2+D,MACX/4B,QAAS5lC,KAAKs9D,QAElB,EA0CAhC,EAAY/4D,UAAU6E,KAAO,SAASxB,GACpC,IAAI88D,EAAQnH,EAAS31D,GACjBoB,EAAOhH,KAAKs9D,QAAQ,gBAMxB,GAJIt9D,KAAK6+D,WACP/hC,QAAQ70B,MAAM,gHAGZy6D,IAAU1iE,KAAK2+D,MACbh6D,MAAMC,QAAQgB,GAChB5F,KAAK2+D,MAAQ,GACH3+D,KAAK2/D,QAAQ/5D,KACvB5F,KAAK2+D,MAAQ,CAAC,QAEX,GAAI/4D,GAAQ5F,KAAK2+D,OAAS3+D,KAAK2/D,QAAQ3/D,KAAK2+D,OACjD,MAAMp5D,MAAM,gCAId,GAAIm9D,GAASnH,EAASv7D,KAAK2+D,OACzB,IAAK,IAAIr7D,KAAOsC,EACd5F,KAAK2+D,MAAMr7D,GAAOsC,EAAKtC,OAEhB,iBAAmBsC,GAEvBoB,GAAMhH,KAAKgH,KAAK,QACrBA,EAAOhH,KAAKs9D,QAAQ,gBAElBt9D,KAAK2+D,MADH,qCAAuC33D,EAC5BhH,KAAK2+D,MACd3+D,KAAK2+D,MAAQ,IAAM/4D,EACnBA,GAEU5F,KAAK2+D,OAAS,IAAM/4D,GAGpC5F,KAAK2+D,MAAQ/4D,EAGf,OAAK88D,GAAS1iE,KAAK2/D,QAAQ/5D,IAKtBoB,GAAMhH,KAAKgH,KAAK,QAJZhH,IAMX,EA8BAs7D,EAAY/4D,UAAUogE,UAAY,SAASj0C,GAGzC,OADA1uB,KAAK4iE,WAAwB,IAATl0C,GAA8BA,EAC3C1uB,IACT,EAOAs7D,EAAY/4D,UAAUs9D,qBAAuB,WAC3C,IAAI94D,EAAQ/G,KAAKq9D,OAAO/3D,KAAK,KAM7B,GALIyB,IACF/G,KAAKmD,MAAQnD,KAAKmD,IAAIgsB,QAAQ,MAAQ,EAAI,IAAM,KAAOpoB,GAEzD/G,KAAKq9D,OAAOr5D,OAAS,EAEjBhE,KAAK4iE,MAAO,CACd,IAAIv1C,EAAQrtB,KAAKmD,IAAIgsB,QAAQ,KAC7B,GAAI9B,GAAS,EAAG,CACd,IAAIw1C,EAAW7iE,KAAKmD,IAAIsvC,UAAUplB,EAAQ,GAAGsF,MAAM,KAC/C,mBAAsB3yB,KAAK4iE,MAC7BC,EAASn0C,KAAK1uB,KAAK4iE,OAEnBC,EAASn0C,OAEX1uB,KAAKmD,IAAMnD,KAAKmD,IAAIsvC,UAAU,EAAGplB,GAAS,IAAMw1C,EAASv9D,KAAK,IAChE,CACF,CACF,EAGAg2D,EAAY/4D,UAAUugE,mBAAqB,WAAYhmC,QAAQimC,MAAM,cAAe,EAQpFzH,EAAY/4D,UAAUygE,cAAgB,SAASjuC,EAAQv0B,EAASyiE,GAC9D,IAAIjjE,KAAKmgE,SAAT,CAGA,IAAIh8D,EAAM,IAAIoB,MAAMwvB,EAASv0B,EAAU,eACvC2D,EAAI3D,QAAUA,EACd2D,EAAIw9D,KAAO,eACXx9D,EAAI8+D,MAAQA,EACZjjE,KAAKkgE,UAAW,EAChBlgE,KAAKoiE,QACLpiE,KAAKyyB,SAAStuB,EAPd,CAQF,EAEAm3D,EAAY/4D,UAAUw9D,aAAe,WACnC,IAAIvuB,EAAOxxC,KAGPA,KAAKmhE,WAAanhE,KAAKkhE,SACzBlhE,KAAKkhE,OAASl1C,YAAW,WACvBwlB,EAAKwxB,cAAc,cAAexxB,EAAK2vB,SAAU,QACnD,GAAGnhE,KAAKmhE,WAGNnhE,KAAKohE,mBAAqBphE,KAAKigE,wBACjCjgE,KAAKigE,sBAAwBj0C,YAAW,WACtCwlB,EAAKwxB,cAAc,uBAAwBxxB,EAAK4vB,iBAAkB,YACpE,GAAGphE,KAAKohE,kBAEZ,qCC/qBA,IAAI8B,EAAQ,EAAQ,MAcpB,SAAS1H,EAAazyD,GACpB,GAAIA,EAAK,OAWX,SAAeA,GACb,IAAK,IAAIzF,KAAOk4D,EAAaj5D,UAC3BwG,EAAIzF,GAAOk4D,EAAaj5D,UAAUe,GAEpC,OAAOyF,CACT,CAhBkB47C,CAAM57C,EACxB,CAVAE,EAAOlJ,QAAUy7D,EAmCjBA,EAAaj5D,UAAU8H,IAAM,SAAS7C,GACpC,OAAOxH,KAAKmH,OAAOK,EAAMm0B,cAC3B,EAcA6/B,EAAaj5D,UAAU26D,qBAAuB,SAAS/1D,GAKnD,IAAIg8D,EAAKh8D,EAAO,iBAAmB,GACnCnH,KAAKgH,KAAOk8D,EAAMl8D,KAAKm8D,GAGvB,IAAI1+D,EAASy+D,EAAMz+D,OAAO0+D,GAC1B,IAAK,IAAI7/D,KAAOmB,EAAQzE,KAAKsD,GAAOmB,EAAOnB,GAE3CtD,KAAKojE,MAAQ,CAAC,EAGd,IACQj8D,EAAOk8D,OACPrjE,KAAKojE,MAAQF,EAAMI,WAAWn8D,EAAOk8D,MAE7C,CAAE,MAAOl/D,GAET,CACJ,EAuBAq3D,EAAaj5D,UAAUo6D,qBAAuB,SAASh3D,GACnD,IAAIqB,EAAOrB,EAAS,IAAM,EAG1B3F,KAAK2F,OAAS3F,KAAK09D,WAAa/3D,EAChC3F,KAAKujE,WAAav8D,EAGlBhH,KAAKqwB,KAAO,GAAKrpB,EACjBhH,KAAKgiE,GAAK,GAAKh7D,EACfhH,KAAK6lC,SAAW,GAAK7+B,EACrBhH,KAAKwjE,YAAc,GAAKx8D,EACxBhH,KAAKyjE,YAAc,GAAKz8D,EACxBhH,KAAKiI,OAAS,GAAKjB,GAAQ,GAAKA,IAC1BhH,KAAKm+D,UAIXn+D,KAAK0jE,SAAW,KAAO/9D,EACvB3F,KAAK2jE,UAAY,KAAOh+D,EACxB3F,KAAK4jE,WAAa,KAAOj+D,EACzB3F,KAAK6jE,aAAe,KAAOl+D,EAC3B3F,KAAK8jE,cAAgB,KAAOn+D,EAC5B3F,KAAK+jE,UAAY,KAAOp+D,EACxB3F,KAAKgkE,SAAW,KAAOr+D,CAC3B,mCC3HA5F,EAAQiH,KAAO,SAASoB,GACtB,OAAOA,EAAIuqB,MAAM,SAAS02B,OAC5B,EAUAtpD,EAAQ0E,OAAS,SAAS2D,GACxB,OAAOA,EAAIuqB,MAAM,SAASwV,QAAO,SAASp/B,EAAKX,GAC7C,IAAI67D,EAAQ77D,EAAIuqB,MAAM,SAClBrvB,EAAM2gE,EAAM5a,QACZ/zB,EAAM2uC,EAAM5a,QAGhB,OADI/lD,GAAOgyB,IAAKvsB,EAAIzF,GAAOgyB,GACpBvsB,CACT,GAAG,CAAC,EACN,EAUAhJ,EAAQujE,WAAa,SAASl7D,GAC5B,OAAOA,EAAIuqB,MAAM,SAASwV,QAAO,SAASp/B,EAAKX,GAC7C,IAAI67D,EAAQ77D,EAAIuqB,MAAM,SAClBxvB,EAAM8gE,EAAM,GAAGn3C,MAAM,GAAI,GAG7B,OADA/jB,EADUk7D,EAAM,GAAGtxC,MAAM,SAAS,GAAG7F,MAAM,GAAI,IACpC3pB,EACJ4F,CACT,GAAG,CAAC,EACN,EAUAhJ,EAAQmkE,YAAc,SAAS/8D,EAAQg9D,GAUrC,cATOh9D,EAAO,uBACPA,EAAO,yBACPA,EAAO,4BACPA,EAAa,KAEhBg9D,WACKh9D,EAAsB,qBACtBA,EAAe,QAEjBA,CACT,sBCrEIi9D,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB3hE,IAAjB4hE,EACH,OAAOA,EAAaxkE,QAGrB,IAAIkJ,EAASm7D,EAAyBE,GAAY,CAGjDvkE,QAAS,CAAC,GAOX,OAHAykE,EAAoBF,GAAUl2C,KAAKnlB,EAAOlJ,QAASkJ,EAAQA,EAAOlJ,QAASskE,GAGpEp7D,EAAOlJ,OACf,CCrBAskE,EAAoB34B,EAAI,SAASziC,GAChC,IAAIw7D,EAASx7D,GAAUA,EAAOy7D,WAC7B,WAAa,OAAOz7D,EAAgB,OAAG,EACvC,WAAa,OAAOA,CAAQ,EAE7B,OADAo7D,EAAoBj3B,EAAEq3B,EAAQ,CAAE91C,EAAG81C,IAC5BA,CACR,ECNAJ,EAAoBj3B,EAAI,SAASrtC,EAAS4kE,GACzC,IAAI,IAAIrhE,KAAOqhE,EACXN,EAAoB7mC,EAAEmnC,EAAYrhE,KAAS+gE,EAAoB7mC,EAAEz9B,EAASuD,IAC5EwC,OAAO6lC,eAAe5rC,EAASuD,EAAK,CAAE6oC,YAAY,EAAM9hC,IAAKs6D,EAAWrhE,IAG3E,ECPA+gE,EAAoB7mC,EAAI,SAASz0B,EAAKw8C,GAAQ,OAAOz/C,OAAOvD,UAAUiB,eAAe4qB,KAAKrlB,EAAKw8C,EAAO,ECG5E8e,EAAoB","sources":["webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/ApiClient.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/AccountExportApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/AccountExportsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/ActivityFeedApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/AuthorizedAppsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/AutomationsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/BatchWebhooksApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/BatchesApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/CampaignFoldersApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/CampaignsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/ConnectedSitesApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/ConversationsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/CustomerJourneysApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/EcommerceApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/FacebookAdsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/FileManagerApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/LandingPagesApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/ListsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/PingApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/ReportingApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/ReportsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/RootApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/SearchCampaignsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/SearchMembersApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/SurveysApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/TemplateFoldersApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/TemplatesApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/api/VerifiedDomainsApi.js","webpack://project-template-webpack/./node_modules/@mailchimp/mailchimp_marketing/src/index.js","webpack://project-template-webpack/./node_modules/ScrollMagic/scrollmagic/uncompressed/ScrollMagic.js","webpack://project-template-webpack/./src/consts/const-event-types.js","webpack://project-template-webpack/./src/services/service-some-api.js","webpack://project-template-webpack/./src/components/app.js","webpack://project-template-webpack/./src/components/example-component/example-component.js","webpack://project-template-webpack/./src/components/user-item/user-item.js","webpack://project-template-webpack/./src/components/menu-dropdown/menu-dropdown.js","webpack://project-template-webpack/./src/components/menu-dropdown/menu-main.js","webpack://project-template-webpack/./src/components/accordion/accordion.js","webpack://project-template-webpack/./src/components/media-player/media-player.js","webpack://project-template-webpack/./src/components/header/header.js","webpack://project-template-webpack/./src/components/anchor-menu/anchor-menu.js","webpack://project-template-webpack/./src/services/service-typeAhead.js","webpack://project-template-webpack/./src/services/service-url-params.js","webpack://project-template-webpack/./src/components/search/global-search.js","webpack://project-template-webpack/./src/components/iframe-tab/iframe-tab.js","webpack://project-template-webpack/./src/components/service-code/service-code.js","webpack://project-template-webpack/./src/components/rich-text/rich-text.js","webpack://project-template-webpack/./src/components/mailchimp-signup/mailchimp-signup.js","webpack://project-template-webpack/./src/components/google-map/google-map.js","webpack://project-template-webpack/./src/components/ical/ical.js","webpack://project-template-webpack/./src/services/service-cookies.js","webpack://project-template-webpack/./src/components/global-alert/global-alert.js","webpack://project-template-webpack/./src/components/pricesave-calculator/pricesave-calculator.js","webpack://project-template-webpack/./src/components/guidePage/richTextModule.js","webpack://project-template-webpack/./src/components/guidePage/infoBoxModule.js","webpack://project-template-webpack/./src/components/guidePage/accordionModule.js","webpack://project-template-webpack/./src/components/guidePage/accordionItem.js","webpack://project-template-webpack/./src/components/guidePage/quoteModule.js","webpack://project-template-webpack/./src/components/guidePage/imageModule.js","webpack://project-template-webpack/./src/components/questionnaire/questionnaire.js","webpack://project-template-webpack/./src/services/service-utils.js","webpack://project-template-webpack/./src/components/guidePage/guideTitle.js","webpack://project-template-webpack/./src/components/guidePage/button.js","webpack://project-template-webpack/./src/components/guidePage/guideStepCheck.js","webpack://project-template-webpack/./src/components/guidePage/guideStepCompleation.js","webpack://project-template-webpack/./src/components/guidePage/SetStepAsCompleated.js","webpack://project-template-webpack/./src/components/guidePage/insertInfoTextAfterCompleation.js","webpack://project-template-webpack/./src/components/guidePage/guidePage.js","webpack://project-template-webpack/./src/components/guidePage/receiptQuiz.js","webpack://project-template-webpack/./src/components/guidePage/receiptQuizFunction.js","webpack://project-template-webpack/./src/components/guidePage/checkForCompleated.js","webpack://project-template-webpack/./src/components/guide-reminder/guide-progress.js","webpack://project-template-webpack/./src/services/service-forms.js","webpack://project-template-webpack/./src/components/call-me-up/call-me-up.js","webpack://project-template-webpack/./src/components/candeno-login/candeno-login.js","webpack://project-template-webpack/./src/index.js","webpack://project-template-webpack/./node_modules/component-emitter/index.js","webpack://project-template-webpack/./node_modules/lazysizes/lazysizes.js","webpack://project-template-webpack/./node_modules/lazysizes/plugins/bgset/ls.bgset.js","webpack://project-template-webpack/./node_modules/lazysizes/plugins/parent-fit/ls.parent-fit.js","webpack://project-template-webpack/./node_modules/lazysizes/plugins/respimg/ls.respimg.js","webpack://project-template-webpack/./node_modules/lazysizes/plugins/unveilhooks/ls.unveilhooks.js","webpack://project-template-webpack/./node_modules/querystring/decode.js","webpack://project-template-webpack/./node_modules/querystring/encode.js","webpack://project-template-webpack/./node_modules/querystring/index.js","webpack://project-template-webpack/./node_modules/regenerator-runtime/runtime.js","webpack://project-template-webpack/./node_modules/superagent/lib/agent-base.js","webpack://project-template-webpack/./node_modules/superagent/lib/client.js","webpack://project-template-webpack/./node_modules/superagent/lib/is-object.js","webpack://project-template-webpack/./node_modules/superagent/lib/request-base.js","webpack://project-template-webpack/./node_modules/superagent/lib/response-base.js","webpack://project-template-webpack/./node_modules/superagent/lib/utils.js","webpack://project-template-webpack/webpack/bootstrap","webpack://project-template-webpack/webpack/runtime/compat get default export","webpack://project-template-webpack/webpack/runtime/define property getters","webpack://project-template-webpack/webpack/runtime/hasOwnProperty shorthand","webpack://project-template-webpack/webpack/startup"],"sourcesContent":["/**\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.7\n *\n * Do not edit the class manually.\n *\n */\n\nvar superagent = require('superagent');\nvar querystring = require('querystring');\n\nvar AccountExport = require('./api/AccountExportApi');\nvar AccountExports = require('./api/AccountExportsApi');\nvar ActivityFeed = require('./api/ActivityFeedApi');\nvar AuthorizedApps = require('./api/AuthorizedAppsApi');\nvar Automations = require('./api/AutomationsApi');\nvar BatchWebhooks = require('./api/BatchWebhooksApi');\nvar Batches = require('./api/BatchesApi');\nvar CampaignFolders = require('./api/CampaignFoldersApi');\nvar Campaigns = require('./api/CampaignsApi');\nvar ConnectedSites = require('./api/ConnectedSitesApi');\nvar Conversations = require('./api/ConversationsApi');\nvar CustomerJourneys = require('./api/CustomerJourneysApi');\nvar Ecommerce = require('./api/EcommerceApi');\nvar FacebookAds = require('./api/FacebookAdsApi');\nvar FileManager = require('./api/FileManagerApi');\nvar LandingPages = require('./api/LandingPagesApi');\nvar Lists = require('./api/ListsApi');\nvar Ping = require('./api/PingApi');\nvar Reporting = require('./api/ReportingApi');\nvar Reports = require('./api/ReportsApi');\nvar Root = require('./api/RootApi');\nvar SearchCampaigns = require('./api/SearchCampaignsApi');\nvar SearchMembers = require('./api/SearchMembersApi');\nvar Surveys = require('./api/SurveysApi');\nvar TemplateFolders = require('./api/TemplateFoldersApi');\nvar Templates = require('./api/TemplatesApi');\nvar VerifiedDomains = require('./api/VerifiedDomainsApi');\n\n/**\n * @module ApiClient\n * @version 3.0.80\n */\n\n/**\n * Manages low level client-server communications, parameter marshalling, etc. There should not be any need for an\n * application to use this class directly - the *Api and model classes provide the public API for the service. The\n * contents of this file should be regarded as internal but are documented for completeness.\n * @alias module:ApiClient\n * @class\n */\nvar exports = function() {\n\n /**\n * The base URL against which to resolve every API call's (relative) path.\n * @type {String}\n * @default https://server.api.mailchimp.com/3.0\n */\n this.basePath = 'https://server.api.mailchimp.com/3.0'.replace(/\\/+$/, '');\n\n /**\n * The API configuration settings object\n * @type {Object}\n * @default {}\n */\n this.config = {\n apiKey: '',\n accessToken: '',\n server: 'invalid-server'\n };\n\n /**\n * The default HTTP headers to be included for all API calls.\n * @type {Array.}\n * @default {}\n */\n this.defaultHeaders = {};\n /**\n * The default HTTP timeout for all API calls.\n * @type {Number}\n * @default 60000\n */\n this.timeout = 120000;\n\n /**\n * If set to false an additional timestamp parameter is added to all API GET calls to\n * prevent browser caching\n * @type {Boolean}\n * @default true\n */\n this.cache = true;\n\n /**\n * If set to true, the client will save the cookies from each server\n * response, and return them in the next request.\n * @default false\n */\n this.enableCookies = false;\n\n /*\n * Used to save and return cookies in a node.js (non-browser) setting,\n * if this.enableCookies is set to true.\n */\n if (typeof window === 'undefined') {\n this.agent = new superagent.agent();\n }\n\n // API Routes\n this.accountExport = new AccountExport(this);\n this.accountExports = new AccountExports(this);\n this.activityFeed = new ActivityFeed(this);\n this.authorizedApps = new AuthorizedApps(this);\n this.automations = new Automations(this);\n this.batchWebhooks = new BatchWebhooks(this);\n this.batches = new Batches(this);\n this.campaignFolders = new CampaignFolders(this);\n this.campaigns = new Campaigns(this);\n this.connectedSites = new ConnectedSites(this);\n this.conversations = new Conversations(this);\n this.customerJourneys = new CustomerJourneys(this);\n this.ecommerce = new Ecommerce(this);\n this.facebookAds = new FacebookAds(this);\n this.fileManager = new FileManager(this);\n this.landingPages = new LandingPages(this);\n this.lists = new Lists(this);\n this.ping = new Ping(this);\n this.reporting = new Reporting(this);\n this.reports = new Reports(this);\n this.root = new Root(this);\n this.searchCampaigns = new SearchCampaigns(this);\n this.searchMembers = new SearchMembers(this);\n this.Surveys = new Surveys(this);\n this.templateFolders = new TemplateFolders(this);\n this.templates = new Templates(this);\n this.verifiedDomains = new VerifiedDomains(this);\n};\n\n/**\n * Sets the API configuration settings object.\n * @param config {Object} The configuration object\n */\nexports.prototype.setConfig = function(config = {}) {\n var _this = this;\n this.config = config;\n};\n\n/**\n * Returns a string representation for an actual parameter.\n * @param param The actual parameter.\n * @returns {String} The string representation of param.\n */\nexports.prototype.paramToString = function(param) {\n if (param == undefined || param == null) {\n return '';\n }\n if (param instanceof Date) {\n return param.toJSON();\n }\n return param.toString();\n};\n\n/**\n * Builds full URL by appending the given path to the base URL and replacing path parameter place-holders with parameter values.\n * NOTE: query parameters are not handled here.\n * @param {String} path The path to append to the base URL.\n * @param {Object} pathParams The parameter values to append.\n * @returns {String} The encoded path with parameter values substituted.\n */\nexports.prototype.buildUrl = function(path, pathParams) {\n if (!path.match(/^\\//)) {\n path = '/' + path;\n }\n var url = this.basePath + path;\n var _this = this;\n url = url.replace(/\\{([\\w-]+)\\}/g, function(fullMatch, key) {\n var value;\n if (pathParams.hasOwnProperty(key)) {\n value = _this.paramToString(pathParams[key]);\n } else {\n value = fullMatch;\n }\n return encodeURIComponent(value);\n });\n\n // Define the server\n if (typeof this.config.server !== 'undefined') {\n url = url.replace('server', this.config.server);\n }\n\n return url;\n};\n\n/**\n * Checks whether the given content type represents JSON.
\n * JSON content type examples:
\n * \n * @param {String} contentType The MIME content type to check.\n * @returns {Boolean} true if contentType represents JSON, otherwise false.\n */\nexports.prototype.isJsonMime = function(contentType) {\n return Boolean(contentType != null && contentType.match(/^application\\/json(;.*)?$/i));\n};\n\n/**\n * Chooses a content type from the given array, with JSON preferred; i.e. return JSON if included, otherwise return the first.\n * @param {Array.} contentTypes\n * @returns {String} The chosen content type, preferring JSON.\n */\nexports.prototype.jsonPreferredMime = function(contentTypes) {\n for (var i = 0; i < contentTypes.length; i++) {\n if (this.isJsonMime(contentTypes[i])) {\n return contentTypes[i];\n }\n }\n return contentTypes[0];\n};\n\n/**\n * Checks whether the given parameter value represents file-like content.\n * @param param The parameter to check.\n * @returns {Boolean} true if param represents a file.\n */\nexports.prototype.isFileParam = function(param) {\n // fs.ReadStream in Node.js and Electron (but not in runtime like browserify)\n if (typeof require === 'function') {\n var fs;\n try {\n fs = require('fs');\n } catch (err) {}\n if (fs && fs.ReadStream && param instanceof fs.ReadStream) {\n return true;\n }\n }\n // Buffer in Node.js\n if (typeof Buffer === 'function' && param instanceof Buffer) {\n return true;\n }\n // Blob in browser\n if (typeof Blob === 'function' && param instanceof Blob) {\n return true;\n }\n // File in browser (it seems File object is also instance of Blob, but keep this for safe)\n if (typeof File === 'function' && param instanceof File) {\n return true;\n }\n return false;\n};\n\n/**\n * Normalizes parameter values:\n * \n * @param {Object.} params The parameters as object properties.\n * @returns {Object.} normalized parameters.\n */\nexports.prototype.normalizeParams = function(params) {\n var newParams = {};\n for (var key in params) {\n if (params.hasOwnProperty(key) && params[key] != undefined && params[key] != null) {\n var value = params[key];\n if (this.isFileParam(value) || Array.isArray(value)) {\n newParams[key] = value;\n } else {\n newParams[key] = this.paramToString(value);\n }\n }\n }\n return newParams;\n};\n\n/**\n * Enumeration of collection format separator strategies.\n * @enum {String}\n * @readonly\n */\nexports.CollectionFormatEnum = {\n /**\n * Comma-separated values. Value: csv\n * @const\n */\n CSV: ',',\n /**\n * Space-separated values. Value: ssv\n * @const\n */\n SSV: ' ',\n /**\n * Tab-separated values. Value: tsv\n * @const\n */\n TSV: '\\t',\n /**\n * Pipe(|)-separated values. Value: pipes\n * @const\n */\n PIPES: '|',\n /**\n * Native array. Value: multi\n * @const\n */\n MULTI: 'multi'\n};\n\n/**\n * Builds a string representation of an array-type actual parameter, according to the given collection format.\n * @param {Array} param An array parameter.\n * @param {module:ApiClient.CollectionFormatEnum} collectionFormat The array element separator strategy.\n * @returns {String|Array} A string representation of the supplied collection, using the specified delimiter. Returns\n * param as is if collectionFormat is multi.\n */\nexports.prototype.buildCollectionParam = function buildCollectionParam(param, collectionFormat) {\n if (param == null) {\n return null;\n }\n switch (collectionFormat) {\n case 'csv':\n return param.map(this.paramToString).join(',');\n case 'ssv':\n return param.map(this.paramToString).join(' ');\n case 'tsv':\n return param.map(this.paramToString).join('\\t');\n case 'pipes':\n return param.map(this.paramToString).join('|');\n case 'multi':\n // return the array directly as SuperAgent will handle it as expected\n return param.map(this.paramToString);\n default:\n throw new Error('Unknown collection format: ' + collectionFormat);\n }\n};\n\n/**\n * Deserializes an HTTP response body into a value of the specified type.\n * @param {Object} response A SuperAgent response object.\n * @param {(String|Array.|Object.|Function)} returnType The type to return. Pass a string for simple types\n * or the constructor function for a complex type. Pass an array containing the type name to return an array of that type. To\n * return an object, pass an object with one property whose name is the key type and whose value is the corresponding value type:\n * all properties on data will be converted to this type.\n * @returns A value of the specified type.\n */\nexports.prototype.deserialize = function deserialize(response, returnType) {\n if (response == null || returnType == null || response.status == 204) {\n return null;\n }\n // Rely on SuperAgent for parsing response body.\n // See http://visionmedia.github.io/superagent/#parsing-response-bodies\n var data = response.body;\n if (data == null || (typeof data === 'object' && typeof data.length === 'undefined' && !Object.keys(data).length)) {\n // SuperAgent does not always produce a body; use the unparsed response as a fallback\n data = response.text;\n }\n return exports.convertToType(data, returnType);\n};\n\n/**\n * Invokes the REST service using the supplied settings and parameters.\n * @param {String} path The base URL to invoke.\n * @param {String} httpMethod The HTTP method to use.\n * @param {Object.} pathParams A map of path parameters and their values.\n * @param {Object.} queryParams A map of query parameters and their values.\n * @param {Object.} headerParams A map of header parameters and their values.\n * @param {Object.} formParams A map of form parameters and their values.\n * @param {Object} bodyParam The value to pass as the request body.\n * @param {Array.} authNames An array of authentication type names.\n * @param {Array.} contentTypes An array of request MIME types.\n * @param {Array.} accepts An array of acceptable response MIME types.\n * @param {(String|Array|ObjectFunction)} returnType The required type to return; can be a string for simple types or the\n * constructor for a complex type.\n * @returns {Promise} A {@link https://www.promisejs.org/|Promise} object.\n */\nexports.prototype.callApi = function callApi(path, httpMethod, pathParams,\n queryParams, headerParams, formParams, bodyParam, authNames, contentTypes, accepts,\n returnType) {\n\n var _this = this;\n var url = this.buildUrl(path, pathParams);\n var request = superagent(httpMethod, url);\n\n // Basic Authentication\n if (this.config.apiKey !== undefined && this.config.apiKey !== '') {\n request.auth('user', this.config.apiKey);\n }\n\n // OAuth Authentication\n else if (this.config.accessToken !== undefined && this.config.accessToken !== '') {\n request.set({'Authorization': 'Bearer ' + this.config.accessToken});\n }\n\n // set query parameters\n if (httpMethod.toUpperCase() === 'GET' && this.cache === false) {\n queryParams['_'] = new Date().getTime();\n }\n request.query(this.normalizeParams(queryParams));\n\n // set header parameters\n request.set(this.defaultHeaders).set(this.normalizeParams(headerParams));\n\n // set request timeout\n request.timeout(this.timeout);\n\n var contentType = this.jsonPreferredMime(contentTypes);\n if (contentType) {\n // Issue with superagent and multipart/form-data (https://github.com/visionmedia/superagent/issues/746)\n if(contentType != 'multipart/form-data') {\n request.type(contentType);\n }\n } else if (!HeaderUtils.caseInsensitiveGet(request.header, 'content-type')) {\n request.type('application/json');\n }\n\n if (contentType === 'application/x-www-form-urlencoded') {\n request.send(querystring.stringify(this.normalizeParams(formParams)));\n } else if (contentType == 'multipart/form-data') {\n var _formParams = this.normalizeParams(formParams);\n for (var key in _formParams) {\n if (_formParams.hasOwnProperty(key)) {\n if (this.isFileParam(_formParams[key])) {\n // file field\n request.attach(key, _formParams[key]);\n } else {\n request.field(key, _formParams[key]);\n }\n }\n }\n } else if (bodyParam) {\n request.send(bodyParam);\n }\n\n var accept = this.jsonPreferredMime(accepts);\n if (accept) {\n request.accept(accept);\n }\n\n if (returnType === 'Blob') {\n request.responseType('blob');\n } else if (returnType === 'String') {\n request.responseType('string');\n }\n\n // Attach previously saved cookies, if enabled\n if (this.enableCookies){\n if (typeof window === 'undefined') {\n this.agent.attachCookies(request);\n }\n else {\n request.withCredentials();\n }\n }\n\n return new Promise(function(resolve, reject) {\n request.end(function(error, response) {\n if (error) {\n reject(error);\n } else {\n try {\n var data = _this.deserialize(response, returnType);\n if (_this.enableCookies && typeof window === 'undefined'){\n _this.agent.saveCookies(response);\n }\n resolve({data: data, response: response});\n } catch (err) {\n reject(err);\n }\n }\n });\n });\n };\n\n/**\n * Parses an ISO-8601 string representation of a date value.\n * @param {String} str The date value as a string.\n * @returns {Date} The parsed date object.\n */\nexports.parseDate = function(str) {\n return new Date(str.replace(/T/i, ' '));\n};\n\n/**\n * Converts a value to the specified type.\n * @param {(String|Object)} data The data to convert, as a string or object.\n * @param {(String|Array.|Object.|Function)} type The type to return. Pass a string for simple types\n * or the constructor function for a complex type. Pass an array containing the type name to return an array of that type. To\n * return an object, pass an object with one property whose name is the key type and whose value is the corresponding value type:\n * all properties on data will be converted to this type.\n * @returns An instance of the specified type or null or undefined if data is null or undefined.\n */\nexports.convertToType = function(data, type) {\n if (data === null || data === undefined)\n return data\n\n switch (type) {\n case 'Boolean':\n return Boolean(data);\n case 'Integer':\n return parseInt(data, 10);\n case 'Number':\n return parseFloat(data);\n case 'String':\n return String(data);\n case 'Date':\n return this.parseDate(String(data));\n case 'Blob':\n return data;\n default:\n if (type === Object) {\n // generic object, return directly\n return data;\n } else if (typeof type === 'function') {\n // for model type like: User\n return type.constructFromObject(data);\n } else if (Array.isArray(type)) {\n // for array type like: ['String']\n var itemType = type[0];\n return data.map(function(item) {\n return exports.convertToType(item, itemType);\n });\n } else if (typeof type === 'object') {\n // for plain object type like: {'String': 'Integer'}\n var keyType, valueType;\n for (var k in type) {\n if (type.hasOwnProperty(k)) {\n keyType = k;\n valueType = type[k];\n break;\n }\n }\n var result = {};\n for (var k in data) {\n if (data.hasOwnProperty(k)) {\n var key = exports.convertToType(k, keyType);\n var value = exports.convertToType(data[k], valueType);\n result[key] = value;\n }\n }\n return result;\n } else {\n // for unknown type, return the data directly\n return data;\n }\n }\n};\n\n/**\n * Constructs a new map or array model from REST data.\n * @param data {Object|Array} The REST data.\n * @param obj {Object|Array} The target object or array.\n */\nexports.constructFromObject = function(data, obj, itemType) {\n if (Array.isArray(data)) {\n for (var i = 0; i < data.length; i++) {\n if (data.hasOwnProperty(i))\n obj[i] = exports.convertToType(data[i], itemType);\n }\n } else {\n for (var k in data) {\n if (data.hasOwnProperty(k))\n obj[k] = exports.convertToType(data[k], itemType);\n }\n }\n};\n\n /**\n * The default API client implementation.\n * @type {module:ApiClient}\n */\nexports.instance = new exports();\n\nmodule.exports = exports;\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * AccountExport service.\n * @module api/AccountExportApi\n */\n\n/**\n * Constructs a new AccountExportApi. \n * @alias module:api/AccountExportApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Get account export info\n * Get information about a specific account export.\n * @param {String} exportId The unique id for the account export.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2001Exports} and HTTP response\n */\n this.getAccountExportsWithHttpInfo = function(exportId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'exportId' is set\n if (exportId === undefined || exportId === null) {\n throw new Error(\"Missing the required parameter 'exportId' when calling \");\n }\n\n var pathParams = {\n 'export_id': exportId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/account-exports/{export_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get account export info\n * Get information about a specific account export.\n * @param {String} exportId The unique id for the account export.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2001Exports}\n */\n this.getAccountExports = function(exportId, opts) {\n return this.getAccountExportsWithHttpInfo(exportId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * AccountExports service.\n * @module api/AccountExportsApi\n */\n\n/**\n * Constructs a new AccountExportsApi. \n * @alias module:api/AccountExportsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * List account exports\n * Get a list of account exports for a given account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2001} and HTTP response\n */\n this.listAccountExportsWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/account-exports', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List account exports\n * Get a list of account exports for a given account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2001}\n */\n this.listAccountExports = function(opts) {\n return this.listAccountExportsWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add export\n * Create a new account export in your Mailchimp account.\n * @param {module:model/CreateAnAccountExport} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2001Exports} and HTTP response\n */\n this.createAccountExportWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/account-exports', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add export\n * Create a new account export in your Mailchimp account.\n * @param {module:model/CreateAnAccountExport} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2001Exports}\n */\n this.createAccountExport = function(body) {\n return this.createAccountExportWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * ActivityFeed service.\n * @module api/ActivityFeedApi\n */\n\n/**\n * Constructs a new ActivityFeedApi. \n * @alias module:api/ActivityFeedApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Get latest chimp chatter\n * Return the Chimp Chatter for this account ordered by most recent.\n * @param {Object} opts Optional parameters\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse200} and HTTP response\n */\n this.getChimpChatterWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/activity-feed/chimp-chatter', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get latest chimp chatter\n * Return the Chimp Chatter for this account ordered by most recent.\n * @param {Object} opts Optional parameters\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse200}\n */\n this.getChimpChatter = function(opts) {\n return this.getChimpChatterWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * AuthorizedApps service.\n * @module api/AuthorizedAppsApi\n */\n\n/**\n * Constructs a new AuthorizedAppsApi. \n * @alias module:api/AuthorizedAppsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * List authorized apps\n * Get a list of an account's registered, connected applications.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2002} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/authorized-apps', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List authorized apps\n * Get a list of an account's registered, connected applications.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2002}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get authorized app info\n * Get information about a specific authorized application.\n * @param {String} appId The unique id for the connected authorized application.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2002Apps} and HTTP response\n */\n this.getWithHttpInfo = function(appId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'appId' is set\n if (appId === undefined || appId === null) {\n throw new Error(\"Missing the required parameter 'appId' when calling \");\n }\n\n var pathParams = {\n 'app_id': appId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/authorized-apps/{app_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get authorized app info\n * Get information about a specific authorized application.\n * @param {String} appId The unique id for the connected authorized application.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2002Apps}\n */\n this.get = function(appId, opts) {\n return this.getWithHttpInfo(appId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Automations service.\n * @module api/AutomationsApi\n */\n\n/**\n * Constructs a new AutomationsApi. \n * @alias module:api/AutomationsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Archive automation\n * Archiving will permanently end your automation and keep the report data. You’ll be able to replicate your archived automation, but you can’t restart it.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.archiveWithHttpInfo = function(workflowId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/actions/archive', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Archive automation\n * Archiving will permanently end your automation and keep the report data. You’ll be able to replicate your archived automation, but you can’t restart it.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.archive = function(workflowId) {\n return this.archiveWithHttpInfo(workflowId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete workflow email\n * Removes an individual classic automation workflow email. Emails from certain workflow types, including the Abandoned Cart Email (abandonedCart) and Product Retargeting Email (abandonedBrowse) Workflows, cannot be deleted.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteWorkflowEmailWithHttpInfo = function(workflowId, workflowEmailId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'workflowEmailId' is set\n if (workflowEmailId === undefined || workflowEmailId === null) {\n throw new Error(\"Missing the required parameter 'workflowEmailId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'workflow_email_id': workflowEmailId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails/{workflow_email_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete workflow email\n * Removes an individual classic automation workflow email. Emails from certain workflow types, including the Abandoned Cart Email (abandonedCart) and Product Retargeting Email (abandonedBrowse) Workflows, cannot be deleted.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteWorkflowEmail = function(workflowId, workflowEmailId) {\n return this.deleteWorkflowEmailWithHttpInfo(workflowId, workflowEmailId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List automations\n * Get a summary of an account's classic automations.\n * @param {Object} opts Optional parameters\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Date} opts.beforeCreateTime Restrict the response to automations created before this time. Uses the ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceCreateTime Restrict the response to automations created after this time. Uses the ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.beforeStartTime Restrict the response to automations started before this time. Uses the ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceStartTime Restrict the response to automations started after this time. Uses the ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {module:model/String} opts.status Restrict the results to automations with the specified status.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2003} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'before_create_time': ( opts['beforeCreateTime'] ? opts['beforeCreateTime'] : opts['before_create_time']),\n 'since_create_time': ( opts['sinceCreateTime'] ? opts['sinceCreateTime'] : opts['since_create_time']),\n 'before_start_time': ( opts['beforeStartTime'] ? opts['beforeStartTime'] : opts['before_start_time']),\n 'since_start_time': ( opts['sinceStartTime'] ? opts['sinceStartTime'] : opts['since_start_time']),\n 'status': ( opts['status'] ? opts['status'] : opts['status'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List automations\n * Get a summary of an account's classic automations.\n * @param {Object} opts Optional parameters\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Date} opts.beforeCreateTime Restrict the response to automations created before this time. Uses the ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceCreateTime Restrict the response to automations created after this time. Uses the ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.beforeStartTime Restrict the response to automations started before this time. Uses the ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceStartTime Restrict the response to automations started after this time. Uses the ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {module:model/String} opts.status Restrict the results to automations with the specified status.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2003}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get automation info\n * Get a summary of an individual classic automation workflow's settings and content. The `trigger_settings` object returns information for the first email in the workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AutomationWorkflow} and HTTP response\n */\n this.getWithHttpInfo = function(workflowId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get automation info\n * Get a summary of an individual classic automation workflow's settings and content. The `trigger_settings` object returns information for the first email in the workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AutomationWorkflow}\n */\n this.get = function(workflowId, opts) {\n return this.getWithHttpInfo(workflowId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List automated emails\n * Get a summary of the emails in a classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AutomationEmails} and HTTP response\n */\n this.listAllWorkflowEmailsWithHttpInfo = function(workflowId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List automated emails\n * Get a summary of the emails in a classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AutomationEmails}\n */\n this.listAllWorkflowEmails = function(workflowId) {\n return this.listAllWorkflowEmailsWithHttpInfo(workflowId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get workflow email info\n * Get information about an individual classic automation workflow email.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AutomationWorkflowEmail} and HTTP response\n */\n this.getWorkflowEmailWithHttpInfo = function(workflowId, workflowEmailId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'workflowEmailId' is set\n if (workflowEmailId === undefined || workflowEmailId === null) {\n throw new Error(\"Missing the required parameter 'workflowEmailId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'workflow_email_id': workflowEmailId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails/{workflow_email_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get workflow email info\n * Get information about an individual classic automation workflow email.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AutomationWorkflowEmail}\n */\n this.getWorkflowEmail = function(workflowId, workflowEmailId) {\n return this.getWorkflowEmailWithHttpInfo(workflowId, workflowEmailId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List automated email subscribers\n * Get information about a classic automation email queue.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2004} and HTTP response\n */\n this.getWorkflowEmailSubscriberQueueWithHttpInfo = function(workflowId, workflowEmailId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'workflowEmailId' is set\n if (workflowEmailId === undefined || workflowEmailId === null) {\n throw new Error(\"Missing the required parameter 'workflowEmailId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'workflow_email_id': workflowEmailId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails/{workflow_email_id}/queue', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List automated email subscribers\n * Get information about a classic automation email queue.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2004}\n */\n this.getWorkflowEmailSubscriberQueue = function(workflowId, workflowEmailId) {\n return this.getWorkflowEmailSubscriberQueueWithHttpInfo(workflowId, workflowEmailId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get automated email subscriber\n * Get information about a specific subscriber in a classic automation email queue.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SubscriberInAutomationQueue2} and HTTP response\n */\n this.getWorkflowEmailSubscriberWithHttpInfo = function(workflowId, workflowEmailId, subscriberHash) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'workflowEmailId' is set\n if (workflowEmailId === undefined || workflowEmailId === null) {\n throw new Error(\"Missing the required parameter 'workflowEmailId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'workflow_email_id': workflowEmailId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails/{workflow_email_id}/queue/{subscriber_hash}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get automated email subscriber\n * Get information about a specific subscriber in a classic automation email queue.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SubscriberInAutomationQueue2}\n */\n this.getWorkflowEmailSubscriber = function(workflowId, workflowEmailId, subscriberHash) {\n return this.getWorkflowEmailSubscriberWithHttpInfo(workflowId, workflowEmailId, subscriberHash)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List subscribers removed from workflow\n * Get information about subscribers who were removed from a classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/RemovedSubscribers} and HTTP response\n */\n this.listWorkflowEmailSubscribersRemovedWithHttpInfo = function(workflowId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/removed-subscribers', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List subscribers removed from workflow\n * Get information about subscribers who were removed from a classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/RemovedSubscribers}\n */\n this.listWorkflowEmailSubscribersRemoved = function(workflowId) {\n return this.listWorkflowEmailSubscribersRemovedWithHttpInfo(workflowId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get subscriber removed from workflow\n * Get information about a specific subscriber who was removed from a classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SubscriberRemovedFromAutomationWorkflow} and HTTP response\n */\n this.getRemovedWorkflowEmailSubscriberWithHttpInfo = function(workflowId, subscriberHash) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/removed-subscribers/{subscriber_hash}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get subscriber removed from workflow\n * Get information about a specific subscriber who was removed from a classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SubscriberRemovedFromAutomationWorkflow}\n */\n this.getRemovedWorkflowEmailSubscriber = function(workflowId, subscriberHash) {\n return this.getRemovedWorkflowEmailSubscriberWithHttpInfo(workflowId, subscriberHash)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update workflow email\n * Update settings for a classic automation workflow email. Only works with workflows of type: abandonedBrowse, abandonedCart, emailFollowup, or singleWelcome.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @param {module:model/UpdateInformationAboutASpecificWorkflowEmail} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AutomationWorkflowEmail} and HTTP response\n */\n this.updateWorkflowEmailWithHttpInfo = function(workflowId, workflowEmailId, body) {\n var postBody = body;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'workflowEmailId' is set\n if (workflowEmailId === undefined || workflowEmailId === null) {\n throw new Error(\"Missing the required parameter 'workflowEmailId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'workflow_email_id': workflowEmailId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails/{workflow_email_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update workflow email\n * Update settings for a classic automation workflow email. Only works with workflows of type: abandonedBrowse, abandonedCart, emailFollowup, or singleWelcome.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @param {module:model/UpdateInformationAboutASpecificWorkflowEmail} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AutomationWorkflowEmail}\n */\n this.updateWorkflowEmail = function(workflowId, workflowEmailId, body) {\n return this.updateWorkflowEmailWithHttpInfo(workflowId, workflowEmailId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add automation\n * Create a new classic automation in your Mailchimp account.\n * @param {module:model/AutomationWorkflow1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AutomationWorkflow} and HTTP response\n */\n this.createWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add automation\n * Create a new classic automation in your Mailchimp account.\n * @param {module:model/AutomationWorkflow1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AutomationWorkflow}\n */\n this.create = function(body) {\n return this.createWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Pause automation emails\n * Pause all emails in a specific classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.pauseAllEmailsWithHttpInfo = function(workflowId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/actions/pause-all-emails', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Pause automation emails\n * Pause all emails in a specific classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.pauseAllEmails = function(workflowId) {\n return this.pauseAllEmailsWithHttpInfo(workflowId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Start automation emails\n * Start all emails in a classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.startAllEmailsWithHttpInfo = function(workflowId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/actions/start-all-emails', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Start automation emails\n * Start all emails in a classic automation workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.startAllEmails = function(workflowId) {\n return this.startAllEmailsWithHttpInfo(workflowId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Pause automated email\n * Pause an automated email.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.pauseWorkflowEmailWithHttpInfo = function(workflowId, workflowEmailId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'workflowEmailId' is set\n if (workflowEmailId === undefined || workflowEmailId === null) {\n throw new Error(\"Missing the required parameter 'workflowEmailId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'workflow_email_id': workflowEmailId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails/{workflow_email_id}/actions/pause', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Pause automated email\n * Pause an automated email.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.pauseWorkflowEmail = function(workflowId, workflowEmailId) {\n return this.pauseWorkflowEmailWithHttpInfo(workflowId, workflowEmailId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Start automated email\n * Start an automated email.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.startWorkflowEmailWithHttpInfo = function(workflowId, workflowEmailId) {\n var postBody = null;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'workflowEmailId' is set\n if (workflowEmailId === undefined || workflowEmailId === null) {\n throw new Error(\"Missing the required parameter 'workflowEmailId' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'workflow_email_id': workflowEmailId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails/{workflow_email_id}/actions/start', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Start automated email\n * Start an automated email.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.startWorkflowEmail = function(workflowId, workflowEmailId) {\n return this.startWorkflowEmailWithHttpInfo(workflowId, workflowEmailId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add subscriber to workflow email\n * Manually add a subscriber to a workflow, bypassing the default trigger settings. You can also use this endpoint to trigger a series of automated emails in an API 3.0 workflow type.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @param {module:model/SubscriberInAutomationQueue1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SubscriberInAutomationQueue2} and HTTP response\n */\n this.addWorkflowEmailSubscriberWithHttpInfo = function(workflowId, workflowEmailId, body) {\n var postBody = body;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'workflowEmailId' is set\n if (workflowEmailId === undefined || workflowEmailId === null) {\n throw new Error(\"Missing the required parameter 'workflowEmailId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId,\n 'workflow_email_id': workflowEmailId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/emails/{workflow_email_id}/queue', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add subscriber to workflow email\n * Manually add a subscriber to a workflow, bypassing the default trigger settings. You can also use this endpoint to trigger a series of automated emails in an API 3.0 workflow type.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {String} workflowEmailId The unique id for the Automation workflow email.\n * @param {module:model/SubscriberInAutomationQueue1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SubscriberInAutomationQueue2}\n */\n this.addWorkflowEmailSubscriber = function(workflowId, workflowEmailId, body) {\n return this.addWorkflowEmailSubscriberWithHttpInfo(workflowId, workflowEmailId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Remove subscriber from workflow\n * Remove a subscriber from a specific classic automation workflow. You can remove a subscriber at any point in an automation workflow, regardless of how many emails they've been sent from that workflow. Once they're removed, they can never be added back to the same workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {module:model/SubscriberInAutomationQueue3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SubscriberRemovedFromAutomationWorkflow} and HTTP response\n */\n this.removeWorkflowEmailSubscriberWithHttpInfo = function(workflowId, body) {\n var postBody = body;\n\n // verify the required parameter 'workflowId' is set\n if (workflowId === undefined || workflowId === null) {\n throw new Error(\"Missing the required parameter 'workflowId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'workflow_id': workflowId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/automations/{workflow_id}/removed-subscribers', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Remove subscriber from workflow\n * Remove a subscriber from a specific classic automation workflow. You can remove a subscriber at any point in an automation workflow, regardless of how many emails they've been sent from that workflow. Once they're removed, they can never be added back to the same workflow.\n * @param {String} workflowId The unique id for the Automation workflow.\n * @param {module:model/SubscriberInAutomationQueue3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SubscriberRemovedFromAutomationWorkflow}\n */\n this.removeWorkflowEmailSubscriber = function(workflowId, body) {\n return this.removeWorkflowEmailSubscriberWithHttpInfo(workflowId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * BatchWebhooks service.\n * @module api/BatchWebhooksApi\n */\n\n/**\n * Constructs a new BatchWebhooksApi. \n * @alias module:api/BatchWebhooksApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete batch webhook\n * Remove a batch webhook. Webhooks will no longer be sent to the given URL.\n * @param {String} batchWebhookId The unique id for the batch webhook.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.removeWithHttpInfo = function(batchWebhookId) {\n var postBody = null;\n\n // verify the required parameter 'batchWebhookId' is set\n if (batchWebhookId === undefined || batchWebhookId === null) {\n throw new Error(\"Missing the required parameter 'batchWebhookId' when calling \");\n }\n\n var pathParams = {\n 'batch_webhook_id': batchWebhookId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batch-webhooks/{batch_webhook_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete batch webhook\n * Remove a batch webhook. Webhooks will no longer be sent to the given URL.\n * @param {String} batchWebhookId The unique id for the batch webhook.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.remove = function(batchWebhookId) {\n return this.removeWithHttpInfo(batchWebhookId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get batch webhook info\n * Get information about a specific batch webhook.\n * @param {String} batchWebhookId The unique id for the batch webhook.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/BatchWebhook} and HTTP response\n */\n this.getWithHttpInfo = function(batchWebhookId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'batchWebhookId' is set\n if (batchWebhookId === undefined || batchWebhookId === null) {\n throw new Error(\"Missing the required parameter 'batchWebhookId' when calling \");\n }\n\n var pathParams = {\n 'batch_webhook_id': batchWebhookId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batch-webhooks/{batch_webhook_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get batch webhook info\n * Get information about a specific batch webhook.\n * @param {String} batchWebhookId The unique id for the batch webhook.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/BatchWebhook}\n */\n this.get = function(batchWebhookId, opts) {\n return this.getWithHttpInfo(batchWebhookId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List batch webhooks\n * Get all webhooks that have been configured for batches.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/BatchWebhooks} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batch-webhooks', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List batch webhooks\n * Get all webhooks that have been configured for batches.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/BatchWebhooks}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update batch webhook\n * Update a webhook that will fire whenever any batch request completes processing.\n * @param {String} batchWebhookId The unique id for the batch webhook.\n * @param {module:model/BatchWebhook2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/BatchWebhook} and HTTP response\n */\n this.updateWithHttpInfo = function(batchWebhookId, body) {\n var postBody = body;\n\n // verify the required parameter 'batchWebhookId' is set\n if (batchWebhookId === undefined || batchWebhookId === null) {\n throw new Error(\"Missing the required parameter 'batchWebhookId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'batch_webhook_id': batchWebhookId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batch-webhooks/{batch_webhook_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update batch webhook\n * Update a webhook that will fire whenever any batch request completes processing.\n * @param {String} batchWebhookId The unique id for the batch webhook.\n * @param {module:model/BatchWebhook2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/BatchWebhook}\n */\n this.update = function(batchWebhookId, body) {\n return this.updateWithHttpInfo(batchWebhookId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add batch webhook\n * Configure a webhook that will fire whenever any batch request completes processing. You may only have a maximum of 20 batch webhooks.\n * @param {module:model/BatchWebhook1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/BatchWebhook} and HTTP response\n */\n this.createWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batch-webhooks', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add batch webhook\n * Configure a webhook that will fire whenever any batch request completes processing. You may only have a maximum of 20 batch webhooks.\n * @param {module:model/BatchWebhook1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/BatchWebhook}\n */\n this.create = function(body) {\n return this.createWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Batches service.\n * @module api/BatchesApi\n */\n\n/**\n * Constructs a new BatchesApi. \n * @alias module:api/BatchesApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete batch request\n * Stops a batch request from running. Since only one batch request is run at a time, this can be used to cancel a long running request. The results of any completed operations will not be available after this call.\n * @param {String} batchId The unique id for the batch operation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteRequestWithHttpInfo = function(batchId) {\n var postBody = null;\n\n // verify the required parameter 'batchId' is set\n if (batchId === undefined || batchId === null) {\n throw new Error(\"Missing the required parameter 'batchId' when calling \");\n }\n\n var pathParams = {\n 'batch_id': batchId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batches/{batch_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete batch request\n * Stops a batch request from running. Since only one batch request is run at a time, this can be used to cancel a long running request. The results of any completed operations will not be available after this call.\n * @param {String} batchId The unique id for the batch operation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteRequest = function(batchId) {\n return this.deleteRequestWithHttpInfo(batchId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List batch requests\n * Get a summary of batch requests that have been made.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/BatchOperations} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batches', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List batch requests\n * Get a summary of batch requests that have been made.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/BatchOperations}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get batch operation status\n * Get the status of a batch request.\n * @param {String} batchId The unique id for the batch operation.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Batch} and HTTP response\n */\n this.statusWithHttpInfo = function(batchId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'batchId' is set\n if (batchId === undefined || batchId === null) {\n throw new Error(\"Missing the required parameter 'batchId' when calling \");\n }\n\n var pathParams = {\n 'batch_id': batchId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batches/{batch_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get batch operation status\n * Get the status of a batch request.\n * @param {String} batchId The unique id for the batch operation.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Batch}\n */\n this.status = function(batchId, opts) {\n return this.statusWithHttpInfo(batchId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Start batch operation\n * Begin processing a batch operations request.\n * @param {module:model/Body} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Batch} and HTTP response\n */\n this.startWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/batches', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Start batch operation\n * Begin processing a batch operations request.\n * @param {module:model/Body} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Batch}\n */\n this.start = function(body) {\n return this.startWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * CampaignFolders service.\n * @module api/CampaignFoldersApi\n */\n\n/**\n * Constructs a new CampaignFoldersApi. \n * @alias module:api/CampaignFoldersApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete campaign folder\n * Delete a specific campaign folder, and mark all the campaigns in the folder as 'unfiled'.\n * @param {String} folderId The unique id for the campaign folder.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.removeWithHttpInfo = function(folderId) {\n var postBody = null;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaign-folders/{folder_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete campaign folder\n * Delete a specific campaign folder, and mark all the campaigns in the folder as 'unfiled'.\n * @param {String} folderId The unique id for the campaign folder.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.remove = function(folderId) {\n return this.removeWithHttpInfo(folderId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List campaign folders\n * Get all folders used to organize campaigns.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignFolders} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaign-folders', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaign folders\n * Get all folders used to organize campaigns.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignFolders}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get campaign folder\n * Get information about a specific folder used to organize campaigns.\n * @param {String} folderId The unique id for the campaign folder.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignFolder} and HTTP response\n */\n this.getWithHttpInfo = function(folderId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaign-folders/{folder_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get campaign folder\n * Get information about a specific folder used to organize campaigns.\n * @param {String} folderId The unique id for the campaign folder.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignFolder}\n */\n this.get = function(folderId, opts) {\n return this.getWithHttpInfo(folderId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update campaign folder\n * Update a specific folder used to organize campaigns.\n * @param {String} folderId The unique id for the campaign folder.\n * @param {module:model/CampaignFolder2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignFolder} and HTTP response\n */\n this.updateWithHttpInfo = function(folderId, body) {\n var postBody = body;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaign-folders/{folder_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update campaign folder\n * Update a specific folder used to organize campaigns.\n * @param {String} folderId The unique id for the campaign folder.\n * @param {module:model/CampaignFolder2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignFolder}\n */\n this.update = function(folderId, body) {\n return this.updateWithHttpInfo(folderId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add campaign folder\n * Create a new campaign folder.\n * @param {module:model/CampaignFolder1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignFolder} and HTTP response\n */\n this.createWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaign-folders', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add campaign folder\n * Create a new campaign folder.\n * @param {module:model/CampaignFolder1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignFolder}\n */\n this.create = function(body) {\n return this.createWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Campaigns service.\n * @module api/CampaignsApi\n */\n\n/**\n * Constructs a new CampaignsApi. \n * @alias module:api/CampaignsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete campaign\n * Remove a campaign from your Mailchimp account.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.removeWithHttpInfo = function(campaignId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete campaign\n * Remove a campaign from your Mailchimp account.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.remove = function(campaignId) {\n return this.removeWithHttpInfo(campaignId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete campaign feedback message\n * Remove a specific feedback message for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} feedbackId The unique id for the feedback message.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteFeedbackMessageWithHttpInfo = function(campaignId, feedbackId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'feedbackId' is set\n if (feedbackId === undefined || feedbackId === null) {\n throw new Error(\"Missing the required parameter 'feedbackId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'feedback_id': feedbackId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/feedback/{feedback_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete campaign feedback message\n * Remove a specific feedback message for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} feedbackId The unique id for the feedback message.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteFeedbackMessage = function(campaignId, feedbackId) {\n return this.deleteFeedbackMessageWithHttpInfo(campaignId, feedbackId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List campaigns\n * Get all campaigns in an account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.type The campaign type.\n * @param {module:model/String} opts.status The status of the campaign.\n * @param {Date} opts.beforeSendTime Restrict the response to campaigns sent before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceSendTime Restrict the response to campaigns sent after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.beforeCreateTime Restrict the response to campaigns created before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceCreateTime Restrict the response to campaigns created after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.listId The unique id for the list.\n * @param {String} opts.folderId The unique folder id.\n * @param {String} opts.memberId Retrieve campaigns sent to a particular list member. Member ID is The MD5 hash of the lowercase version of the list member’s email address.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2005} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'type': ( opts['type'] ? opts['type'] : opts['type']),\n 'status': ( opts['status'] ? opts['status'] : opts['status']),\n 'before_send_time': ( opts['beforeSendTime'] ? opts['beforeSendTime'] : opts['before_send_time']),\n 'since_send_time': ( opts['sinceSendTime'] ? opts['sinceSendTime'] : opts['since_send_time']),\n 'before_create_time': ( opts['beforeCreateTime'] ? opts['beforeCreateTime'] : opts['before_create_time']),\n 'since_create_time': ( opts['sinceCreateTime'] ? opts['sinceCreateTime'] : opts['since_create_time']),\n 'list_id': ( opts['listId'] ? opts['listId'] : opts['list_id']),\n 'folder_id': ( opts['folderId'] ? opts['folderId'] : opts['folder_id']),\n 'member_id': ( opts['memberId'] ? opts['memberId'] : opts['member_id']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaigns\n * Get all campaigns in an account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.type The campaign type.\n * @param {module:model/String} opts.status The status of the campaign.\n * @param {Date} opts.beforeSendTime Restrict the response to campaigns sent before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceSendTime Restrict the response to campaigns sent after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.beforeCreateTime Restrict the response to campaigns created before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceCreateTime Restrict the response to campaigns created after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.listId The unique id for the list.\n * @param {String} opts.folderId The unique folder id.\n * @param {String} opts.memberId Retrieve campaigns sent to a particular list member. Member ID is The MD5 hash of the lowercase version of the list member’s email address.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2005}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get campaign info\n * Get information about a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Campaign} and HTTP response\n */\n this.getWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get campaign info\n * Get information about a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Campaign}\n */\n this.get = function(campaignId, opts) {\n return this.getWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get campaign content\n * Get the the HTML and plain-text content for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignContent} and HTTP response\n */\n this.getContentWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/content', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get campaign content\n * Get the the HTML and plain-text content for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignContent}\n */\n this.getContent = function(campaignId, opts) {\n return this.getContentWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List campaign feedback\n * Get team feedback while you're working together on a Mailchimp campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignReports} and HTTP response\n */\n this.getFeedbackWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/feedback', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaign feedback\n * Get team feedback while you're working together on a Mailchimp campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignReports}\n */\n this.getFeedback = function(campaignId, opts) {\n return this.getFeedbackWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get campaign feedback message\n * Get a specific feedback message from a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} feedbackId The unique id for the feedback message.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignFeedback2} and HTTP response\n */\n this.getFeedbackMessageWithHttpInfo = function(campaignId, feedbackId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'feedbackId' is set\n if (feedbackId === undefined || feedbackId === null) {\n throw new Error(\"Missing the required parameter 'feedbackId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'feedback_id': feedbackId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/feedback/{feedback_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get campaign feedback message\n * Get a specific feedback message from a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} feedbackId The unique id for the feedback message.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignFeedback2}\n */\n this.getFeedbackMessage = function(campaignId, feedbackId, opts) {\n return this.getFeedbackMessageWithHttpInfo(campaignId, feedbackId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get campaign send checklist\n * Review the send checklist for a campaign, and resolve any issues before sending.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SendChecklist} and HTTP response\n */\n this.getSendChecklistWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/send-checklist', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get campaign send checklist\n * Review the send checklist for a campaign, and resolve any issues before sending.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SendChecklist}\n */\n this.getSendChecklist = function(campaignId, opts) {\n return this.getSendChecklistWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update campaign settings\n * Update some or all of the settings for a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/Campaign2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Campaign} and HTTP response\n */\n this.updateWithHttpInfo = function(campaignId, body) {\n var postBody = body;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update campaign settings\n * Update some or all of the settings for a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/Campaign2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Campaign}\n */\n this.update = function(campaignId, body) {\n return this.updateWithHttpInfo(campaignId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update campaign feedback message\n * Update a specific feedback message for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} feedbackId The unique id for the feedback message.\n * @param {module:model/CampaignFeedback3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignFeedback2} and HTTP response\n */\n this.updateFeedbackMessageWithHttpInfo = function(campaignId, feedbackId, body) {\n var postBody = body;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'feedbackId' is set\n if (feedbackId === undefined || feedbackId === null) {\n throw new Error(\"Missing the required parameter 'feedbackId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'feedback_id': feedbackId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/feedback/{feedback_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update campaign feedback message\n * Update a specific feedback message for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} feedbackId The unique id for the feedback message.\n * @param {module:model/CampaignFeedback3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignFeedback2}\n */\n this.updateFeedbackMessage = function(campaignId, feedbackId, body) {\n return this.updateFeedbackMessageWithHttpInfo(campaignId, feedbackId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add campaign\n * Create a new Mailchimp campaign.\n * @param {module:model/Campaign1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Campaign} and HTTP response\n */\n this.createWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add campaign\n * Create a new Mailchimp campaign.\n * @param {module:model/Campaign1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Campaign}\n */\n this.create = function(body) {\n return this.createWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Cancel campaign\n * Cancel a Regular or Plain-Text Campaign after you send, before all of your recipients receive it. This feature is included with Mailchimp Pro.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.cancelSendWithHttpInfo = function(campaignId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/cancel-send', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Cancel campaign\n * Cancel a Regular or Plain-Text Campaign after you send, before all of your recipients receive it. This feature is included with Mailchimp Pro.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.cancelSend = function(campaignId) {\n return this.cancelSendWithHttpInfo(campaignId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Resend campaign\n * Creates a Resend to Non-Openers version of this campaign. We will also check if this campaign meets the criteria for Resend to Non-Openers campaigns.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Campaign3} and HTTP response\n */\n this.createResendWithHttpInfo = function(campaignId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/create-resend', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Resend campaign\n * Creates a Resend to Non-Openers version of this campaign. We will also check if this campaign meets the criteria for Resend to Non-Openers campaigns.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Campaign3}\n */\n this.createResend = function(campaignId) {\n return this.createResendWithHttpInfo(campaignId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Pause rss campaign\n * Pause an RSS-Driven campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.pauseWithHttpInfo = function(campaignId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/pause', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Pause rss campaign\n * Pause an RSS-Driven campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.pause = function(campaignId) {\n return this.pauseWithHttpInfo(campaignId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Replicate campaign\n * Replicate a campaign in saved or send status.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Campaign3} and HTTP response\n */\n this.replicateWithHttpInfo = function(campaignId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/replicate', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Replicate campaign\n * Replicate a campaign in saved or send status.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Campaign3}\n */\n this.replicate = function(campaignId) {\n return this.replicateWithHttpInfo(campaignId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Resume rss campaign\n * Resume an RSS-Driven campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.resumeWithHttpInfo = function(campaignId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/resume', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Resume rss campaign\n * Resume an RSS-Driven campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.resume = function(campaignId) {\n return this.resumeWithHttpInfo(campaignId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Schedule campaign\n * Schedule a campaign for delivery. If you're using Multivariate Campaigns to test send times or sending RSS Campaigns, use the send action instead.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/Body1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.scheduleWithHttpInfo = function(campaignId, body) {\n var postBody = body;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/schedule', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Schedule campaign\n * Schedule a campaign for delivery. If you're using Multivariate Campaigns to test send times or sending RSS Campaigns, use the send action instead.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/Body1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.schedule = function(campaignId, body) {\n return this.scheduleWithHttpInfo(campaignId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Send campaign\n * Send a Mailchimp campaign. For RSS Campaigns, the campaign will send according to its schedule. All other campaigns will send immediately.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.sendWithHttpInfo = function(campaignId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/send', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Send campaign\n * Send a Mailchimp campaign. For RSS Campaigns, the campaign will send according to its schedule. All other campaigns will send immediately.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.send = function(campaignId) {\n return this.sendWithHttpInfo(campaignId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Send test email\n * Send a test email.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/Body2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.sendTestEmailWithHttpInfo = function(campaignId, body) {\n var postBody = body;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/test', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Send test email\n * Send a test email.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/Body2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.sendTestEmail = function(campaignId, body) {\n return this.sendTestEmailWithHttpInfo(campaignId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Unschedule campaign\n * Unschedule a scheduled campaign that hasn't started sending.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.unscheduleWithHttpInfo = function(campaignId) {\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/actions/unschedule', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Unschedule campaign\n * Unschedule a scheduled campaign that hasn't started sending.\n * @param {String} campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.unschedule = function(campaignId) {\n return this.unscheduleWithHttpInfo(campaignId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add campaign feedback\n * Add feedback on a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/CampaignFeedback1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignFeedback2} and HTTP response\n */\n this.addFeedbackWithHttpInfo = function(campaignId, body) {\n var postBody = body;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/feedback', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add campaign feedback\n * Add feedback on a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/CampaignFeedback1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignFeedback2}\n */\n this.addFeedback = function(campaignId, body) {\n return this.addFeedbackWithHttpInfo(campaignId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Set campaign content\n * Set the content for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/CampaignContent1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignContent} and HTTP response\n */\n this.setContentWithHttpInfo = function(campaignId, body) {\n var postBody = body;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/campaigns/{campaign_id}/content', 'PUT',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Set campaign content\n * Set the content for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {module:model/CampaignContent1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignContent}\n */\n this.setContent = function(campaignId, body) {\n return this.setContentWithHttpInfo(campaignId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * ConnectedSites service.\n * @module api/ConnectedSitesApi\n */\n\n/**\n * Constructs a new ConnectedSitesApi. \n * @alias module:api/ConnectedSitesApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete connected site\n * Remove a connected site from your Mailchimp account.\n * @param {String} connectedSiteId The unique identifier for the site.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.removeWithHttpInfo = function(connectedSiteId) {\n var postBody = null;\n\n // verify the required parameter 'connectedSiteId' is set\n if (connectedSiteId === undefined || connectedSiteId === null) {\n throw new Error(\"Missing the required parameter 'connectedSiteId' when calling \");\n }\n\n var pathParams = {\n 'connected_site_id': connectedSiteId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/connected-sites/{connected_site_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete connected site\n * Remove a connected site from your Mailchimp account.\n * @param {String} connectedSiteId The unique identifier for the site.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.remove = function(connectedSiteId) {\n return this.removeWithHttpInfo(connectedSiteId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List connected sites\n * Get all connected sites in an account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ConnectedSites} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/connected-sites', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List connected sites\n * Get all connected sites in an account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ConnectedSites}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get connected site\n * Get information about a specific connected site.\n * @param {String} connectedSiteId The unique identifier for the site.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ConnectedSite} and HTTP response\n */\n this.getWithHttpInfo = function(connectedSiteId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'connectedSiteId' is set\n if (connectedSiteId === undefined || connectedSiteId === null) {\n throw new Error(\"Missing the required parameter 'connectedSiteId' when calling \");\n }\n\n var pathParams = {\n 'connected_site_id': connectedSiteId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/connected-sites/{connected_site_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get connected site\n * Get information about a specific connected site.\n * @param {String} connectedSiteId The unique identifier for the site.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ConnectedSite}\n */\n this.get = function(connectedSiteId, opts) {\n return this.getWithHttpInfo(connectedSiteId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add connected site\n * Create a new Mailchimp connected site.\n * @param {module:model/ConnectedSite1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ConnectedSite} and HTTP response\n */\n this.createWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/connected-sites', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add connected site\n * Create a new Mailchimp connected site.\n * @param {module:model/ConnectedSite1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ConnectedSite}\n */\n this.create = function(body) {\n return this.createWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Verify connected site script\n * Verify that the connected sites script has been installed, either via the script URL or fragment.\n * @param {String} connectedSiteId The unique identifier for the site.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.verifyScriptInstallationWithHttpInfo = function(connectedSiteId) {\n var postBody = null;\n\n // verify the required parameter 'connectedSiteId' is set\n if (connectedSiteId === undefined || connectedSiteId === null) {\n throw new Error(\"Missing the required parameter 'connectedSiteId' when calling \");\n }\n\n var pathParams = {\n 'connected_site_id': connectedSiteId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/connected-sites/{connected_site_id}/actions/verify-script-installation', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Verify connected site script\n * Verify that the connected sites script has been installed, either via the script URL or fragment.\n * @param {String} connectedSiteId The unique identifier for the site.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.verifyScriptInstallation = function(connectedSiteId) {\n return this.verifyScriptInstallationWithHttpInfo(connectedSiteId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Conversations service.\n * @module api/ConversationsApi\n */\n\n/**\n * Constructs a new ConversationsApi. \n * @alias module:api/ConversationsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * List conversations\n * Get a list of conversations for the account. Conversations has been deprecated in favor of Inbox and these endpoints don't include Inbox data. Past Conversations are still available via this endpoint, but new campaign replies and other Inbox messages aren’t available using this endpoint.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.hasUnreadMessages Whether the conversation has any unread messages.\n * @param {String} opts.listId The unique id for the list.\n * @param {String} opts.campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TrackedConversations} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'has_unread_messages': ( opts['hasUnreadMessages'] ? opts['hasUnreadMessages'] : opts['has_unread_messages']),\n 'list_id': ( opts['listId'] ? opts['listId'] : opts['list_id']),\n 'campaign_id': ( opts['campaignId'] ? opts['campaignId'] : opts['campaign_id'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/conversations', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List conversations\n * Get a list of conversations for the account. Conversations has been deprecated in favor of Inbox and these endpoints don't include Inbox data. Past Conversations are still available via this endpoint, but new campaign replies and other Inbox messages aren’t available using this endpoint.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.hasUnreadMessages Whether the conversation has any unread messages.\n * @param {String} opts.listId The unique id for the list.\n * @param {String} opts.campaignId The unique id for the campaign.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TrackedConversations}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get conversation\n * Get details about an individual conversation. Conversations has been deprecated in favor of Inbox and these endpoints don't include Inbox data. Past Conversations are still available via this endpoint, but new campaign replies and other Inbox messages aren’t available using this endpoint.\n * @param {String} conversationId The unique id for the conversation.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Conversation} and HTTP response\n */\n this.getWithHttpInfo = function(conversationId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'conversationId' is set\n if (conversationId === undefined || conversationId === null) {\n throw new Error(\"Missing the required parameter 'conversationId' when calling \");\n }\n\n var pathParams = {\n 'conversation_id': conversationId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/conversations/{conversation_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get conversation\n * Get details about an individual conversation. Conversations has been deprecated in favor of Inbox and these endpoints don't include Inbox data. Past Conversations are still available via this endpoint, but new campaign replies and other Inbox messages aren’t available using this endpoint.\n * @param {String} conversationId The unique id for the conversation.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Conversation}\n */\n this.get = function(conversationId, opts) {\n return this.getWithHttpInfo(conversationId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List messages\n * Get messages from a specific conversation. Conversations has been deprecated in favor of Inbox and these endpoints don't include Inbox data. Past Conversations are still available via this endpoint, but new campaign replies and other Inbox messages aren’t available using this endpoint.\n * @param {String} conversationId The unique id for the conversation.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {module:model/String} opts.isRead Whether a conversation message has been marked as read.\n * @param {Date} opts.beforeTimestamp Restrict the response to messages created before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceTimestamp Restrict the response to messages created after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CollectionOfConversationMessages} and HTTP response\n */\n this.getConversationMessagesWithHttpInfo = function(conversationId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'conversationId' is set\n if (conversationId === undefined || conversationId === null) {\n throw new Error(\"Missing the required parameter 'conversationId' when calling \");\n }\n\n var pathParams = {\n 'conversation_id': conversationId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'is_read': ( opts['isRead'] ? opts['isRead'] : opts['is_read']),\n 'before_timestamp': ( opts['beforeTimestamp'] ? opts['beforeTimestamp'] : opts['before_timestamp']),\n 'since_timestamp': ( opts['sinceTimestamp'] ? opts['sinceTimestamp'] : opts['since_timestamp'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/conversations/{conversation_id}/messages', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List messages\n * Get messages from a specific conversation. Conversations has been deprecated in favor of Inbox and these endpoints don't include Inbox data. Past Conversations are still available via this endpoint, but new campaign replies and other Inbox messages aren’t available using this endpoint.\n * @param {String} conversationId The unique id for the conversation.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {module:model/String} opts.isRead Whether a conversation message has been marked as read.\n * @param {Date} opts.beforeTimestamp Restrict the response to messages created before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceTimestamp Restrict the response to messages created after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CollectionOfConversationMessages}\n */\n this.getConversationMessages = function(conversationId, opts) {\n return this.getConversationMessagesWithHttpInfo(conversationId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get message\n * Get an individual message in a conversation. Conversations has been deprecated in favor of Inbox and these endpoints don't include Inbox data. Past Conversations are still available via this endpoint, but new campaign replies and other Inbox messages aren’t available using this endpoint.\n * @param {String} conversationId The unique id for the conversation.\n * @param {String} messageId The unique id for the conversation message.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ConversationMessage} and HTTP response\n */\n this.getConversationMessageWithHttpInfo = function(conversationId, messageId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'conversationId' is set\n if (conversationId === undefined || conversationId === null) {\n throw new Error(\"Missing the required parameter 'conversationId' when calling \");\n }\n\n // verify the required parameter 'messageId' is set\n if (messageId === undefined || messageId === null) {\n throw new Error(\"Missing the required parameter 'messageId' when calling \");\n }\n\n var pathParams = {\n 'conversation_id': conversationId,\n 'message_id': messageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/conversations/{conversation_id}/messages/{message_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get message\n * Get an individual message in a conversation. Conversations has been deprecated in favor of Inbox and these endpoints don't include Inbox data. Past Conversations are still available via this endpoint, but new campaign replies and other Inbox messages aren’t available using this endpoint.\n * @param {String} conversationId The unique id for the conversation.\n * @param {String} messageId The unique id for the conversation message.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ConversationMessage}\n */\n this.getConversationMessage = function(conversationId, messageId, opts) {\n return this.getConversationMessageWithHttpInfo(conversationId, messageId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * CustomerJourneys service.\n * @module api/CustomerJourneysApi\n */\n\n/**\n * Constructs a new CustomerJourneysApi. \n * @alias module:api/CustomerJourneysApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Customer Journeys API trigger for a contact\n * A step trigger in a Customer Journey. To use it, create a starting point or step from the Customer Journey builder in the app using the Customer Journeys API condition. We’ll provide a url during the process that includes the {journey_id} and {step_id}. You’ll then be able to use this endpoint to trigger the condition for the posted contact.\n * @param {Number} journeyId The id for the Journey.\n * @param {Number} stepId The id for the Step.\n * @param {module:model/SubscriberInCustomerJourneysAudience} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link Object} and HTTP response\n */\n this.triggerWithHttpInfo = function(journeyId, stepId, body) {\n var postBody = body;\n\n // verify the required parameter 'journeyId' is set\n if (journeyId === undefined || journeyId === null) {\n throw new Error(\"Missing the required parameter 'journeyId' when calling \");\n }\n\n // verify the required parameter 'stepId' is set\n if (stepId === undefined || stepId === null) {\n throw new Error(\"Missing the required parameter 'stepId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'journey_id': journeyId,\n 'step_id': stepId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/customer-journeys/journeys/{journey_id}/steps/{step_id}/actions/trigger', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Customer Journeys API trigger for a contact\n * A step trigger in a Customer Journey. To use it, create a starting point or step from the Customer Journey builder in the app using the Customer Journeys API condition. We’ll provide a url during the process that includes the {journey_id} and {step_id}. You’ll then be able to use this endpoint to trigger the condition for the posted contact.\n * @param {Number} journeyId The id for the Journey.\n * @param {Number} stepId The id for the Step.\n * @param {module:model/SubscriberInCustomerJourneysAudience} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link Object}\n */\n this.trigger = function(journeyId, stepId, body) {\n return this.triggerWithHttpInfo(journeyId, stepId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Ecommerce service.\n * @module api/EcommerceApi\n */\n\n/**\n * Constructs a new EcommerceApi. \n * @alias module:api/EcommerceApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete store\n * Delete a store. Deleting a store will also delete any associated subresources, including Customers, Orders, Products, and Carts.\n * @param {String} storeId The store id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link Object} and HTTP response\n */\n this.deleteStoreWithHttpInfo = function(storeId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete store\n * Delete a store. Deleting a store will also delete any associated subresources, including Customers, Orders, Products, and Carts.\n * @param {String} storeId The store id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link Object}\n */\n this.deleteStore = function(storeId) {\n return this.deleteStoreWithHttpInfo(storeId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete cart\n * Delete a cart.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteStoreCartWithHttpInfo = function(storeId, cartId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'cartId' is set\n if (cartId === undefined || cartId === null) {\n throw new Error(\"Missing the required parameter 'cartId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'cart_id': cartId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts/{cart_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete cart\n * Delete a cart.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteStoreCart = function(storeId, cartId) {\n return this.deleteStoreCartWithHttpInfo(storeId, cartId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete cart line item\n * Delete a specific cart line item.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {String} lineId The id for the line item of a cart.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteCartLineItemWithHttpInfo = function(storeId, cartId, lineId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'cartId' is set\n if (cartId === undefined || cartId === null) {\n throw new Error(\"Missing the required parameter 'cartId' when calling \");\n }\n\n // verify the required parameter 'lineId' is set\n if (lineId === undefined || lineId === null) {\n throw new Error(\"Missing the required parameter 'lineId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'cart_id': cartId,\n 'line_id': lineId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts/{cart_id}/lines/{line_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete cart line item\n * Delete a specific cart line item.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {String} lineId The id for the line item of a cart.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteCartLineItem = function(storeId, cartId, lineId) {\n return this.deleteCartLineItemWithHttpInfo(storeId, cartId, lineId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete customer\n * Delete a customer from a store.\n * @param {String} storeId The store id.\n * @param {String} customerId The id for the customer of a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteStoreCustomerWithHttpInfo = function(storeId, customerId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'customerId' is set\n if (customerId === undefined || customerId === null) {\n throw new Error(\"Missing the required parameter 'customerId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'customer_id': customerId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/customers/{customer_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete customer\n * Delete a customer from a store.\n * @param {String} storeId The store id.\n * @param {String} customerId The id for the customer of a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteStoreCustomer = function(storeId, customerId) {\n return this.deleteStoreCustomerWithHttpInfo(storeId, customerId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete order\n * Delete an order.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteOrderWithHttpInfo = function(storeId, orderId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'orderId' is set\n if (orderId === undefined || orderId === null) {\n throw new Error(\"Missing the required parameter 'orderId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'order_id': orderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders/{order_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete order\n * Delete an order.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteOrder = function(storeId, orderId) {\n return this.deleteOrderWithHttpInfo(storeId, orderId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete order line item\n * Delete a specific order line item.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {String} lineId The id for the line item of an order.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteOrderLineItemWithHttpInfo = function(storeId, orderId, lineId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'orderId' is set\n if (orderId === undefined || orderId === null) {\n throw new Error(\"Missing the required parameter 'orderId' when calling \");\n }\n\n // verify the required parameter 'lineId' is set\n if (lineId === undefined || lineId === null) {\n throw new Error(\"Missing the required parameter 'lineId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'order_id': orderId,\n 'line_id': lineId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders/{order_id}/lines/{line_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete order line item\n * Delete a specific order line item.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {String} lineId The id for the line item of an order.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteOrderLineItem = function(storeId, orderId, lineId) {\n return this.deleteOrderLineItemWithHttpInfo(storeId, orderId, lineId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete product\n * Delete a product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteStoreProductWithHttpInfo = function(storeId, productId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete product\n * Delete a product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteStoreProduct = function(storeId, productId) {\n return this.deleteStoreProductWithHttpInfo(storeId, productId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete product image\n * Delete a product image.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} imageId The id for the product image.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteProductImageWithHttpInfo = function(storeId, productId, imageId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'imageId' is set\n if (imageId === undefined || imageId === null) {\n throw new Error(\"Missing the required parameter 'imageId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId,\n 'image_id': imageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/images/{image_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete product image\n * Delete a product image.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} imageId The id for the product image.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteProductImage = function(storeId, productId, imageId) {\n return this.deleteProductImageWithHttpInfo(storeId, productId, imageId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete product variant\n * Delete a product variant.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} variantId The id for the product variant.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteProductVariantWithHttpInfo = function(storeId, productId, variantId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'variantId' is set\n if (variantId === undefined || variantId === null) {\n throw new Error(\"Missing the required parameter 'variantId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId,\n 'variant_id': variantId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/variants/{variant_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete product variant\n * Delete a product variant.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} variantId The id for the product variant.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteProductVariant = function(storeId, productId, variantId) {\n return this.deleteProductVariantWithHttpInfo(storeId, productId, variantId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete promo code\n * Delete a promo code from a store.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {String} promoCodeId The id for the promo code of a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deletePromoCodeWithHttpInfo = function(storeId, promoRuleId, promoCodeId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'promoRuleId' is set\n if (promoRuleId === undefined || promoRuleId === null) {\n throw new Error(\"Missing the required parameter 'promoRuleId' when calling \");\n }\n\n // verify the required parameter 'promoCodeId' is set\n if (promoCodeId === undefined || promoCodeId === null) {\n throw new Error(\"Missing the required parameter 'promoCodeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'promo_rule_id': promoRuleId,\n 'promo_code_id': promoCodeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules/{promo_rule_id}/promo-codes/{promo_code_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete promo code\n * Delete a promo code from a store.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {String} promoCodeId The id for the promo code of a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deletePromoCode = function(storeId, promoRuleId, promoCodeId) {\n return this.deletePromoCodeWithHttpInfo(storeId, promoRuleId, promoCodeId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete promo rule\n * Delete a promo rule from a store.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deletePromoRuleWithHttpInfo = function(storeId, promoRuleId) {\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'promoRuleId' is set\n if (promoRuleId === undefined || promoRuleId === null) {\n throw new Error(\"Missing the required parameter 'promoRuleId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'promo_rule_id': promoRuleId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules/{promo_rule_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete promo rule\n * Delete a promo rule from a store.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deletePromoRule = function(storeId, promoRuleId) {\n return this.deletePromoRuleWithHttpInfo(storeId, promoRuleId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List account orders\n * Get information about an account's orders.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.campaignId Restrict results to orders with a specific `campaign_id` value.\n * @param {String} opts.outreachId Restrict results to orders with a specific `outreach_id` value.\n * @param {String} opts.customerId Restrict results to orders made by a specific customer.\n * @param {Boolean} opts.hasOutreach Restrict results to orders that have an outreach attached. For example, an email campaign or Facebook ad.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Orders} and HTTP response\n */\n this.ordersWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'campaign_id': ( opts['campaignId'] ? opts['campaignId'] : opts['campaign_id']),\n 'outreach_id': ( opts['outreachId'] ? opts['outreachId'] : opts['outreach_id']),\n 'customer_id': ( opts['customerId'] ? opts['customerId'] : opts['customer_id']),\n 'has_outreach': ( opts['hasOutreach'] ? opts['hasOutreach'] : opts['has_outreach'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/orders', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List account orders\n * Get information about an account's orders.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.campaignId Restrict results to orders with a specific `campaign_id` value.\n * @param {String} opts.outreachId Restrict results to orders with a specific `outreach_id` value.\n * @param {String} opts.customerId Restrict results to orders made by a specific customer.\n * @param {Boolean} opts.hasOutreach Restrict results to orders that have an outreach attached. For example, an email campaign or Facebook ad.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Orders}\n */\n this.orders = function(opts) {\n return this.ordersWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List stores\n * Get information about all stores in the account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceStores} and HTTP response\n */\n this.storesWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List stores\n * Get information about all stores in the account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceStores}\n */\n this.stores = function(opts) {\n return this.storesWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get store info\n * Get information about a specific store.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceStore} and HTTP response\n */\n this.getStoreWithHttpInfo = function(storeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get store info\n * Get information about a specific store.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceStore}\n */\n this.getStore = function(storeId, opts) {\n return this.getStoreWithHttpInfo(storeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List carts\n * Get information about a store's carts.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Carts} and HTTP response\n */\n this.getStoreCartsWithHttpInfo = function(storeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List carts\n * Get information about a store's carts.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Carts}\n */\n this.getStoreCarts = function(storeId, opts) {\n return this.getStoreCartsWithHttpInfo(storeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get cart info\n * Get information about a specific cart.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCart} and HTTP response\n */\n this.getStoreCartWithHttpInfo = function(storeId, cartId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'cartId' is set\n if (cartId === undefined || cartId === null) {\n throw new Error(\"Missing the required parameter 'cartId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'cart_id': cartId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts/{cart_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get cart info\n * Get information about a specific cart.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCart}\n */\n this.getStoreCart = function(storeId, cartId, opts) {\n return this.getStoreCartWithHttpInfo(storeId, cartId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List cart line items\n * Get information about a cart's line items.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CartLines} and HTTP response\n */\n this.getAllCartLineItemsWithHttpInfo = function(storeId, cartId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'cartId' is set\n if (cartId === undefined || cartId === null) {\n throw new Error(\"Missing the required parameter 'cartId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'cart_id': cartId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts/{cart_id}/lines', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List cart line items\n * Get information about a cart's line items.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CartLines}\n */\n this.getAllCartLineItems = function(storeId, cartId, opts) {\n return this.getAllCartLineItemsWithHttpInfo(storeId, cartId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get cart line item\n * Get information about a specific cart line item.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {String} lineId The id for the line item of a cart.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCartLineItem} and HTTP response\n */\n this.getCartLineItemWithHttpInfo = function(storeId, cartId, lineId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'cartId' is set\n if (cartId === undefined || cartId === null) {\n throw new Error(\"Missing the required parameter 'cartId' when calling \");\n }\n\n // verify the required parameter 'lineId' is set\n if (lineId === undefined || lineId === null) {\n throw new Error(\"Missing the required parameter 'lineId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'cart_id': cartId,\n 'line_id': lineId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts/{cart_id}/lines/{line_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get cart line item\n * Get information about a specific cart line item.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {String} lineId The id for the line item of a cart.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCartLineItem}\n */\n this.getCartLineItem = function(storeId, cartId, lineId, opts) {\n return this.getCartLineItemWithHttpInfo(storeId, cartId, lineId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List customers\n * Get information about a store's customers.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.emailAddress Restrict the response to customers with the email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Customers} and HTTP response\n */\n this.getAllStoreCustomersWithHttpInfo = function(storeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'email_address': ( opts['emailAddress'] ? opts['emailAddress'] : opts['email_address'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/customers', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List customers\n * Get information about a store's customers.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.emailAddress Restrict the response to customers with the email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Customers}\n */\n this.getAllStoreCustomers = function(storeId, opts) {\n return this.getAllStoreCustomersWithHttpInfo(storeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get customer info\n * Get information about a specific customer.\n * @param {String} storeId The store id.\n * @param {String} customerId The id for the customer of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCustomer} and HTTP response\n */\n this.getStoreCustomerWithHttpInfo = function(storeId, customerId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'customerId' is set\n if (customerId === undefined || customerId === null) {\n throw new Error(\"Missing the required parameter 'customerId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'customer_id': customerId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/customers/{customer_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get customer info\n * Get information about a specific customer.\n * @param {String} storeId The store id.\n * @param {String} customerId The id for the customer of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCustomer}\n */\n this.getStoreCustomer = function(storeId, customerId, opts) {\n return this.getStoreCustomerWithHttpInfo(storeId, customerId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List orders\n * Get information about a store's orders.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.customerId Restrict results to orders made by a specific customer.\n * @param {Boolean} opts.hasOutreach Restrict results to orders that have an outreach attached. For example, an email campaign or Facebook ad.\n * @param {String} opts.campaignId Restrict results to orders with a specific `campaign_id` value.\n * @param {String} opts.outreachId Restrict results to orders with a specific `outreach_id` value.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Orders1} and HTTP response\n */\n this.getStoreOrdersWithHttpInfo = function(storeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'customer_id': ( opts['customerId'] ? opts['customerId'] : opts['customer_id']),\n 'has_outreach': ( opts['hasOutreach'] ? opts['hasOutreach'] : opts['has_outreach']),\n 'campaign_id': ( opts['campaignId'] ? opts['campaignId'] : opts['campaign_id']),\n 'outreach_id': ( opts['outreachId'] ? opts['outreachId'] : opts['outreach_id'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List orders\n * Get information about a store's orders.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.customerId Restrict results to orders made by a specific customer.\n * @param {Boolean} opts.hasOutreach Restrict results to orders that have an outreach attached. For example, an email campaign or Facebook ad.\n * @param {String} opts.campaignId Restrict results to orders with a specific `campaign_id` value.\n * @param {String} opts.outreachId Restrict results to orders with a specific `outreach_id` value.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Orders1}\n */\n this.getStoreOrders = function(storeId, opts) {\n return this.getStoreOrdersWithHttpInfo(storeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get order info\n * Get information about a specific order.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceOrder} and HTTP response\n */\n this.getOrderWithHttpInfo = function(storeId, orderId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'orderId' is set\n if (orderId === undefined || orderId === null) {\n throw new Error(\"Missing the required parameter 'orderId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'order_id': orderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders/{order_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get order info\n * Get information about a specific order.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceOrder}\n */\n this.getOrder = function(storeId, orderId, opts) {\n return this.getOrderWithHttpInfo(storeId, orderId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List order line items\n * Get information about an order's line items.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/OrderLines} and HTTP response\n */\n this.getAllOrderLineItemsWithHttpInfo = function(storeId, orderId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'orderId' is set\n if (orderId === undefined || orderId === null) {\n throw new Error(\"Missing the required parameter 'orderId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'order_id': orderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders/{order_id}/lines', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List order line items\n * Get information about an order's line items.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/OrderLines}\n */\n this.getAllOrderLineItems = function(storeId, orderId, opts) {\n return this.getAllOrderLineItemsWithHttpInfo(storeId, orderId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get order line item\n * Get information about a specific order line item.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {String} lineId The id for the line item of an order.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceOrderLineItem} and HTTP response\n */\n this.getOrderLineItemWithHttpInfo = function(storeId, orderId, lineId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'orderId' is set\n if (orderId === undefined || orderId === null) {\n throw new Error(\"Missing the required parameter 'orderId' when calling \");\n }\n\n // verify the required parameter 'lineId' is set\n if (lineId === undefined || lineId === null) {\n throw new Error(\"Missing the required parameter 'lineId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'order_id': orderId,\n 'line_id': lineId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders/{order_id}/lines/{line_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get order line item\n * Get information about a specific order line item.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {String} lineId The id for the line item of an order.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceOrderLineItem}\n */\n this.getOrderLineItem = function(storeId, orderId, lineId, opts) {\n return this.getOrderLineItemWithHttpInfo(storeId, orderId, lineId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List product\n * Get information about a store's products.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Products} and HTTP response\n */\n this.getAllStoreProductsWithHttpInfo = function(storeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List product\n * Get information about a store's products.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Products}\n */\n this.getAllStoreProducts = function(storeId, opts) {\n return this.getAllStoreProductsWithHttpInfo(storeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get product info\n * Get information about a specific product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProduct} and HTTP response\n */\n this.getStoreProductWithHttpInfo = function(storeId, productId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get product info\n * Get information about a specific product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProduct}\n */\n this.getStoreProduct = function(storeId, productId, opts) {\n return this.getStoreProductWithHttpInfo(storeId, productId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List product images\n * Get information about a product's images.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductImages} and HTTP response\n */\n this.getProductImagesWithHttpInfo = function(storeId, productId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/images', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List product images\n * Get information about a product's images.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductImages}\n */\n this.getProductImages = function(storeId, productId, opts) {\n return this.getProductImagesWithHttpInfo(storeId, productId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get product image info\n * Get information about a specific product image.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} imageId The id for the product image.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductImage} and HTTP response\n */\n this.getProductImageWithHttpInfo = function(storeId, productId, imageId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'imageId' is set\n if (imageId === undefined || imageId === null) {\n throw new Error(\"Missing the required parameter 'imageId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId,\n 'image_id': imageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/images/{image_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get product image info\n * Get information about a specific product image.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} imageId The id for the product image.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductImage}\n */\n this.getProductImage = function(storeId, productId, imageId, opts) {\n return this.getProductImageWithHttpInfo(storeId, productId, imageId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List product variants\n * Get information about a product's variants.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductVariants} and HTTP response\n */\n this.getProductVariantsWithHttpInfo = function(storeId, productId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/variants', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List product variants\n * Get information about a product's variants.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductVariants}\n */\n this.getProductVariants = function(storeId, productId, opts) {\n return this.getProductVariantsWithHttpInfo(storeId, productId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get product variant info\n * Get information about a specific product variant.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} variantId The id for the product variant.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductVariant} and HTTP response\n */\n this.getProductVariantWithHttpInfo = function(storeId, productId, variantId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'variantId' is set\n if (variantId === undefined || variantId === null) {\n throw new Error(\"Missing the required parameter 'variantId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId,\n 'variant_id': variantId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/variants/{variant_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get product variant info\n * Get information about a specific product variant.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} variantId The id for the product variant.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductVariant}\n */\n this.getProductVariant = function(storeId, productId, variantId, opts) {\n return this.getProductVariantWithHttpInfo(storeId, productId, variantId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List promo codes\n * Get information about a store's promo codes.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/PromoCodes} and HTTP response\n */\n this.getPromoCodesWithHttpInfo = function(promoRuleId, storeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'promoRuleId' is set\n if (promoRuleId === undefined || promoRuleId === null) {\n throw new Error(\"Missing the required parameter 'promoRuleId' when calling \");\n }\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n var pathParams = {\n 'promo_rule_id': promoRuleId,\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules/{promo_rule_id}/promo-codes', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List promo codes\n * Get information about a store's promo codes.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/PromoCodes}\n */\n this.getPromoCodes = function(promoRuleId, storeId, opts) {\n return this.getPromoCodesWithHttpInfo(promoRuleId, storeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get promo code\n * Get information about a specific promo code.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {String} promoCodeId The id for the promo code of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommercePromoCode} and HTTP response\n */\n this.getPromoCodeWithHttpInfo = function(storeId, promoRuleId, promoCodeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'promoRuleId' is set\n if (promoRuleId === undefined || promoRuleId === null) {\n throw new Error(\"Missing the required parameter 'promoRuleId' when calling \");\n }\n\n // verify the required parameter 'promoCodeId' is set\n if (promoCodeId === undefined || promoCodeId === null) {\n throw new Error(\"Missing the required parameter 'promoCodeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'promo_rule_id': promoRuleId,\n 'promo_code_id': promoCodeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules/{promo_rule_id}/promo-codes/{promo_code_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get promo code\n * Get information about a specific promo code.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {String} promoCodeId The id for the promo code of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommercePromoCode}\n */\n this.getPromoCode = function(storeId, promoRuleId, promoCodeId, opts) {\n return this.getPromoCodeWithHttpInfo(storeId, promoRuleId, promoCodeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List promo rules\n * Get information about a store's promo rules.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/PromoRules} and HTTP response\n */\n this.listPromoRulesWithHttpInfo = function(storeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List promo rules\n * Get information about a store's promo rules.\n * @param {String} storeId The store id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/PromoRules}\n */\n this.listPromoRules = function(storeId, opts) {\n return this.listPromoRulesWithHttpInfo(storeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get promo rule\n * Get information about a specific promo rule.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommercePromoRule} and HTTP response\n */\n this.getPromoRuleWithHttpInfo = function(storeId, promoRuleId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'promoRuleId' is set\n if (promoRuleId === undefined || promoRuleId === null) {\n throw new Error(\"Missing the required parameter 'promoRuleId' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'promo_rule_id': promoRuleId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules/{promo_rule_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get promo rule\n * Get information about a specific promo rule.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommercePromoRule}\n */\n this.getPromoRule = function(storeId, promoRuleId, opts) {\n return this.getPromoRuleWithHttpInfo(storeId, promoRuleId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update store\n * Update a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceStore2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceStore} and HTTP response\n */\n this.updateStoreWithHttpInfo = function(storeId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update store\n * Update a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceStore2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceStore}\n */\n this.updateStore = function(storeId, body) {\n return this.updateStoreWithHttpInfo(storeId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update cart\n * Update a specific cart.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {module:model/EcommerceCart2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCart} and HTTP response\n */\n this.updateStoreCartWithHttpInfo = function(storeId, cartId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'cartId' is set\n if (cartId === undefined || cartId === null) {\n throw new Error(\"Missing the required parameter 'cartId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'cart_id': cartId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts/{cart_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update cart\n * Update a specific cart.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {module:model/EcommerceCart2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCart}\n */\n this.updateStoreCart = function(storeId, cartId, body) {\n return this.updateStoreCartWithHttpInfo(storeId, cartId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update cart line item\n * Update a specific cart line item.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {String} lineId The id for the line item of a cart.\n * @param {module:model/EcommerceCartLineItem4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCartLineItem} and HTTP response\n */\n this.updateCartLineItemWithHttpInfo = function(storeId, cartId, lineId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'cartId' is set\n if (cartId === undefined || cartId === null) {\n throw new Error(\"Missing the required parameter 'cartId' when calling \");\n }\n\n // verify the required parameter 'lineId' is set\n if (lineId === undefined || lineId === null) {\n throw new Error(\"Missing the required parameter 'lineId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'cart_id': cartId,\n 'line_id': lineId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts/{cart_id}/lines/{line_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update cart line item\n * Update a specific cart line item.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {String} lineId The id for the line item of a cart.\n * @param {module:model/EcommerceCartLineItem4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCartLineItem}\n */\n this.updateCartLineItem = function(storeId, cartId, lineId, body) {\n return this.updateCartLineItemWithHttpInfo(storeId, cartId, lineId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update customer\n * Update a customer.\n * @param {String} storeId The store id.\n * @param {String} customerId The id for the customer of a store.\n * @param {module:model/EcommerceCustomer5} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCustomer} and HTTP response\n */\n this.updateStoreCustomerWithHttpInfo = function(storeId, customerId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'customerId' is set\n if (customerId === undefined || customerId === null) {\n throw new Error(\"Missing the required parameter 'customerId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'customer_id': customerId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/customers/{customer_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update customer\n * Update a customer.\n * @param {String} storeId The store id.\n * @param {String} customerId The id for the customer of a store.\n * @param {module:model/EcommerceCustomer5} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCustomer}\n */\n this.updateStoreCustomer = function(storeId, customerId, body) {\n return this.updateStoreCustomerWithHttpInfo(storeId, customerId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update order\n * Update a specific order.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {module:model/EcommerceOrder2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceOrder} and HTTP response\n */\n this.updateOrderWithHttpInfo = function(storeId, orderId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'orderId' is set\n if (orderId === undefined || orderId === null) {\n throw new Error(\"Missing the required parameter 'orderId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'order_id': orderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders/{order_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update order\n * Update a specific order.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {module:model/EcommerceOrder2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceOrder}\n */\n this.updateOrder = function(storeId, orderId, body) {\n return this.updateOrderWithHttpInfo(storeId, orderId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update order line item\n * Update a specific order line item.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {String} lineId The id for the line item of an order.\n * @param {module:model/EcommerceOrderLineItem4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceOrderLineItem} and HTTP response\n */\n this.updateOrderLineItemWithHttpInfo = function(storeId, orderId, lineId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'orderId' is set\n if (orderId === undefined || orderId === null) {\n throw new Error(\"Missing the required parameter 'orderId' when calling \");\n }\n\n // verify the required parameter 'lineId' is set\n if (lineId === undefined || lineId === null) {\n throw new Error(\"Missing the required parameter 'lineId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'order_id': orderId,\n 'line_id': lineId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders/{order_id}/lines/{line_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update order line item\n * Update a specific order line item.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {String} lineId The id for the line item of an order.\n * @param {module:model/EcommerceOrderLineItem4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceOrderLineItem}\n */\n this.updateOrderLineItem = function(storeId, orderId, lineId, body) {\n return this.updateOrderLineItemWithHttpInfo(storeId, orderId, lineId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update product\n * Update a specific product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {module:model/EcommerceProduct2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProduct} and HTTP response\n */\n this.updateStoreProductWithHttpInfo = function(storeId, productId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update product\n * Update a specific product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {module:model/EcommerceProduct2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProduct}\n */\n this.updateStoreProduct = function(storeId, productId, body) {\n return this.updateStoreProductWithHttpInfo(storeId, productId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update product image\n * Update a product image.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} imageId The id for the product image.\n * @param {module:model/EcommerceProductImage4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductImage} and HTTP response\n */\n this.updateProductImageWithHttpInfo = function(storeId, productId, imageId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'imageId' is set\n if (imageId === undefined || imageId === null) {\n throw new Error(\"Missing the required parameter 'imageId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId,\n 'image_id': imageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/images/{image_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update product image\n * Update a product image.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} imageId The id for the product image.\n * @param {module:model/EcommerceProductImage4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductImage}\n */\n this.updateProductImage = function(storeId, productId, imageId, body) {\n return this.updateProductImageWithHttpInfo(storeId, productId, imageId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update product variant\n * Update a product variant.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} variantId The id for the product variant.\n * @param {module:model/EcommerceProductVariant5} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductVariant} and HTTP response\n */\n this.updateProductVariantWithHttpInfo = function(storeId, productId, variantId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'variantId' is set\n if (variantId === undefined || variantId === null) {\n throw new Error(\"Missing the required parameter 'variantId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId,\n 'variant_id': variantId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/variants/{variant_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update product variant\n * Update a product variant.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} variantId The id for the product variant.\n * @param {module:model/EcommerceProductVariant5} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductVariant}\n */\n this.updateProductVariant = function(storeId, productId, variantId, body) {\n return this.updateProductVariantWithHttpInfo(storeId, productId, variantId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update promo code\n * Update a promo code.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {String} promoCodeId The id for the promo code of a store.\n * @param {module:model/EcommercePromoCode2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommercePromoCode} and HTTP response\n */\n this.updatePromoCodeWithHttpInfo = function(storeId, promoRuleId, promoCodeId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'promoRuleId' is set\n if (promoRuleId === undefined || promoRuleId === null) {\n throw new Error(\"Missing the required parameter 'promoRuleId' when calling \");\n }\n\n // verify the required parameter 'promoCodeId' is set\n if (promoCodeId === undefined || promoCodeId === null) {\n throw new Error(\"Missing the required parameter 'promoCodeId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'promo_rule_id': promoRuleId,\n 'promo_code_id': promoCodeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules/{promo_rule_id}/promo-codes/{promo_code_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update promo code\n * Update a promo code.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {String} promoCodeId The id for the promo code of a store.\n * @param {module:model/EcommercePromoCode2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommercePromoCode}\n */\n this.updatePromoCode = function(storeId, promoRuleId, promoCodeId, body) {\n return this.updatePromoCodeWithHttpInfo(storeId, promoRuleId, promoCodeId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update promo rule\n * Update a promo rule.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {module:model/EcommercePromoRule2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommercePromoRule} and HTTP response\n */\n this.updatePromoRuleWithHttpInfo = function(storeId, promoRuleId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'promoRuleId' is set\n if (promoRuleId === undefined || promoRuleId === null) {\n throw new Error(\"Missing the required parameter 'promoRuleId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'promo_rule_id': promoRuleId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules/{promo_rule_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update promo rule\n * Update a promo rule.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {module:model/EcommercePromoRule2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommercePromoRule}\n */\n this.updatePromoRule = function(storeId, promoRuleId, body) {\n return this.updatePromoRuleWithHttpInfo(storeId, promoRuleId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add store\n * Add a new store to your Mailchimp account.\n * @param {module:model/EcommerceStore1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceStore} and HTTP response\n */\n this.addStoreWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add store\n * Add a new store to your Mailchimp account.\n * @param {module:model/EcommerceStore1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceStore}\n */\n this.addStore = function(body) {\n return this.addStoreWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add cart\n * Add a new cart to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceCart1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCart} and HTTP response\n */\n this.addStoreCartWithHttpInfo = function(storeId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add cart\n * Add a new cart to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceCart1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCart}\n */\n this.addStoreCart = function(storeId, body) {\n return this.addStoreCartWithHttpInfo(storeId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add cart line item\n * Add a new line item to an existing cart.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {module:model/EcommerceCartLineItem3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCartLineItem} and HTTP response\n */\n this.addCartLineItemWithHttpInfo = function(storeId, cartId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'cartId' is set\n if (cartId === undefined || cartId === null) {\n throw new Error(\"Missing the required parameter 'cartId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'cart_id': cartId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/carts/{cart_id}/lines', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add cart line item\n * Add a new line item to an existing cart.\n * @param {String} storeId The store id.\n * @param {String} cartId The id for the cart.\n * @param {module:model/EcommerceCartLineItem3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCartLineItem}\n */\n this.addCartLineItem = function(storeId, cartId, body) {\n return this.addCartLineItemWithHttpInfo(storeId, cartId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add customer\n * Add a new customer to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceCustomer3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCustomer} and HTTP response\n */\n this.addStoreCustomerWithHttpInfo = function(storeId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/customers', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add customer\n * Add a new customer to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceCustomer3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCustomer}\n */\n this.addStoreCustomer = function(storeId, body) {\n return this.addStoreCustomerWithHttpInfo(storeId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add order\n * Add a new order to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceOrder1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceOrder} and HTTP response\n */\n this.addStoreOrderWithHttpInfo = function(storeId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add order\n * Add a new order to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceOrder1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceOrder}\n */\n this.addStoreOrder = function(storeId, body) {\n return this.addStoreOrderWithHttpInfo(storeId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add order line item\n * Add a new line item to an existing order.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {module:model/EcommerceOrderLineItem3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceOrderLineItem} and HTTP response\n */\n this.addOrderLineItemWithHttpInfo = function(storeId, orderId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'orderId' is set\n if (orderId === undefined || orderId === null) {\n throw new Error(\"Missing the required parameter 'orderId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'order_id': orderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/orders/{order_id}/lines', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add order line item\n * Add a new line item to an existing order.\n * @param {String} storeId The store id.\n * @param {String} orderId The id for the order in a store.\n * @param {module:model/EcommerceOrderLineItem3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceOrderLineItem}\n */\n this.addOrderLineItem = function(storeId, orderId, body) {\n return this.addOrderLineItemWithHttpInfo(storeId, orderId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add product\n * Add a new product to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceProduct1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProduct} and HTTP response\n */\n this.addStoreProductWithHttpInfo = function(storeId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add product\n * Add a new product to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommerceProduct1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProduct}\n */\n this.addStoreProduct = function(storeId, body) {\n return this.addStoreProductWithHttpInfo(storeId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add product image\n * Add a new image to the product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {module:model/EcommerceProductImage3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductImage} and HTTP response\n */\n this.addProductImageWithHttpInfo = function(storeId, productId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/images', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add product image\n * Add a new image to the product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {module:model/EcommerceProductImage3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductImage}\n */\n this.addProductImage = function(storeId, productId, body) {\n return this.addProductImageWithHttpInfo(storeId, productId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add product variant\n * Add a new variant to the product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {module:model/EcommerceProductVariant3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductVariant} and HTTP response\n */\n this.addProductVariantsWithHttpInfo = function(storeId, productId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/variants', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add product variant\n * Add a new variant to the product.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {module:model/EcommerceProductVariant3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductVariant}\n */\n this.addProductVariants = function(storeId, productId, body) {\n return this.addProductVariantsWithHttpInfo(storeId, productId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add promo code\n * Add a new promo code to a store.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {module:model/EcommercePromoCode1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommercePromoCode} and HTTP response\n */\n this.addPromoCodeWithHttpInfo = function(storeId, promoRuleId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'promoRuleId' is set\n if (promoRuleId === undefined || promoRuleId === null) {\n throw new Error(\"Missing the required parameter 'promoRuleId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'promo_rule_id': promoRuleId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules/{promo_rule_id}/promo-codes', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add promo code\n * Add a new promo code to a store.\n * @param {String} storeId The store id.\n * @param {String} promoRuleId The id for the promo rule of a store.\n * @param {module:model/EcommercePromoCode1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommercePromoCode}\n */\n this.addPromoCode = function(storeId, promoRuleId, body) {\n return this.addPromoCodeWithHttpInfo(storeId, promoRuleId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add promo rule\n * Add a new promo rule to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommercePromoRule1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommercePromoRule} and HTTP response\n */\n this.addPromoRulesWithHttpInfo = function(storeId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/promo-rules', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add promo rule\n * Add a new promo rule to a store.\n * @param {String} storeId The store id.\n * @param {module:model/EcommercePromoRule1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommercePromoRule}\n */\n this.addPromoRules = function(storeId, body) {\n return this.addPromoRulesWithHttpInfo(storeId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add or update customer\n * Add or update a customer.\n * @param {String} storeId The store id.\n * @param {String} customerId The id for the customer of a store.\n * @param {module:model/EcommerceCustomer4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceCustomer} and HTTP response\n */\n this.setStoreCustomerWithHttpInfo = function(storeId, customerId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'customerId' is set\n if (customerId === undefined || customerId === null) {\n throw new Error(\"Missing the required parameter 'customerId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'customer_id': customerId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/customers/{customer_id}', 'PUT',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add or update customer\n * Add or update a customer.\n * @param {String} storeId The store id.\n * @param {String} customerId The id for the customer of a store.\n * @param {module:model/EcommerceCustomer4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceCustomer}\n */\n this.setStoreCustomer = function(storeId, customerId, body) {\n return this.setStoreCustomerWithHttpInfo(storeId, customerId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add or update product variant\n * Add or update a product variant.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} variantId The id for the product variant.\n * @param {module:model/EcommerceProductVariant4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EcommerceProductVariant} and HTTP response\n */\n this.addProductVariantWithHttpInfo = function(storeId, productId, variantId, body) {\n var postBody = body;\n\n // verify the required parameter 'storeId' is set\n if (storeId === undefined || storeId === null) {\n throw new Error(\"Missing the required parameter 'storeId' when calling \");\n }\n\n // verify the required parameter 'productId' is set\n if (productId === undefined || productId === null) {\n throw new Error(\"Missing the required parameter 'productId' when calling \");\n }\n\n // verify the required parameter 'variantId' is set\n if (variantId === undefined || variantId === null) {\n throw new Error(\"Missing the required parameter 'variantId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'store_id': storeId,\n 'product_id': productId,\n 'variant_id': variantId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ecommerce/stores/{store_id}/products/{product_id}/variants/{variant_id}', 'PUT',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add or update product variant\n * Add or update a product variant.\n * @param {String} storeId The store id.\n * @param {String} productId The id for the product of a store.\n * @param {String} variantId The id for the product variant.\n * @param {module:model/EcommerceProductVariant4} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EcommerceProductVariant}\n */\n this.addProductVariant = function(storeId, productId, variantId, body) {\n return this.addProductVariantWithHttpInfo(storeId, productId, variantId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * FacebookAds service.\n * @module api/FacebookAdsApi\n */\n\n/**\n * Constructs a new FacebookAdsApi. \n * @alias module:api/FacebookAdsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * List facebook ads\n * Get list of Facebook ads.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2008} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/facebook-ads', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List facebook ads\n * Get list of Facebook ads.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2008}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get facebook ad info\n * Get details of a Facebook ad.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2009} and HTTP response\n */\n this.getAdWithHttpInfo = function(outreachId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/facebook-ads/{outreach_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get facebook ad info\n * Get details of a Facebook ad.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2009}\n */\n this.getAd = function(outreachId, opts) {\n return this.getAdWithHttpInfo(outreachId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * FileManager service.\n * @module api/FileManagerApi\n */\n\n/**\n * Constructs a new FileManagerApi. \n * @alias module:api/FileManagerApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete file\n * Remove a specific file from the File Manager.\n * @param {String} fileId The unique id for the File Manager file.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteFileWithHttpInfo = function(fileId) {\n var postBody = null;\n\n // verify the required parameter 'fileId' is set\n if (fileId === undefined || fileId === null) {\n throw new Error(\"Missing the required parameter 'fileId' when calling \");\n }\n\n var pathParams = {\n 'file_id': fileId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/files/{file_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete file\n * Remove a specific file from the File Manager.\n * @param {String} fileId The unique id for the File Manager file.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteFile = function(fileId) {\n return this.deleteFileWithHttpInfo(fileId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete folder\n * Delete a specific folder in the File Manager.\n * @param {String} folderId The unique id for the File Manager folder.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteFolderWithHttpInfo = function(folderId) {\n var postBody = null;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/folders/{folder_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete folder\n * Delete a specific folder in the File Manager.\n * @param {String} folderId The unique id for the File Manager folder.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteFolder = function(folderId) {\n return this.deleteFolderWithHttpInfo(folderId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List stored files\n * Get a list of available images and files stored in the File Manager for the account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.type The file type for the File Manager file.\n * @param {String} opts.createdBy The Mailchimp account user who created the File Manager file.\n * @param {String} opts.beforeCreatedAt Restrict the response to files created before the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceCreatedAt Restrict the response to files created after the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/FileManager} and HTTP response\n */\n this.filesWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'type': ( opts['type'] ? opts['type'] : opts['type']),\n 'created_by': ( opts['createdBy'] ? opts['createdBy'] : opts['created_by']),\n 'before_created_at': ( opts['beforeCreatedAt'] ? opts['beforeCreatedAt'] : opts['before_created_at']),\n 'since_created_at': ( opts['sinceCreatedAt'] ? opts['sinceCreatedAt'] : opts['since_created_at']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/files', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List stored files\n * Get a list of available images and files stored in the File Manager for the account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.type The file type for the File Manager file.\n * @param {String} opts.createdBy The Mailchimp account user who created the File Manager file.\n * @param {String} opts.beforeCreatedAt Restrict the response to files created before the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceCreatedAt Restrict the response to files created after the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/FileManager}\n */\n this.files = function(opts) {\n return this.filesWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get file\n * Get information about a specific file in the File Manager.\n * @param {String} fileId The unique id for the File Manager file.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/GalleryFile} and HTTP response\n */\n this.getFileWithHttpInfo = function(fileId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'fileId' is set\n if (fileId === undefined || fileId === null) {\n throw new Error(\"Missing the required parameter 'fileId' when calling \");\n }\n\n var pathParams = {\n 'file_id': fileId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/files/{file_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get file\n * Get information about a specific file in the File Manager.\n * @param {String} fileId The unique id for the File Manager file.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/GalleryFile}\n */\n this.getFile = function(fileId, opts) {\n return this.getFileWithHttpInfo(fileId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List folders\n * Get a list of all folders in the File Manager.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.createdBy The Mailchimp account user who created the File Manager file.\n * @param {String} opts.beforeCreatedAt Restrict the response to files created before the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceCreatedAt Restrict the response to files created after the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/FileManagerFolders} and HTTP response\n */\n this.listFoldersWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'created_by': ( opts['createdBy'] ? opts['createdBy'] : opts['created_by']),\n 'before_created_at': ( opts['beforeCreatedAt'] ? opts['beforeCreatedAt'] : opts['before_created_at']),\n 'since_created_at': ( opts['sinceCreatedAt'] ? opts['sinceCreatedAt'] : opts['since_created_at'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/folders', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List folders\n * Get a list of all folders in the File Manager.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.createdBy The Mailchimp account user who created the File Manager file.\n * @param {String} opts.beforeCreatedAt Restrict the response to files created before the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceCreatedAt Restrict the response to files created after the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/FileManagerFolders}\n */\n this.listFolders = function(opts) {\n return this.listFoldersWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get folder\n * Get information about a specific folder in the File Manager.\n * @param {String} folderId The unique id for the File Manager folder.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/GalleryFolder} and HTTP response\n */\n this.getFolderWithHttpInfo = function(folderId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/folders/{folder_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get folder\n * Get information about a specific folder in the File Manager.\n * @param {String} folderId The unique id for the File Manager folder.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/GalleryFolder}\n */\n this.getFolder = function(folderId, opts) {\n return this.getFolderWithHttpInfo(folderId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update file\n * Update a file in the File Manager.\n * @param {String} fileId The unique id for the File Manager file.\n * @param {module:model/GalleryFile2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/GalleryFile} and HTTP response\n */\n this.updateFileWithHttpInfo = function(fileId, body) {\n var postBody = body;\n\n // verify the required parameter 'fileId' is set\n if (fileId === undefined || fileId === null) {\n throw new Error(\"Missing the required parameter 'fileId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'file_id': fileId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/files/{file_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update file\n * Update a file in the File Manager.\n * @param {String} fileId The unique id for the File Manager file.\n * @param {module:model/GalleryFile2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/GalleryFile}\n */\n this.updateFile = function(fileId, body) {\n return this.updateFileWithHttpInfo(fileId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update folder\n * Update a specific File Manager folder.\n * @param {String} folderId The unique id for the File Manager folder.\n * @param {module:model/GalleryFolder2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/GalleryFolder} and HTTP response\n */\n this.updateFolderWithHttpInfo = function(folderId, body) {\n var postBody = body;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/folders/{folder_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update folder\n * Update a specific File Manager folder.\n * @param {String} folderId The unique id for the File Manager folder.\n * @param {module:model/GalleryFolder2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/GalleryFolder}\n */\n this.updateFolder = function(folderId, body) {\n return this.updateFolderWithHttpInfo(folderId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add file\n * Upload a new image or file to the File Manager.\n * @param {module:model/GalleryFile1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/GalleryFile} and HTTP response\n */\n this.uploadWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/files', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add file\n * Upload a new image or file to the File Manager.\n * @param {module:model/GalleryFile1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/GalleryFile}\n */\n this.upload = function(body) {\n return this.uploadWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add folder\n * Create a new folder in the File Manager.\n * @param {module:model/GalleryFolder1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/GalleryFolder} and HTTP response\n */\n this.createFolderWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/file-manager/folders', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add folder\n * Create a new folder in the File Manager.\n * @param {module:model/GalleryFolder1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/GalleryFolder}\n */\n this.createFolder = function(body) {\n return this.createFolderWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * LandingPages service.\n * @module api/LandingPagesApi\n */\n\n/**\n * Constructs a new LandingPagesApi. \n * @alias module:api/LandingPagesApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete landing page\n * Delete a landing page.\n * @param {String} pageId The unique id for the page.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deletePageWithHttpInfo = function(pageId) {\n var postBody = null;\n\n // verify the required parameter 'pageId' is set\n if (pageId === undefined || pageId === null) {\n throw new Error(\"Missing the required parameter 'pageId' when calling \");\n }\n\n var pathParams = {\n 'page_id': pageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/landing-pages/{page_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete landing page\n * Delete a landing page.\n * @param {String} pageId The unique id for the page.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deletePage = function(pageId) {\n return this.deletePageWithHttpInfo(pageId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List landing pages\n * Get all landing pages.\n * @param {Object} opts Optional parameters\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2006} and HTTP response\n */\n this.getAllWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/landing-pages', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List landing pages\n * Get all landing pages.\n * @param {Object} opts Optional parameters\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2006}\n */\n this.getAll = function(opts) {\n return this.getAllWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get landing page info\n * Get information about a specific page.\n * @param {String} pageId The unique id for the page.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/LandingPage} and HTTP response\n */\n this.getPageWithHttpInfo = function(pageId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'pageId' is set\n if (pageId === undefined || pageId === null) {\n throw new Error(\"Missing the required parameter 'pageId' when calling \");\n }\n\n var pathParams = {\n 'page_id': pageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/landing-pages/{page_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get landing page info\n * Get information about a specific page.\n * @param {String} pageId The unique id for the page.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/LandingPage}\n */\n this.getPage = function(pageId, opts) {\n return this.getPageWithHttpInfo(pageId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get landing page content\n * Get the the HTML for your landing page.\n * @param {String} pageId The unique id for the page.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/LandingPageContent} and HTTP response\n */\n this.getPageContentWithHttpInfo = function(pageId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'pageId' is set\n if (pageId === undefined || pageId === null) {\n throw new Error(\"Missing the required parameter 'pageId' when calling \");\n }\n\n var pathParams = {\n 'page_id': pageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/landing-pages/{page_id}/content', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get landing page content\n * Get the the HTML for your landing page.\n * @param {String} pageId The unique id for the page.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/LandingPageContent}\n */\n this.getPageContent = function(pageId, opts) {\n return this.getPageContentWithHttpInfo(pageId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update landing page\n * Update a landing page.\n * @param {String} pageId The unique id for the page.\n * @param {module:model/LandingPage2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/LandingPage} and HTTP response\n */\n this.updatePageWithHttpInfo = function(pageId, body) {\n var postBody = body;\n\n // verify the required parameter 'pageId' is set\n if (pageId === undefined || pageId === null) {\n throw new Error(\"Missing the required parameter 'pageId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'page_id': pageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/landing-pages/{page_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update landing page\n * Update a landing page.\n * @param {String} pageId The unique id for the page.\n * @param {module:model/LandingPage2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/LandingPage}\n */\n this.updatePage = function(pageId, body) {\n return this.updatePageWithHttpInfo(pageId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add landing page\n * Create a new Mailchimp landing page.\n * @param {module:model/LandingPage1} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.useDefaultList Will create the Landing Page using the account's Default List instead of requiring a list_id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/LandingPage} and HTTP response\n */\n this.createWithHttpInfo = function(body, opts) {\n opts = opts || {};\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'use_default_list': ( opts['useDefaultList'] ? opts['useDefaultList'] : opts['use_default_list'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/landing-pages', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add landing page\n * Create a new Mailchimp landing page.\n * @param {module:model/LandingPage1} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.useDefaultList Will create the Landing Page using the account's Default List instead of requiring a list_id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/LandingPage}\n */\n this.create = function(body, opts) {\n return this.createWithHttpInfo(body, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Publish landing page\n * Publish a landing page that is in draft, unpublished, or has been previously published and edited.\n * @param {String} pageId The unique id for the page.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.publishPageWithHttpInfo = function(pageId) {\n var postBody = null;\n\n // verify the required parameter 'pageId' is set\n if (pageId === undefined || pageId === null) {\n throw new Error(\"Missing the required parameter 'pageId' when calling \");\n }\n\n var pathParams = {\n 'page_id': pageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/landing-pages/{page_id}/actions/publish', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Publish landing page\n * Publish a landing page that is in draft, unpublished, or has been previously published and edited.\n * @param {String} pageId The unique id for the page.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.publishPage = function(pageId) {\n return this.publishPageWithHttpInfo(pageId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Unpublish landing page\n * Unpublish a landing page that is in draft or has been published.\n * @param {String} pageId The unique id for the page.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.unpublishPageWithHttpInfo = function(pageId) {\n var postBody = null;\n\n // verify the required parameter 'pageId' is set\n if (pageId === undefined || pageId === null) {\n throw new Error(\"Missing the required parameter 'pageId' when calling \");\n }\n\n var pathParams = {\n 'page_id': pageId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/landing-pages/{page_id}/actions/unpublish', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Unpublish landing page\n * Unpublish a landing page that is in draft or has been published.\n * @param {String} pageId The unique id for the page.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.unpublishPage = function(pageId) {\n return this.unpublishPageWithHttpInfo(pageId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Lists service.\n * @module api/ListsApi\n */\n\n/**\n * Constructs a new ListsApi. \n * @alias module:api/ListsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete list\n * Delete a list from your Mailchimp account. If you delete a list, you'll lose the list history—including subscriber activity, unsubscribes, complaints, and bounces. You’ll also lose subscribers’ email addresses, unless you exported and backed up your list.\n * @param {String} listId The unique ID for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteListWithHttpInfo = function(listId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete list\n * Delete a list from your Mailchimp account. If you delete a list, you'll lose the list history—including subscriber activity, unsubscribes, complaints, and bounces. You’ll also lose subscribers’ email addresses, unless you exported and backed up your list.\n * @param {String} listId The unique ID for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteList = function(listId) {\n return this.deleteListWithHttpInfo(listId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete interest category\n * Delete a specific interest category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteInterestCategoryWithHttpInfo = function(listId, interestCategoryId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'interestCategoryId' is set\n if (interestCategoryId === undefined || interestCategoryId === null) {\n throw new Error(\"Missing the required parameter 'interestCategoryId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'interest_category_id': interestCategoryId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories/{interest_category_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete interest category\n * Delete a specific interest category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteInterestCategory = function(listId, interestCategoryId) {\n return this.deleteInterestCategoryWithHttpInfo(listId, interestCategoryId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete interest in category\n * Delete interests or group names in a specific category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {String} interestId The specific interest or 'group name'.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteInterestCategoryInterestWithHttpInfo = function(listId, interestCategoryId, interestId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'interestCategoryId' is set\n if (interestCategoryId === undefined || interestCategoryId === null) {\n throw new Error(\"Missing the required parameter 'interestCategoryId' when calling \");\n }\n\n // verify the required parameter 'interestId' is set\n if (interestId === undefined || interestId === null) {\n throw new Error(\"Missing the required parameter 'interestId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'interest_category_id': interestCategoryId,\n 'interest_id': interestId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories/{interest_category_id}/interests/{interest_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete interest in category\n * Delete interests or group names in a specific category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {String} interestId The specific interest or 'group name'.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteInterestCategoryInterest = function(listId, interestCategoryId, interestId) {\n return this.deleteInterestCategoryInterestWithHttpInfo(listId, interestCategoryId, interestId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Archive list member\n * Archive a list member. To permanently delete, use the delete-permanent action.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteListMemberWithHttpInfo = function(listId, subscriberHash) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Archive list member\n * Archive a list member. To permanently delete, use the delete-permanent action.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteListMember = function(listId, subscriberHash) {\n return this.deleteListMemberWithHttpInfo(listId, subscriberHash)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete note\n * Delete a specific note for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {String} noteId The id for the note.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteListMemberNoteWithHttpInfo = function(listId, subscriberHash, noteId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n // verify the required parameter 'noteId' is set\n if (noteId === undefined || noteId === null) {\n throw new Error(\"Missing the required parameter 'noteId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash,\n 'note_id': noteId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/notes/{note_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete note\n * Delete a specific note for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {String} noteId The id for the note.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteListMemberNote = function(listId, subscriberHash, noteId) {\n return this.deleteListMemberNoteWithHttpInfo(listId, subscriberHash, noteId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete merge field\n * Delete a specific merge field.\n * @param {String} listId The unique ID for the list.\n * @param {String} mergeId The id for the merge field.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteListMergeFieldWithHttpInfo = function(listId, mergeId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'mergeId' is set\n if (mergeId === undefined || mergeId === null) {\n throw new Error(\"Missing the required parameter 'mergeId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'merge_id': mergeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/merge-fields/{merge_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete merge field\n * Delete a specific merge field.\n * @param {String} listId The unique ID for the list.\n * @param {String} mergeId The id for the merge field.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteListMergeField = function(listId, mergeId) {\n return this.deleteListMergeFieldWithHttpInfo(listId, mergeId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete segment\n * Delete a specific segment in a list.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteSegmentWithHttpInfo = function(listId, segmentId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'segmentId' is set\n if (segmentId === undefined || segmentId === null) {\n throw new Error(\"Missing the required parameter 'segmentId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'segment_id': segmentId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments/{segment_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete segment\n * Delete a specific segment in a list.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteSegment = function(listId, segmentId) {\n return this.deleteSegmentWithHttpInfo(listId, segmentId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Remove list member from segment\n * Remove a member from the specified static segment.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.removeSegmentMemberWithHttpInfo = function(listId, segmentId, subscriberHash) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'segmentId' is set\n if (segmentId === undefined || segmentId === null) {\n throw new Error(\"Missing the required parameter 'segmentId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'segment_id': segmentId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments/{segment_id}/members/{subscriber_hash}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Remove list member from segment\n * Remove a member from the specified static segment.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.removeSegmentMember = function(listId, segmentId, subscriberHash) {\n return this.removeSegmentMemberWithHttpInfo(listId, segmentId, subscriberHash)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete webhook\n * Delete a specific webhook in a list.\n * @param {String} listId The unique ID for the list.\n * @param {String} webhookId The webhook's id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteListWebhookWithHttpInfo = function(listId, webhookId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'webhookId' is set\n if (webhookId === undefined || webhookId === null) {\n throw new Error(\"Missing the required parameter 'webhookId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'webhook_id': webhookId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/webhooks/{webhook_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete webhook\n * Delete a specific webhook in a list.\n * @param {String} listId The unique ID for the list.\n * @param {String} webhookId The webhook's id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteListWebhook = function(listId, webhookId) {\n return this.deleteListWebhookWithHttpInfo(listId, webhookId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List member tags\n * Get the tags on a list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CollectionOfTags} and HTTP response\n */\n this.getListMemberTagsWithHttpInfo = function(listId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/tags', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List member tags\n * Get the tags on a list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CollectionOfTags}\n */\n this.getListMemberTags = function(listId, subscriberHash, opts) {\n return this.getListMemberTagsWithHttpInfo(listId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get lists info\n * Get information about all lists in the account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.beforeDateCreated Restrict response to lists created before the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceDateCreated Restrict results to lists created after the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeCampaignLastSent Restrict results to lists created before the last campaign send date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceCampaignLastSent Restrict results to lists created after the last campaign send date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.email Restrict results to lists that include a specific subscriber's email address.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @param {Boolean} opts.hasEcommerceStore Restrict results to lists that contain an active, connected, undeleted ecommerce store.\n * @param {Boolean} opts.includeTotalContacts Return the total_contacts field in the stats response, which contains an approximate count of all contacts in any state.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SubscriberLists} and HTTP response\n */\n this.getAllListsWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'before_date_created': ( opts['beforeDateCreated'] ? opts['beforeDateCreated'] : opts['before_date_created']),\n 'since_date_created': ( opts['sinceDateCreated'] ? opts['sinceDateCreated'] : opts['since_date_created']),\n 'before_campaign_last_sent': ( opts['beforeCampaignLastSent'] ? opts['beforeCampaignLastSent'] : opts['before_campaign_last_sent']),\n 'since_campaign_last_sent': ( opts['sinceCampaignLastSent'] ? opts['sinceCampaignLastSent'] : opts['since_campaign_last_sent']),\n 'email': ( opts['email'] ? opts['email'] : opts['email']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir']),\n 'has_ecommerce_store': ( opts['hasEcommerceStore'] ? opts['hasEcommerceStore'] : opts['has_ecommerce_store']),\n 'include_total_contacts': ( opts['includeTotalContacts'] ? opts['includeTotalContacts'] : opts['include_total_contacts'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get lists info\n * Get information about all lists in the account.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.beforeDateCreated Restrict response to lists created before the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceDateCreated Restrict results to lists created after the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeCampaignLastSent Restrict results to lists created before the last campaign send date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceCampaignLastSent Restrict results to lists created after the last campaign send date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.email Restrict results to lists that include a specific subscriber's email address.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @param {Boolean} opts.hasEcommerceStore Restrict results to lists that contain an active, connected, undeleted ecommerce store.\n * @param {Boolean} opts.includeTotalContacts Return the total_contacts field in the stats response, which contains an approximate count of all contacts in any state.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SubscriberLists}\n */\n this.getAllLists = function(opts) {\n return this.getAllListsWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get list info\n * Get information about a specific list in your Mailchimp account. Results include list members who have signed up but haven't confirmed their subscription yet and unsubscribed or cleaned.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Boolean} opts.includeTotalContacts Return the total_contacts field in the stats response, which contains an approximate count of all contacts in any state.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SubscriberList} and HTTP response\n */\n this.getListWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'include_total_contacts': ( opts['includeTotalContacts'] ? opts['includeTotalContacts'] : opts['include_total_contacts'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get list info\n * Get information about a specific list in your Mailchimp account. Results include list members who have signed up but haven't confirmed their subscription yet and unsubscribed or cleaned.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Boolean} opts.includeTotalContacts Return the total_contacts field in the stats response, which contains an approximate count of all contacts in any state.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SubscriberList}\n */\n this.getList = function(listId, opts) {\n return this.getListWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List abuse reports\n * Get all abuse reports for a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AbuseComplaints} and HTTP response\n */\n this.getListAbuseReportsWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/abuse-reports', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List abuse reports\n * Get all abuse reports for a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AbuseComplaints}\n */\n this.getListAbuseReports = function(listId, opts) {\n return this.getListAbuseReportsWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get abuse report\n * Get details about a specific abuse report.\n * @param {String} listId The unique ID for the list.\n * @param {String} reportId The id for the abuse report.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AbuseComplaint} and HTTP response\n */\n this.getListAbuseReportDetailsWithHttpInfo = function(listId, reportId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'reportId' is set\n if (reportId === undefined || reportId === null) {\n throw new Error(\"Missing the required parameter 'reportId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'report_id': reportId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/abuse-reports/{report_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get abuse report\n * Get details about a specific abuse report.\n * @param {String} listId The unique ID for the list.\n * @param {String} reportId The id for the abuse report.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AbuseComplaint}\n */\n this.getListAbuseReportDetails = function(listId, reportId, opts) {\n return this.getListAbuseReportDetailsWithHttpInfo(listId, reportId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List recent activity\n * Get up to the previous 180 days of daily detailed aggregated activity stats for a list, not including Automation activity.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListActivity} and HTTP response\n */\n this.getListRecentActivityWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/activity', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List recent activity\n * Get up to the previous 180 days of daily detailed aggregated activity stats for a list, not including Automation activity.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListActivity}\n */\n this.getListRecentActivity = function(listId, opts) {\n return this.getListRecentActivityWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List top email clients\n * Get a list of the top email clients based on user-agent strings.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EmailClients} and HTTP response\n */\n this.getListClientsWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/clients', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List top email clients\n * Get a list of the top email clients based on user-agent strings.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EmailClients}\n */\n this.getListClients = function(listId, opts) {\n return this.getListClientsWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List growth history data\n * Get a month-by-month summary of a specific list's growth activity.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/GrowthHistory} and HTTP response\n */\n this.getListGrowthHistoryWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/growth-history', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List growth history data\n * Get a month-by-month summary of a specific list's growth activity.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/GrowthHistory}\n */\n this.getListGrowthHistory = function(listId, opts) {\n return this.getListGrowthHistoryWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get growth history by month\n * Get a summary of a specific list's growth activity for a specific month and year.\n * @param {String} listId The unique ID for the list.\n * @param {String} month A specific month of list growth history.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/GrowthHistory} and HTTP response\n */\n this.getListGrowthHistoryByMonthWithHttpInfo = function(listId, month, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'month' is set\n if (month === undefined || month === null) {\n throw new Error(\"Missing the required parameter 'month' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'month': month\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/growth-history/{month}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get growth history by month\n * Get a summary of a specific list's growth activity for a specific month and year.\n * @param {String} listId The unique ID for the list.\n * @param {String} month A specific month of list growth history.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/GrowthHistory}\n */\n this.getListGrowthHistoryByMonth = function(listId, month, opts) {\n return this.getListGrowthHistoryByMonthWithHttpInfo(listId, month, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List interest categories\n * Get information about a list's interest categories.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.type Restrict results a type of interest group\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InterestGroupings} and HTTP response\n */\n this.getListInterestCategoriesWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'type': ( opts['type'] ? opts['type'] : opts['type'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List interest categories\n * Get information about a list's interest categories.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.type Restrict results a type of interest group\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InterestGroupings}\n */\n this.getListInterestCategories = function(listId, opts) {\n return this.getListInterestCategoriesWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get interest category info\n * Get information about a specific interest category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InterestCategory} and HTTP response\n */\n this.getInterestCategoryWithHttpInfo = function(listId, interestCategoryId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'interestCategoryId' is set\n if (interestCategoryId === undefined || interestCategoryId === null) {\n throw new Error(\"Missing the required parameter 'interestCategoryId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'interest_category_id': interestCategoryId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories/{interest_category_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get interest category info\n * Get information about a specific interest category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InterestCategory}\n */\n this.getInterestCategory = function(listId, interestCategoryId, opts) {\n return this.getInterestCategoryWithHttpInfo(listId, interestCategoryId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List interests in category\n * Get a list of this category's interests.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Interests} and HTTP response\n */\n this.listInterestCategoryInterestsWithHttpInfo = function(listId, interestCategoryId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'interestCategoryId' is set\n if (interestCategoryId === undefined || interestCategoryId === null) {\n throw new Error(\"Missing the required parameter 'interestCategoryId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'interest_category_id': interestCategoryId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories/{interest_category_id}/interests', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List interests in category\n * Get a list of this category's interests.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Interests}\n */\n this.listInterestCategoryInterests = function(listId, interestCategoryId, opts) {\n return this.listInterestCategoryInterestsWithHttpInfo(listId, interestCategoryId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get interest in category\n * Get interests or 'group names' for a specific category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {String} interestId The specific interest or 'group name'.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Interest} and HTTP response\n */\n this.getInterestCategoryInterestWithHttpInfo = function(listId, interestCategoryId, interestId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'interestCategoryId' is set\n if (interestCategoryId === undefined || interestCategoryId === null) {\n throw new Error(\"Missing the required parameter 'interestCategoryId' when calling \");\n }\n\n // verify the required parameter 'interestId' is set\n if (interestId === undefined || interestId === null) {\n throw new Error(\"Missing the required parameter 'interestId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'interest_category_id': interestCategoryId,\n 'interest_id': interestId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories/{interest_category_id}/interests/{interest_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get interest in category\n * Get interests or 'group names' for a specific category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {String} interestId The specific interest or 'group name'.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Interest}\n */\n this.getInterestCategoryInterest = function(listId, interestCategoryId, interestId, opts) {\n return this.getInterestCategoryInterestWithHttpInfo(listId, interestCategoryId, interestId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List locations\n * Get the locations (countries) that the list's subscribers have been tagged to based on geocoding their IP address.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListLocations} and HTTP response\n */\n this.getListLocationsWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/locations', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List locations\n * Get the locations (countries) that the list's subscribers have been tagged to based on geocoding their IP address.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListLocations}\n */\n this.getListLocations = function(listId, opts) {\n return this.getListLocationsWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List members info\n * Get information about members in a specific Mailchimp list.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.emailType The email type.\n * @param {module:model/String} opts.status The subscriber's status.\n * @param {String} opts.sinceTimestampOpt Restrict results to subscribers who opted-in after the set timeframe. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeTimestampOpt Restrict results to subscribers who opted-in before the set timeframe. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceLastChanged Restrict results to subscribers whose information changed after the set timeframe. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeLastChanged Restrict results to subscribers whose information changed before the set timeframe. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.uniqueEmailId A unique identifier for the email address across all Mailchimp lists.\n * @param {Boolean} opts.vipOnly A filter to return only the list's VIP members. Passing `true` will restrict results to VIP list members, passing `false` will return all list members.\n * @param {String} opts.interestCategoryId The unique id for the interest category.\n * @param {String} opts.interestIds Used to filter list members by interests. Must be accompanied by interest_category_id and interest_match. The value must be a comma separated list of interest ids present for any supplied interest categories.\n * @param {module:model/String} opts.interestMatch Used to filter list members by interests. Must be accompanied by interest_category_id and interest_ids. \\\"any\\\" will match a member with any of the interest supplied, \\\"all\\\" will only match members with every interest supplied, and \\\"none\\\" will match members without any of the interest supplied.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @param {Boolean} opts.sinceLastCampaign Filter subscribers by those subscribed/unsubscribed/pending/cleaned since last email campaign send. Member status is required to use this filter.\n * @param {String} opts.unsubscribedSince Filter subscribers by those unsubscribed since a specific date. Using any status other than unsubscribed with this filter will result in an error.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListMembers2} and HTTP response\n */\n this.getListMembersInfoWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'email_type': ( opts['emailType'] ? opts['emailType'] : opts['email_type']),\n 'status': ( opts['status'] ? opts['status'] : opts['status']),\n 'since_timestamp_opt': ( opts['sinceTimestampOpt'] ? opts['sinceTimestampOpt'] : opts['since_timestamp_opt']),\n 'before_timestamp_opt': ( opts['beforeTimestampOpt'] ? opts['beforeTimestampOpt'] : opts['before_timestamp_opt']),\n 'since_last_changed': ( opts['sinceLastChanged'] ? opts['sinceLastChanged'] : opts['since_last_changed']),\n 'before_last_changed': ( opts['beforeLastChanged'] ? opts['beforeLastChanged'] : opts['before_last_changed']),\n 'unique_email_id': ( opts['uniqueEmailId'] ? opts['uniqueEmailId'] : opts['unique_email_id']),\n 'vip_only': ( opts['vipOnly'] ? opts['vipOnly'] : opts['vip_only']),\n 'interest_category_id': ( opts['interestCategoryId'] ? opts['interestCategoryId'] : opts['interest_category_id']),\n 'interest_ids': ( opts['interestIds'] ? opts['interestIds'] : opts['interest_ids']),\n 'interest_match': ( opts['interestMatch'] ? opts['interestMatch'] : opts['interest_match']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir']),\n 'since_last_campaign': ( opts['sinceLastCampaign'] ? opts['sinceLastCampaign'] : opts['since_last_campaign']),\n 'unsubscribed_since': ( opts['unsubscribedSince'] ? opts['unsubscribedSince'] : opts['unsubscribed_since'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List members info\n * Get information about members in a specific Mailchimp list.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.emailType The email type.\n * @param {module:model/String} opts.status The subscriber's status.\n * @param {String} opts.sinceTimestampOpt Restrict results to subscribers who opted-in after the set timeframe. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeTimestampOpt Restrict results to subscribers who opted-in before the set timeframe. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.sinceLastChanged Restrict results to subscribers whose information changed after the set timeframe. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeLastChanged Restrict results to subscribers whose information changed before the set timeframe. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.uniqueEmailId A unique identifier for the email address across all Mailchimp lists.\n * @param {Boolean} opts.vipOnly A filter to return only the list's VIP members. Passing `true` will restrict results to VIP list members, passing `false` will return all list members.\n * @param {String} opts.interestCategoryId The unique id for the interest category.\n * @param {String} opts.interestIds Used to filter list members by interests. Must be accompanied by interest_category_id and interest_match. The value must be a comma separated list of interest ids present for any supplied interest categories.\n * @param {module:model/String} opts.interestMatch Used to filter list members by interests. Must be accompanied by interest_category_id and interest_ids. \\\"any\\\" will match a member with any of the interest supplied, \\\"all\\\" will only match members with every interest supplied, and \\\"none\\\" will match members without any of the interest supplied.\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @param {Boolean} opts.sinceLastCampaign Filter subscribers by those subscribed/unsubscribed/pending/cleaned since last email campaign send. Member status is required to use this filter.\n * @param {String} opts.unsubscribedSince Filter subscribers by those unsubscribed since a specific date. Using any status other than unsubscribed with this filter will result in an error.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListMembers2}\n */\n this.getListMembersInfo = function(listId, opts) {\n return this.getListMembersInfoWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get member info\n * Get information about a specific list member, including a currently subscribed, unsubscribed, or bounced member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListMembers2} and HTTP response\n */\n this.getListMemberWithHttpInfo = function(listId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get member info\n * Get information about a specific list member, including a currently subscribed, unsubscribed, or bounced member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListMembers2}\n */\n this.getListMember = function(listId, subscriberHash, opts) {\n return this.getListMemberWithHttpInfo(listId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * View recent activity 50\n * Get the last 50 events of a member's activity on a specific list, including opens, clicks, and unsubscribes.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.action A comma seperated list of actions to return.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/MemberActivityEvents} and HTTP response\n */\n this.getListMemberActivityWithHttpInfo = function(listId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'action': this.apiClient.buildCollectionParam(opts['action'] ? opts['action'] : opts['action'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/activity', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * View recent activity 50\n * Get the last 50 events of a member's activity on a specific list, including opens, clicks, and unsubscribes.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.action A comma seperated list of actions to return.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/MemberActivityEvents}\n */\n this.getListMemberActivity = function(listId, subscriberHash, opts) {\n return this.getListMemberActivityWithHttpInfo(listId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * View recent activity\n * Get a member's activity on a specific list, including opens, clicks, and unsubscribes.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Array.} opts.activityFilters A comma-separated list of activity filters that correspond to a set of activity types, e.g \\\"?activity_filters=open,bounce,click\\\".\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/MemberActivityEvents1} and HTTP response\n */\n this.getListMemberActivityFeedWithHttpInfo = function(listId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'activity_filters': this.apiClient.buildCollectionParam(opts['activityFilters'] ? opts['activityFilters'] : opts['activity_filters'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/activity-feed', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * View recent activity\n * Get a member's activity on a specific list, including opens, clicks, and unsubscribes.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Array.} opts.activityFilters A comma-separated list of activity filters that correspond to a set of activity types, e.g \\\"?activity_filters=open,bounce,click\\\".\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/MemberActivityEvents1}\n */\n this.getListMemberActivityFeed = function(listId, subscriberHash, opts) {\n return this.getListMemberActivityFeedWithHttpInfo(listId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List member events\n * Get events for a contact.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CollectionOfEvents} and HTTP response\n */\n this.getListMemberEventsWithHttpInfo = function(listId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/events', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List member events\n * Get events for a contact.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CollectionOfEvents}\n */\n this.getListMemberEvents = function(listId, subscriberHash, opts) {\n return this.getListMemberEventsWithHttpInfo(listId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List member goal events\n * Get the last 50 Goal events for a member on a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CollectionOfMemberActivityEvents} and HTTP response\n */\n this.getListMemberGoalsWithHttpInfo = function(listId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/goals', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List member goal events\n * Get the last 50 Goal events for a member on a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CollectionOfMemberActivityEvents}\n */\n this.getListMemberGoals = function(listId, subscriberHash, opts) {\n return this.getListMemberGoalsWithHttpInfo(listId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List recent member notes\n * Get recent notes for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {module:model/String} opts.sortField Returns notes sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CollectionOfNotes} and HTTP response\n */\n this.getListMemberNotesWithHttpInfo = function(listId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir']),\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/notes', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List recent member notes\n * Get recent notes for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {module:model/String} opts.sortField Returns notes sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CollectionOfNotes}\n */\n this.getListMemberNotes = function(listId, subscriberHash, opts) {\n return this.getListMemberNotesWithHttpInfo(listId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get member note\n * Get a specific note for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {String} noteId The id for the note.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/MemberNotes} and HTTP response\n */\n this.getListMemberNoteWithHttpInfo = function(listId, subscriberHash, noteId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n // verify the required parameter 'noteId' is set\n if (noteId === undefined || noteId === null) {\n throw new Error(\"Missing the required parameter 'noteId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash,\n 'note_id': noteId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/notes/{note_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get member note\n * Get a specific note for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {String} noteId The id for the note.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/MemberNotes}\n */\n this.getListMemberNote = function(listId, subscriberHash, noteId, opts) {\n return this.getListMemberNoteWithHttpInfo(listId, subscriberHash, noteId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List merge fields\n * Get a list of all merge fields for an audience.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.type The merge field type.\n * @param {Boolean} opts.required Whether it's a required merge field.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CollectionOfMergeFields} and HTTP response\n */\n this.getListMergeFieldsWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'type': ( opts['type'] ? opts['type'] : opts['type']),\n 'required': ( opts['required'] ? opts['required'] : opts['required'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/merge-fields', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List merge fields\n * Get a list of all merge fields for an audience.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.type The merge field type.\n * @param {Boolean} opts.required Whether it's a required merge field.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CollectionOfMergeFields}\n */\n this.getListMergeFields = function(listId, opts) {\n return this.getListMergeFieldsWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get merge field\n * Get information about a specific merge field.\n * @param {String} listId The unique ID for the list.\n * @param {String} mergeId The id for the merge field.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/MergeField} and HTTP response\n */\n this.getListMergeFieldWithHttpInfo = function(listId, mergeId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'mergeId' is set\n if (mergeId === undefined || mergeId === null) {\n throw new Error(\"Missing the required parameter 'mergeId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'merge_id': mergeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/merge-fields/{merge_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get merge field\n * Get information about a specific merge field.\n * @param {String} listId The unique ID for the list.\n * @param {String} mergeId The id for the merge field.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/MergeField}\n */\n this.getListMergeField = function(listId, mergeId, opts) {\n return this.getListMergeFieldWithHttpInfo(listId, mergeId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get segment info\n * Get information about a specific segment.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Boolean} opts.includeCleaned Include cleaned members in response\n * @param {Boolean} opts.includeTransactional Include transactional members in response\n * @param {Boolean} opts.includeUnsubscribed Include unsubscribed members in response\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/List7} and HTTP response\n */\n this.getSegmentWithHttpInfo = function(listId, segmentId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'segmentId' is set\n if (segmentId === undefined || segmentId === null) {\n throw new Error(\"Missing the required parameter 'segmentId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'segment_id': segmentId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'include_cleaned': ( opts['includeCleaned'] ? opts['includeCleaned'] : opts['include_cleaned']),\n 'include_transactional': ( opts['includeTransactional'] ? opts['includeTransactional'] : opts['include_transactional']),\n 'include_unsubscribed': ( opts['includeUnsubscribed'] ? opts['includeUnsubscribed'] : opts['include_unsubscribed'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments/{segment_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get segment info\n * Get information about a specific segment.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Boolean} opts.includeCleaned Include cleaned members in response\n * @param {Boolean} opts.includeTransactional Include transactional members in response\n * @param {Boolean} opts.includeUnsubscribed Include unsubscribed members in response\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/List7}\n */\n this.getSegment = function(listId, segmentId, opts) {\n return this.getSegmentWithHttpInfo(listId, segmentId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List members in segment\n * Get information about members in a saved segment.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Boolean} opts.includeCleaned Include cleaned members in response\n * @param {Boolean} opts.includeTransactional Include transactional members in response\n * @param {Boolean} opts.includeUnsubscribed Include unsubscribed members in response\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SegmentMembers} and HTTP response\n */\n this.getSegmentMembersListWithHttpInfo = function(listId, segmentId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'segmentId' is set\n if (segmentId === undefined || segmentId === null) {\n throw new Error(\"Missing the required parameter 'segmentId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'segment_id': segmentId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'include_cleaned': ( opts['includeCleaned'] ? opts['includeCleaned'] : opts['include_cleaned']),\n 'include_transactional': ( opts['includeTransactional'] ? opts['includeTransactional'] : opts['include_transactional']),\n 'include_unsubscribed': ( opts['includeUnsubscribed'] ? opts['includeUnsubscribed'] : opts['include_unsubscribed'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments/{segment_id}/members', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List members in segment\n * Get information about members in a saved segment.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {Boolean} opts.includeCleaned Include cleaned members in response\n * @param {Boolean} opts.includeTransactional Include transactional members in response\n * @param {Boolean} opts.includeUnsubscribed Include unsubscribed members in response\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SegmentMembers}\n */\n this.getSegmentMembersList = function(listId, segmentId, opts) {\n return this.getSegmentMembersListWithHttpInfo(listId, segmentId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List signup forms\n * Get signup forms for a specific list.\n * @param {String} listId The unique ID for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListSignupForms} and HTTP response\n */\n this.getListSignupFormsWithHttpInfo = function(listId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/signup-forms', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List signup forms\n * Get signup forms for a specific list.\n * @param {String} listId The unique ID for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListSignupForms}\n */\n this.getListSignupForms = function(listId) {\n return this.getListSignupFormsWithHttpInfo(listId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get information about all surveys for a list\n * Get information about all available surveys for a specific list.\n * @param {String} listId The unique ID for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.getAllSurveysForListWithHttpInfo = function(listId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/surveys', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get information about all surveys for a list\n * Get information about all available surveys for a specific list.\n * @param {String} listId The unique ID for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.getAllSurveysForList = function(listId) {\n return this.getAllSurveysForListWithHttpInfo(listId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get survey\n * Get details about a specific survey.\n * @param {String} listId The unique ID for the list.\n * @param {String} surveyId The ID of the survey.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.getSurveyWithHttpInfo = function(listId, surveyId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'surveyId' is set\n if (surveyId === undefined || surveyId === null) {\n throw new Error(\"Missing the required parameter 'surveyId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'survey_id': surveyId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/surveys/{survey_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get survey\n * Get details about a specific survey.\n * @param {String} listId The unique ID for the list.\n * @param {String} surveyId The ID of the survey.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.getSurvey = function(listId, surveyId) {\n return this.getSurveyWithHttpInfo(listId, surveyId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List webhooks\n * Get information about all webhooks for a specific list.\n * @param {String} listId The unique ID for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListWebhooks} and HTTP response\n */\n this.getListWebhooksWithHttpInfo = function(listId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/webhooks', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List webhooks\n * Get information about all webhooks for a specific list.\n * @param {String} listId The unique ID for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListWebhooks}\n */\n this.getListWebhooks = function(listId) {\n return this.getListWebhooksWithHttpInfo(listId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get webhook info\n * Get information about a specific webhook.\n * @param {String} listId The unique ID for the list.\n * @param {String} webhookId The webhook's id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListWebhooks} and HTTP response\n */\n this.getListWebhookWithHttpInfo = function(listId, webhookId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'webhookId' is set\n if (webhookId === undefined || webhookId === null) {\n throw new Error(\"Missing the required parameter 'webhookId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'webhook_id': webhookId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/webhooks/{webhook_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get webhook info\n * Get information about a specific webhook.\n * @param {String} listId The unique ID for the list.\n * @param {String} webhookId The webhook's id.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListWebhooks}\n */\n this.getListWebhook = function(listId, webhookId) {\n return this.getListWebhookWithHttpInfo(listId, webhookId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update lists\n * Update the settings for a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/SubscriberList2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SubscriberList} and HTTP response\n */\n this.updateListWithHttpInfo = function(listId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update lists\n * Update the settings for a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/SubscriberList2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SubscriberList}\n */\n this.updateList = function(listId, body) {\n return this.updateListWithHttpInfo(listId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update interest category\n * Update a specific interest category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {module:model/InterestCategory2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InterestCategory} and HTTP response\n */\n this.updateInterestCategoryWithHttpInfo = function(listId, interestCategoryId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'interestCategoryId' is set\n if (interestCategoryId === undefined || interestCategoryId === null) {\n throw new Error(\"Missing the required parameter 'interestCategoryId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'interest_category_id': interestCategoryId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories/{interest_category_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update interest category\n * Update a specific interest category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {module:model/InterestCategory2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InterestCategory}\n */\n this.updateInterestCategory = function(listId, interestCategoryId, body) {\n return this.updateInterestCategoryWithHttpInfo(listId, interestCategoryId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update interest in category\n * Update interests or 'group names' for a specific category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {String} interestId The specific interest or 'group name'.\n * @param {module:model/Interest2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Interest} and HTTP response\n */\n this.updateInterestCategoryInterestWithHttpInfo = function(listId, interestCategoryId, interestId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'interestCategoryId' is set\n if (interestCategoryId === undefined || interestCategoryId === null) {\n throw new Error(\"Missing the required parameter 'interestCategoryId' when calling \");\n }\n\n // verify the required parameter 'interestId' is set\n if (interestId === undefined || interestId === null) {\n throw new Error(\"Missing the required parameter 'interestId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'interest_category_id': interestCategoryId,\n 'interest_id': interestId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories/{interest_category_id}/interests/{interest_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update interest in category\n * Update interests or 'group names' for a specific category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {String} interestId The specific interest or 'group name'.\n * @param {module:model/Interest2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Interest}\n */\n this.updateInterestCategoryInterest = function(listId, interestCategoryId, interestId, body) {\n return this.updateInterestCategoryInterestWithHttpInfo(listId, interestCategoryId, interestId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update list member\n * Update information for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {module:model/AddListMembers3} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.skipMergeValidation If skip_merge_validation is true, member data will be accepted without merge field values, even if the merge field is usually required. This defaults to false.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListMembers2} and HTTP response\n */\n this.updateListMemberWithHttpInfo = function(listId, subscriberHash, body, opts) {\n opts = opts || {};\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'skip_merge_validation': ( opts['skipMergeValidation'] ? opts['skipMergeValidation'] : opts['skip_merge_validation'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update list member\n * Update information for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {module:model/AddListMembers3} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.skipMergeValidation If skip_merge_validation is true, member data will be accepted without merge field values, even if the merge field is usually required. This defaults to false.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListMembers2}\n */\n this.updateListMember = function(listId, subscriberHash, body, opts) {\n return this.updateListMemberWithHttpInfo(listId, subscriberHash, body, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update note\n * Update a specific note for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {String} noteId The id for the note.\n * @param {module:model/MemberNotes2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/MemberNotes} and HTTP response\n */\n this.updateListMemberNoteWithHttpInfo = function(listId, subscriberHash, noteId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n // verify the required parameter 'noteId' is set\n if (noteId === undefined || noteId === null) {\n throw new Error(\"Missing the required parameter 'noteId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash,\n 'note_id': noteId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/notes/{note_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update note\n * Update a specific note for a specific list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {String} noteId The id for the note.\n * @param {module:model/MemberNotes2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/MemberNotes}\n */\n this.updateListMemberNote = function(listId, subscriberHash, noteId, body) {\n return this.updateListMemberNoteWithHttpInfo(listId, subscriberHash, noteId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update merge field\n * Update a specific merge field.\n * @param {String} listId The unique ID for the list.\n * @param {String} mergeId The id for the merge field.\n * @param {module:model/MergeField2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/MergeField} and HTTP response\n */\n this.updateListMergeFieldWithHttpInfo = function(listId, mergeId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'mergeId' is set\n if (mergeId === undefined || mergeId === null) {\n throw new Error(\"Missing the required parameter 'mergeId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'merge_id': mergeId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/merge-fields/{merge_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update merge field\n * Update a specific merge field.\n * @param {String} listId The unique ID for the list.\n * @param {String} mergeId The id for the merge field.\n * @param {module:model/MergeField2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/MergeField}\n */\n this.updateListMergeField = function(listId, mergeId, body) {\n return this.updateListMergeFieldWithHttpInfo(listId, mergeId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update segment\n * Update a specific segment in a list.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {module:model/List9} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/List7} and HTTP response\n */\n this.updateSegmentWithHttpInfo = function(listId, segmentId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'segmentId' is set\n if (segmentId === undefined || segmentId === null) {\n throw new Error(\"Missing the required parameter 'segmentId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'segment_id': segmentId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments/{segment_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update segment\n * Update a specific segment in a list.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {module:model/List9} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/List7}\n */\n this.updateSegment = function(listId, segmentId, body) {\n return this.updateSegmentWithHttpInfo(listId, segmentId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update webhook\n * Update the settings for an existing webhook.\n * @param {String} listId The unique ID for the list.\n * @param {String} webhookId The webhook's id.\n * @param {module:model/AddWebhook1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListWebhooks} and HTTP response\n */\n this.updateListWebhookWithHttpInfo = function(listId, webhookId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'webhookId' is set\n if (webhookId === undefined || webhookId === null) {\n throw new Error(\"Missing the required parameter 'webhookId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'webhook_id': webhookId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/webhooks/{webhook_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update webhook\n * Update the settings for an existing webhook.\n * @param {String} listId The unique ID for the list.\n * @param {String} webhookId The webhook's id.\n * @param {module:model/AddWebhook1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListWebhooks}\n */\n this.updateListWebhook = function(listId, webhookId, body) {\n return this.updateListWebhookWithHttpInfo(listId, webhookId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add event\n * Add an event for a list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {module:model/Events} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.createListMemberEventWithHttpInfo = function(listId, subscriberHash, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/events', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add event\n * Add an event for a list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {module:model/Events} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.createListMemberEvent = function(listId, subscriberHash, body) {\n return this.createListMemberEventWithHttpInfo(listId, subscriberHash, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add or remove member tags\n * Add or remove tags from a list member. If a tag that does not exist is passed in and set as 'active', a new tag will be created.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {module:model/MemberTags} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.updateListMemberTagsWithHttpInfo = function(listId, subscriberHash, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/tags', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add or remove member tags\n * Add or remove tags from a list member. If a tag that does not exist is passed in and set as 'active', a new tag will be created.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {module:model/MemberTags} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.updateListMemberTags = function(listId, subscriberHash, body) {\n return this.updateListMemberTagsWithHttpInfo(listId, subscriberHash, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add list\n * Create a new list in your Mailchimp account.\n * @param {module:model/SubscriberList1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SubscriberList} and HTTP response\n */\n this.createListWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add list\n * Create a new list in your Mailchimp account.\n * @param {module:model/SubscriberList1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SubscriberList}\n */\n this.createList = function(body) {\n return this.createListWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Batch subscribe or unsubscribe\n * Batch subscribe or unsubscribe list members.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/MembersToSubscribeUnsubscribeTofromAListInBatch} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.skipMergeValidation If skip_merge_validation is true, member data will be accepted without merge field values, even if the merge field is usually required. This defaults to false.\n * @param {Boolean} opts.skipDuplicateCheck If skip_duplicate_check is true, we will ignore duplicates sent in the request when using the batch sub/unsub on the lists endpoint. The status of the first appearance in the request will be saved. This defaults to false.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/BatchUpdateListMembers} and HTTP response\n */\n this.batchListMembersWithHttpInfo = function(listId, body, opts) {\n opts = opts || {};\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'skip_merge_validation': ( opts['skipMergeValidation'] ? opts['skipMergeValidation'] : opts['skip_merge_validation']),\n 'skip_duplicate_check': ( opts['skipDuplicateCheck'] ? opts['skipDuplicateCheck'] : opts['skip_duplicate_check'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Batch subscribe or unsubscribe\n * Batch subscribe or unsubscribe list members.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/MembersToSubscribeUnsubscribeTofromAListInBatch} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.skipMergeValidation If skip_merge_validation is true, member data will be accepted without merge field values, even if the merge field is usually required. This defaults to false.\n * @param {Boolean} opts.skipDuplicateCheck If skip_duplicate_check is true, we will ignore duplicates sent in the request when using the batch sub/unsub on the lists endpoint. The status of the first appearance in the request will be saved. This defaults to false.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/BatchUpdateListMembers}\n */\n this.batchListMembers = function(listId, body, opts) {\n return this.batchListMembersWithHttpInfo(listId, body, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add interest category\n * Create a new interest category.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/InterestCategory1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InterestCategory} and HTTP response\n */\n this.createListInterestCategoryWithHttpInfo = function(listId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add interest category\n * Create a new interest category.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/InterestCategory1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InterestCategory}\n */\n this.createListInterestCategory = function(listId, body) {\n return this.createListInterestCategoryWithHttpInfo(listId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add interest in category\n * Create a new interest or 'group name' for a specific category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {module:model/Interest1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Interest} and HTTP response\n */\n this.createInterestCategoryInterestWithHttpInfo = function(listId, interestCategoryId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'interestCategoryId' is set\n if (interestCategoryId === undefined || interestCategoryId === null) {\n throw new Error(\"Missing the required parameter 'interestCategoryId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'interest_category_id': interestCategoryId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/interest-categories/{interest_category_id}/interests', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add interest in category\n * Create a new interest or 'group name' for a specific category.\n * @param {String} listId The unique ID for the list.\n * @param {String} interestCategoryId The unique ID for the interest category.\n * @param {module:model/Interest1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Interest}\n */\n this.createInterestCategoryInterest = function(listId, interestCategoryId, body) {\n return this.createInterestCategoryInterestWithHttpInfo(listId, interestCategoryId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add member to list\n * Add a new member to the list.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/AddListMembers1} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.skipMergeValidation If skip_merge_validation is true, member data will be accepted without merge field values, even if the merge field is usually required. This defaults to false.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListMembers2} and HTTP response\n */\n this.addListMemberWithHttpInfo = function(listId, body, opts) {\n opts = opts || {};\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'skip_merge_validation': ( opts['skipMergeValidation'] ? opts['skipMergeValidation'] : opts['skip_merge_validation'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add member to list\n * Add a new member to the list.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/AddListMembers1} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.skipMergeValidation If skip_merge_validation is true, member data will be accepted without merge field values, even if the merge field is usually required. This defaults to false.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListMembers2}\n */\n this.addListMember = function(listId, body, opts) {\n return this.addListMemberWithHttpInfo(listId, body, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete list member\n * Delete all personally identifiable information related to a list member, and remove them from a list. This will make it impossible to re-import the list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteListMemberPermanentWithHttpInfo = function(listId, subscriberHash) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/actions/delete-permanent', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete list member\n * Delete all personally identifiable information related to a list member, and remove them from a list. This will make it impossible to re-import the list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteListMemberPermanent = function(listId, subscriberHash) {\n return this.deleteListMemberPermanentWithHttpInfo(listId, subscriberHash)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add member note\n * Add a new note for a specific subscriber.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {module:model/MemberNotes1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/MemberNotes} and HTTP response\n */\n this.createListMemberNoteWithHttpInfo = function(listId, subscriberHash, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}/notes', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add member note\n * Add a new note for a specific subscriber.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {module:model/MemberNotes1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/MemberNotes}\n */\n this.createListMemberNote = function(listId, subscriberHash, body) {\n return this.createListMemberNoteWithHttpInfo(listId, subscriberHash, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add merge field\n * Add a new merge field for a specific audience.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/MergeField1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/MergeField} and HTTP response\n */\n this.addListMergeFieldWithHttpInfo = function(listId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/merge-fields', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add merge field\n * Add a new merge field for a specific audience.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/MergeField1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/MergeField}\n */\n this.addListMergeField = function(listId, body) {\n return this.addListMergeFieldWithHttpInfo(listId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add segment\n * Create a new segment in a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/List8} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/List7} and HTTP response\n */\n this.createSegmentWithHttpInfo = function(listId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add segment\n * Create a new segment in a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/List8} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/List7}\n */\n this.createSegment = function(listId, body) {\n return this.createSegmentWithHttpInfo(listId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Batch add or remove members\n * Batch add/remove list members to static segment\n * @param {module:model/MembersToAddremoveTofromAStaticSegment} body \n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/BatchAddremoveListMembersTofromStaticSegment} and HTTP response\n */\n this.batchSegmentMembersWithHttpInfo = function(body, listId, segmentId) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'segmentId' is set\n if (segmentId === undefined || segmentId === null) {\n throw new Error(\"Missing the required parameter 'segmentId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'segment_id': segmentId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments/{segment_id}', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Batch add or remove members\n * Batch add/remove list members to static segment\n * @param {module:model/MembersToAddremoveTofromAStaticSegment} body \n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/BatchAddremoveListMembersTofromStaticSegment}\n */\n this.batchSegmentMembers = function(body, listId, segmentId) {\n return this.batchSegmentMembersWithHttpInfo(body, listId, segmentId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add member to segment\n * Add a member to a static segment.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {module:model/Body3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListMembers1} and HTTP response\n */\n this.createSegmentMemberWithHttpInfo = function(listId, segmentId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'segmentId' is set\n if (segmentId === undefined || segmentId === null) {\n throw new Error(\"Missing the required parameter 'segmentId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'segment_id': segmentId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments/{segment_id}/members', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add member to segment\n * Add a member to a static segment.\n * @param {String} listId The unique ID for the list.\n * @param {String} segmentId The unique id for the segment.\n * @param {module:model/Body3} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListMembers1}\n */\n this.createSegmentMember = function(listId, segmentId, body) {\n return this.createSegmentMemberWithHttpInfo(listId, segmentId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Customize signup form\n * Customize a list's default signup form.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/SignupForm1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SignupForm} and HTTP response\n */\n this.updateListSignupFormWithHttpInfo = function(listId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/signup-forms', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Customize signup form\n * Customize a list's default signup form.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/SignupForm1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SignupForm}\n */\n this.updateListSignupForm = function(listId, body) {\n return this.updateListSignupFormWithHttpInfo(listId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add webhook\n * Create a new webhook for a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/AddWebhook} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListWebhooks} and HTTP response\n */\n this.createListWebhookWithHttpInfo = function(listId, body) {\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/webhooks', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add webhook\n * Create a new webhook for a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {module:model/AddWebhook} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListWebhooks}\n */\n this.createListWebhook = function(listId, body) {\n return this.createListWebhookWithHttpInfo(listId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List segments\n * Get information about all available segments for a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.type Limit results based on segment type.\n * @param {String} opts.sinceCreatedAt Restrict results to segments created after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeCreatedAt Restrict results to segments created before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Boolean} opts.includeCleaned Include cleaned members in response\n * @param {Boolean} opts.includeTransactional Include transactional members in response\n * @param {Boolean} opts.includeUnsubscribed Include unsubscribed members in response\n * @param {String} opts.sinceUpdatedAt Restrict results to segments update after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeUpdatedAt Restrict results to segments update before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CollectionOfSegments} and HTTP response\n */\n this.listSegmentsWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'type': ( opts['type'] ? opts['type'] : opts['type']),\n 'since_created_at': ( opts['sinceCreatedAt'] ? opts['sinceCreatedAt'] : opts['since_created_at']),\n 'before_created_at': ( opts['beforeCreatedAt'] ? opts['beforeCreatedAt'] : opts['before_created_at']),\n 'include_cleaned': ( opts['includeCleaned'] ? opts['includeCleaned'] : opts['include_cleaned']),\n 'include_transactional': ( opts['includeTransactional'] ? opts['includeTransactional'] : opts['include_transactional']),\n 'include_unsubscribed': ( opts['includeUnsubscribed'] ? opts['includeUnsubscribed'] : opts['include_unsubscribed']),\n 'since_updated_at': ( opts['sinceUpdatedAt'] ? opts['sinceUpdatedAt'] : opts['since_updated_at']),\n 'before_updated_at': ( opts['beforeUpdatedAt'] ? opts['beforeUpdatedAt'] : opts['before_updated_at'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/segments', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List segments\n * Get information about all available segments for a specific list.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.type Limit results based on segment type.\n * @param {String} opts.sinceCreatedAt Restrict results to segments created after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeCreatedAt Restrict results to segments created before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Boolean} opts.includeCleaned Include cleaned members in response\n * @param {Boolean} opts.includeTransactional Include transactional members in response\n * @param {Boolean} opts.includeUnsubscribed Include unsubscribed members in response\n * @param {String} opts.sinceUpdatedAt Restrict results to segments update after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeUpdatedAt Restrict results to segments update before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CollectionOfSegments}\n */\n this.listSegments = function(listId, opts) {\n return this.listSegmentsWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add or update list member\n * Add or update a list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {module:model/AddListMembers2} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.skipMergeValidation If skip_merge_validation is true, member data will be accepted without merge field values, even if the merge field is usually required. This defaults to false.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ListMembers2} and HTTP response\n */\n this.setListMemberWithHttpInfo = function(listId, subscriberHash, body, opts) {\n opts = opts || {};\n var postBody = body;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'skip_merge_validation': ( opts['skipMergeValidation'] ? opts['skipMergeValidation'] : opts['skip_merge_validation'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/members/{subscriber_hash}', 'PUT',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add or update list member\n * Add or update a list member.\n * @param {String} listId The unique ID for the list.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address. This endpoint also accepts a list member's email address or contact_id.\n * @param {module:model/AddListMembers2} body \n * @param {Object} opts Optional parameters\n * @param {Boolean} opts.skipMergeValidation If skip_merge_validation is true, member data will be accepted without merge field values, even if the merge field is usually required. This defaults to false.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ListMembers2}\n */\n this.setListMember = function(listId, subscriberHash, body, opts) {\n return this.setListMemberWithHttpInfo(listId, subscriberHash, body, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Search for tags on a list by name.\n * Search for tags on a list by name. If no name is provided, will return all tags on the list.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {String} opts.name The search query used to filter tags. The search query will be compared to each tag as a prefix, so all tags that have a name starting with this field will be returned.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TagSearchResults} and HTTP response\n */\n this.tagSearchWithHttpInfo = function(listId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'name': ( opts['name'] ? opts['name'] : opts['name'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/tag-search', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Search for tags on a list by name.\n * Search for tags on a list by name. If no name is provided, will return all tags on the list.\n * @param {String} listId The unique ID for the list.\n * @param {Object} opts Optional parameters\n * @param {String} opts.name The search query used to filter tags. The search query will be compared to each tag as a prefix, so all tags that have a name starting with this field will be returned.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TagSearchResults}\n */\n this.tagSearch = function(listId, opts) {\n return this.tagSearchWithHttpInfo(listId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Ping service.\n * @module api/PingApi\n */\n\n/**\n * Constructs a new PingApi. \n * @alias module:api/PingApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Ping\n * A health check for the API that won't return any account-specific information.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/APIHealthStatus} and HTTP response\n */\n this.getWithHttpInfo = function() {\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/ping', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Ping\n * A health check for the API that won't return any account-specific information.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/APIHealthStatus}\n */\n this.get = function() {\n return this.getWithHttpInfo()\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Reporting service.\n * @module api/ReportingApi\n */\n\n/**\n * Constructs a new ReportingApi. \n * @alias module:api/ReportingApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * List facebook ads reports\n * Get reports of Facebook ads.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse20010} and HTTP response\n */\n this.getFacebookAdsReportAllWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/facebook-ads', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List facebook ads reports\n * Get reports of Facebook ads.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse20010}\n */\n this.getFacebookAdsReportAll = function(opts) {\n return this.getFacebookAdsReportAllWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get facebook ad report\n * Get report of a Facebook ad.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse20011} and HTTP response\n */\n this.getFacebookAdReportWithHttpInfo = function(outreachId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/facebook-ads/{outreach_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get facebook ad report\n * Get report of a Facebook ad.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse20011}\n */\n this.getFacebookAdReport = function(outreachId, opts) {\n return this.getFacebookAdReportWithHttpInfo(outreachId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List facebook ecommerce report\n * Get breakdown of product activity for an outreach.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2007} and HTTP response\n */\n this.getFacebookAdProductActivityReportWithHttpInfo = function(outreachId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/facebook-ads/{outreach_id}/ecommerce-product-activity', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List facebook ecommerce report\n * Get breakdown of product activity for an outreach.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2007}\n */\n this.getFacebookAdProductActivityReport = function(outreachId, opts) {\n return this.getFacebookAdProductActivityReportWithHttpInfo(outreachId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List landing pages reports\n * Get reports of landing pages.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse20012} and HTTP response\n */\n this.getLandingPageReportsAllWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/landing-pages', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List landing pages reports\n * Get reports of landing pages.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse20012}\n */\n this.getLandingPageReportsAll = function(opts) {\n return this.getLandingPageReportsAllWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get landing page report\n * Get report of a landing page.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/LandingPageReport} and HTTP response\n */\n this.getLandingPageReportWithHttpInfo = function(outreachId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/landing-pages/{outreach_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get landing page report\n * Get report of a landing page.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/LandingPageReport}\n */\n this.getLandingPageReport = function(outreachId, opts) {\n return this.getLandingPageReportWithHttpInfo(outreachId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List survey reports\n * Get reports for surveys.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse20013} and HTTP response\n */\n this.getSurveyReportsAllWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/surveys', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List survey reports\n * Get reports for surveys.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse20013}\n */\n this.getSurveyReportsAll = function(opts) {\n return this.getSurveyReportsAllWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get survey report\n * Get report for a survey.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SurveyReport} and HTTP response\n */\n this.getSurveyReportWithHttpInfo = function(outreachId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/surveys/{outreach_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get survey report\n * Get report for a survey.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SurveyReport}\n */\n this.getSurveyReport = function(outreachId, opts) {\n return this.getSurveyReportWithHttpInfo(outreachId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List survey question reports\n * Get reports for survey questions.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse20014} and HTTP response\n */\n this.getSurveyQuestionReportsAllWithHttpInfo = function(outreachId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/surveys/{outreach_id}/questions', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List survey question reports\n * Get reports for survey questions.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse20014}\n */\n this.getSurveyQuestionReportsAll = function(outreachId, opts) {\n return this.getSurveyQuestionReportsAllWithHttpInfo(outreachId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get survey question report\n * Get report for a survey question.\n * @param {String} outreachId The outreach id.\n * @param {String} questionId The ID of the survey question.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SurveyQuestionReport} and HTTP response\n */\n this.getSurveyQuestionReportWithHttpInfo = function(outreachId, questionId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n // verify the required parameter 'questionId' is set\n if (questionId === undefined || questionId === null) {\n throw new Error(\"Missing the required parameter 'questionId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId,\n 'question_id': questionId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/surveys/{outreach_id}/questions/{question_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get survey question report\n * Get report for a survey question.\n * @param {String} outreachId The outreach id.\n * @param {String} questionId The ID of the survey question.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SurveyQuestionReport}\n */\n this.getSurveyQuestionReport = function(outreachId, questionId, opts) {\n return this.getSurveyQuestionReportWithHttpInfo(outreachId, questionId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List answers for question\n * Get answers for a survey question.\n * @param {String} outreachId The outreach id.\n * @param {String} questionId The ID of the survey question.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {module:model/String} opts.respondentFamiliarityIs Filter survey responses by familiarity of the respondents.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse20015} and HTTP response\n */\n this.getSurveyQuestionAnswersWithHttpInfo = function(outreachId, questionId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n // verify the required parameter 'questionId' is set\n if (questionId === undefined || questionId === null) {\n throw new Error(\"Missing the required parameter 'questionId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId,\n 'question_id': questionId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'respondent_familiarity_is': ( opts['respondentFamiliarityIs'] ? opts['respondentFamiliarityIs'] : opts['respondent_familiarity_is'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/surveys/{outreach_id}/questions/{question_id}/answers', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List answers for question\n * Get answers for a survey question.\n * @param {String} outreachId The outreach id.\n * @param {String} questionId The ID of the survey question.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {module:model/String} opts.respondentFamiliarityIs Filter survey responses by familiarity of the respondents.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse20015}\n */\n this.getSurveyQuestionAnswers = function(outreachId, questionId, opts) {\n return this.getSurveyQuestionAnswersWithHttpInfo(outreachId, questionId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List survey responses\n * Get responses to a survey.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.answeredQuestion The ID of the question that was answered.\n * @param {String} opts.choseAnswer The ID of the option chosen to filter responses on.\n * @param {module:model/String} opts.respondentFamiliarityIs Filter survey responses by familiarity of the respondents.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse20016} and HTTP response\n */\n this.getSurveyResponsesAllWithHttpInfo = function(outreachId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'answered_question': ( opts['answeredQuestion'] ? opts['answeredQuestion'] : opts['answered_question']),\n 'chose_answer': ( opts['choseAnswer'] ? opts['choseAnswer'] : opts['chose_answer']),\n 'respondent_familiarity_is': ( opts['respondentFamiliarityIs'] ? opts['respondentFamiliarityIs'] : opts['respondent_familiarity_is'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/surveys/{outreach_id}/responses', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List survey responses\n * Get responses to a survey.\n * @param {String} outreachId The outreach id.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.answeredQuestion The ID of the question that was answered.\n * @param {String} opts.choseAnswer The ID of the option chosen to filter responses on.\n * @param {module:model/String} opts.respondentFamiliarityIs Filter survey responses by familiarity of the respondents.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse20016}\n */\n this.getSurveyResponsesAll = function(outreachId, opts) {\n return this.getSurveyResponsesAllWithHttpInfo(outreachId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get survey response\n * Get a single survey response.\n * @param {String} outreachId The outreach id.\n * @param {String} responseId The ID of the survey response.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SurveyResponse} and HTTP response\n */\n this.getSurveyResponseWithHttpInfo = function(outreachId, responseId) {\n var postBody = null;\n\n // verify the required parameter 'outreachId' is set\n if (outreachId === undefined || outreachId === null) {\n throw new Error(\"Missing the required parameter 'outreachId' when calling \");\n }\n\n // verify the required parameter 'responseId' is set\n if (responseId === undefined || responseId === null) {\n throw new Error(\"Missing the required parameter 'responseId' when calling \");\n }\n\n var pathParams = {\n 'outreach_id': outreachId,\n 'response_id': responseId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reporting/surveys/{outreach_id}/responses/{response_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get survey response\n * Get a single survey response.\n * @param {String} outreachId The outreach id.\n * @param {String} responseId The ID of the survey response.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SurveyResponse}\n */\n this.getSurveyResponse = function(outreachId, responseId) {\n return this.getSurveyResponseWithHttpInfo(outreachId, responseId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Reports service.\n * @module api/ReportsApi\n */\n\n/**\n * Constructs a new ReportsApi. \n * @alias module:api/ReportsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * List campaign reports\n * Get campaign reports.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.type The campaign type.\n * @param {Date} opts.beforeSendTime Restrict the response to campaigns sent before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceSendTime Restrict the response to campaigns sent after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignReports1} and HTTP response\n */\n this.getAllCampaignReportsWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'type': ( opts['type'] ? opts['type'] : opts['type']),\n 'before_send_time': ( opts['beforeSendTime'] ? opts['beforeSendTime'] : opts['before_send_time']),\n 'since_send_time': ( opts['sinceSendTime'] ? opts['sinceSendTime'] : opts['since_send_time'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaign reports\n * Get campaign reports.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.type The campaign type.\n * @param {Date} opts.beforeSendTime Restrict the response to campaigns sent before the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {Date} opts.sinceSendTime Restrict the response to campaigns sent after the set time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignReports1}\n */\n this.getAllCampaignReports = function(opts) {\n return this.getAllCampaignReportsWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get campaign report\n * Get report details for a specific sent campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignReport} and HTTP response\n */\n this.getCampaignReportWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get campaign report\n * Get report details for a specific sent campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignReport}\n */\n this.getCampaignReport = function(campaignId, opts) {\n return this.getCampaignReportWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List abuse reports\n * Get a list of abuse complaints for a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AbuseComplaints1} and HTTP response\n */\n this.getCampaignAbuseReportsWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/abuse-reports', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List abuse reports\n * Get a list of abuse complaints for a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AbuseComplaints1}\n */\n this.getCampaignAbuseReports = function(campaignId, opts) {\n return this.getCampaignAbuseReportsWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get abuse report\n * Get information about a specific abuse report for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} reportId The id for the abuse report.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/AbuseComplaint1} and HTTP response\n */\n this.getCampaignAbuseReportWithHttpInfo = function(campaignId, reportId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'reportId' is set\n if (reportId === undefined || reportId === null) {\n throw new Error(\"Missing the required parameter 'reportId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'report_id': reportId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/abuse-reports/{report_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get abuse report\n * Get information about a specific abuse report for a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} reportId The id for the abuse report.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/AbuseComplaint1}\n */\n this.getCampaignAbuseReport = function(campaignId, reportId, opts) {\n return this.getCampaignAbuseReportWithHttpInfo(campaignId, reportId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List campaign feedback\n * Get feedback based on a campaign's statistics. Advice feedback is based on campaign stats like opens, clicks, unsubscribes, bounces, and more.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignAdviceReport} and HTTP response\n */\n this.getCampaignAdviceWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/advice', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaign feedback\n * Get feedback based on a campaign's statistics. Advice feedback is based on campaign stats like opens, clicks, unsubscribes, bounces, and more.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignAdviceReport}\n */\n this.getCampaignAdvice = function(campaignId, opts) {\n return this.getCampaignAdviceWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List campaign details\n * Get information about clicks on specific links in your Mailchimp campaigns.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ClickDetailReport} and HTTP response\n */\n this.getCampaignClickDetailsWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/click-details', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaign details\n * Get information about clicks on specific links in your Mailchimp campaigns.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ClickDetailReport}\n */\n this.getCampaignClickDetails = function(campaignId, opts) {\n return this.getCampaignClickDetailsWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get campaign link details\n * Get click details for a specific link in a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} linkId The id for the link.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ClickDetailReport} and HTTP response\n */\n this.getCampaignClickDetailsForLinkWithHttpInfo = function(campaignId, linkId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'linkId' is set\n if (linkId === undefined || linkId === null) {\n throw new Error(\"Missing the required parameter 'linkId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'link_id': linkId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/click-details/{link_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get campaign link details\n * Get click details for a specific link in a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} linkId The id for the link.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ClickDetailReport}\n */\n this.getCampaignClickDetailsForLink = function(campaignId, linkId, opts) {\n return this.getCampaignClickDetailsForLinkWithHttpInfo(campaignId, linkId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List clicked link subscribers\n * Get information about list members who clicked on a specific link in a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} linkId The id for the link.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ClickDetailMembers} and HTTP response\n */\n this.getSubscribersInfoWithHttpInfo = function(campaignId, linkId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'linkId' is set\n if (linkId === undefined || linkId === null) {\n throw new Error(\"Missing the required parameter 'linkId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'link_id': linkId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/click-details/{link_id}/members', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List clicked link subscribers\n * Get information about list members who clicked on a specific link in a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} linkId The id for the link.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ClickDetailMembers}\n */\n this.getSubscribersInfo = function(campaignId, linkId, opts) {\n return this.getSubscribersInfoWithHttpInfo(campaignId, linkId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get clicked link subscriber\n * Get information about a specific subscriber who clicked a link in a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} linkId The id for the link.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ClickDetailMember} and HTTP response\n */\n this.getSubscriberInfoWithHttpInfo = function(campaignId, linkId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'linkId' is set\n if (linkId === undefined || linkId === null) {\n throw new Error(\"Missing the required parameter 'linkId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'link_id': linkId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/click-details/{link_id}/members/{subscriber_hash}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get clicked link subscriber\n * Get information about a specific subscriber who clicked a link in a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} linkId The id for the link.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/ClickDetailMember}\n */\n this.getSubscriberInfo = function(campaignId, linkId, subscriberHash, opts) {\n return this.getSubscriberInfoWithHttpInfo(campaignId, linkId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List domain performance stats\n * Get statistics for the top-performing email domains in a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/DomainPerformance} and HTTP response\n */\n this.getDomainPerformanceForCampaignWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/domain-performance', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List domain performance stats\n * Get statistics for the top-performing email domains in a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/DomainPerformance}\n */\n this.getDomainPerformanceForCampaign = function(campaignId, opts) {\n return this.getDomainPerformanceForCampaignWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List campaign product activity\n * Get breakdown of product activity for a campaign\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/InlineResponse2007} and HTTP response\n */\n this.getEcommerceProductActivityForCampaignWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/ecommerce-product-activity', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaign product activity\n * Get breakdown of product activity for a campaign\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {module:model/String} opts.sortField Returns files sorted by the specified field.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/InlineResponse2007}\n */\n this.getEcommerceProductActivityForCampaign = function(campaignId, opts) {\n return this.getEcommerceProductActivityForCampaignWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List EepURL activity\n * Get a summary of social activity for the campaign, tracked by EepURL.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EepurlActivity} and HTTP response\n */\n this.getEepurlActivityForCampaignWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/eepurl', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List EepURL activity\n * Get a summary of social activity for the campaign, tracked by EepURL.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EepurlActivity}\n */\n this.getEepurlActivityForCampaign = function(campaignId, opts) {\n return this.getEepurlActivityForCampaignWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List email activity\n * Get a list of member's subscriber activity in a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.since Restrict results to email activity events that occur after a specific time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EmailActivity} and HTTP response\n */\n this.getEmailActivityForCampaignWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'since': ( opts['since'] ? opts['since'] : opts['since'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/email-activity', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List email activity\n * Get a list of member's subscriber activity in a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.since Restrict results to email activity events that occur after a specific time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EmailActivity}\n */\n this.getEmailActivityForCampaign = function(campaignId, opts) {\n return this.getEmailActivityForCampaignWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get subscriber email activity\n * Get a specific list member's activity in a campaign including opens, clicks, and bounces.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {String} opts.since Restrict results to email activity events that occur after a specific time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/EmailActivity} and HTTP response\n */\n this.getEmailActivityForSubscriberWithHttpInfo = function(campaignId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'since': ( opts['since'] ? opts['since'] : opts['since'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/email-activity/{subscriber_hash}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get subscriber email activity\n * Get a specific list member's activity in a campaign including opens, clicks, and bounces.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {String} opts.since Restrict results to email activity events that occur after a specific time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/EmailActivity}\n */\n this.getEmailActivityForSubscriber = function(campaignId, subscriberHash, opts) {\n return this.getEmailActivityForSubscriberWithHttpInfo(campaignId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List top open activities\n * Get top open locations for a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/OpenLocations} and HTTP response\n */\n this.getLocationsForCampaignWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/locations', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List top open activities\n * Get top open locations for a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/OpenLocations}\n */\n this.getLocationsForCampaign = function(campaignId, opts) {\n return this.getLocationsForCampaignWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List campaign open details\n * Get detailed information about any campaign emails that were opened by a list member.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.since Restrict results to campaign open events that occur after a specific time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/OpenDetailReport} and HTTP response\n */\n this.getCampaignOpenDetailsWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'since': ( opts['since'] ? opts['since'] : opts['since'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/open-details', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaign open details\n * Get detailed information about any campaign emails that were opened by a list member.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.since Restrict results to campaign open events that occur after a specific time. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/OpenDetailReport}\n */\n this.getCampaignOpenDetails = function(campaignId, opts) {\n return this.getCampaignOpenDetailsWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get opened campaign subscriber\n * Get information about a specific subscriber who opened a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/OpenActivity} and HTTP response\n */\n this.getSubscriberInfoForOpenedCampaignWithHttpInfo = function(campaignId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/open-details/{subscriber_hash}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get opened campaign subscriber\n * Get information about a specific subscriber who opened a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/OpenActivity}\n */\n this.getSubscriberInfoForOpenedCampaign = function(campaignId, subscriberHash, opts) {\n return this.getSubscriberInfoForOpenedCampaignWithHttpInfo(campaignId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List campaign recipients\n * Get information about campaign recipients.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SentTo} and HTTP response\n */\n this.getCampaignRecipientsWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/sent-to', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List campaign recipients\n * Get information about campaign recipients.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SentTo}\n */\n this.getCampaignRecipients = function(campaignId, opts) {\n return this.getCampaignRecipientsWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get campaign recipient info\n * Get information about a specific campaign recipient.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SentTo} and HTTP response\n */\n this.getCampaignRecipientWithHttpInfo = function(campaignId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/sent-to/{subscriber_hash}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get campaign recipient info\n * Get information about a specific campaign recipient.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SentTo}\n */\n this.getCampaignRecipient = function(campaignId, subscriberHash, opts) {\n return this.getCampaignRecipientWithHttpInfo(campaignId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List child campaign reports\n * Get a list of reports with child campaigns for a specific parent campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/CampaignSubReports} and HTTP response\n */\n this.getSubReportsForCampaignWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/sub-reports', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List child campaign reports\n * Get a list of reports with child campaigns for a specific parent campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/CampaignSubReports}\n */\n this.getSubReportsForCampaign = function(campaignId, opts) {\n return this.getSubReportsForCampaignWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List unsubscribed members\n * Get information about members who have unsubscribed from a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Unsubscribes} and HTTP response\n */\n this.getUnsubscribedListForCampaignWithHttpInfo = function(campaignId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/unsubscribed', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List unsubscribed members\n * Get information about members who have unsubscribed from a specific campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Unsubscribes}\n */\n this.getUnsubscribedListForCampaign = function(campaignId, opts) {\n return this.getUnsubscribedListForCampaignWithHttpInfo(campaignId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get unsubscribed member\n * Get information about a specific list member who unsubscribed from a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Unsubscribes} and HTTP response\n */\n this.getUnsubscribedListMemberWithHttpInfo = function(campaignId, subscriberHash, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'campaignId' is set\n if (campaignId === undefined || campaignId === null) {\n throw new Error(\"Missing the required parameter 'campaignId' when calling \");\n }\n\n // verify the required parameter 'subscriberHash' is set\n if (subscriberHash === undefined || subscriberHash === null) {\n throw new Error(\"Missing the required parameter 'subscriberHash' when calling \");\n }\n\n var pathParams = {\n 'campaign_id': campaignId,\n 'subscriber_hash': subscriberHash\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/reports/{campaign_id}/unsubscribed/{subscriber_hash}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get unsubscribed member\n * Get information about a specific list member who unsubscribed from a campaign.\n * @param {String} campaignId The unique id for the campaign.\n * @param {String} subscriberHash The MD5 hash of the lowercase version of the list member's email address.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Unsubscribes}\n */\n this.getUnsubscribedListMember = function(campaignId, subscriberHash, opts) {\n return this.getUnsubscribedListMemberWithHttpInfo(campaignId, subscriberHash, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Root service.\n * @module api/RootApi\n */\n\n/**\n * Constructs a new RootApi. \n * @alias module:api/RootApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * List api root resources\n * Get links to all other resources available in the API.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/APIRoot} and HTTP response\n */\n this.getRootWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List api root resources\n * Get links to all other resources available in the API.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/APIRoot}\n */\n this.getRoot = function(opts) {\n return this.getRootWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * SearchCampaigns service.\n * @module api/SearchCampaignsApi\n */\n\n/**\n * Constructs a new SearchCampaignsApi. \n * @alias module:api/SearchCampaignsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Search campaigns\n * Search all campaigns for the specified query terms.\n * @param {String} query The search query used to filter results.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Campaigns} and HTTP response\n */\n this.searchWithHttpInfo = function(query, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'query' is set\n if (query === undefined || query === null) {\n throw new Error(\"Missing the required parameter 'query' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'query': query\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/search-campaigns', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Search campaigns\n * Search all campaigns for the specified query terms.\n * @param {String} query The search query used to filter results.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Campaigns}\n */\n this.search = function(query, opts) {\n return this.searchWithHttpInfo(query, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * SearchMembers service.\n * @module api/SearchMembersApi\n */\n\n/**\n * Constructs a new SearchMembersApi. \n * @alias module:api/SearchMembersApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Search members\n * Search for list members. This search can be restricted to a specific list, or can be used to search across all lists in an account.\n * @param {String} query The search query used to filter results. Query should be a valid email, or a string representing a contact's first or last name.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {String} opts.listId The unique id for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Members} and HTTP response\n */\n this.searchWithHttpInfo = function(query, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'query' is set\n if (query === undefined || query === null) {\n throw new Error(\"Missing the required parameter 'query' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'query': query,\n 'list_id': ( opts['listId'] ? opts['listId'] : opts['list_id'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/search-members', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Search members\n * Search for list members. This search can be restricted to a specific list, or can be used to search across all lists in an account.\n * @param {String} query The search query used to filter results. Query should be a valid email, or a string representing a contact's first or last name.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {String} opts.listId The unique id for the list.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Members}\n */\n this.search = function(query, opts) {\n return this.searchWithHttpInfo(query, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Surveys service.\n * @module api/SurveysApi\n */\n\n/**\n * Constructs a new SurveysApi. \n * @alias module:api/SurveysApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Publish a Survey\n * Publish a survey that is in draft, unpublished, or has been previously published and edited.\n * @param {String} listId The unique ID for the list.\n * @param {String} surveyId The ID of the survey.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.publishSurveyWithHttpInfo = function(listId, surveyId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'surveyId' is set\n if (surveyId === undefined || surveyId === null) {\n throw new Error(\"Missing the required parameter 'surveyId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'survey_id': surveyId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/surveys/{survey_id}/actions/publish', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Publish a Survey\n * Publish a survey that is in draft, unpublished, or has been previously published and edited.\n * @param {String} listId The unique ID for the list.\n * @param {String} surveyId The ID of the survey.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.publishSurvey = function(listId, surveyId) {\n return this.publishSurveyWithHttpInfo(listId, surveyId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Unpublish a Survey\n * Unpublish a survey that has been published.\n * @param {String} listId The unique ID for the list.\n * @param {String} surveyId The ID of the survey.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.unpublishSurveyWithHttpInfo = function(listId, surveyId) {\n var postBody = null;\n\n // verify the required parameter 'listId' is set\n if (listId === undefined || listId === null) {\n throw new Error(\"Missing the required parameter 'listId' when calling \");\n }\n\n // verify the required parameter 'surveyId' is set\n if (surveyId === undefined || surveyId === null) {\n throw new Error(\"Missing the required parameter 'surveyId' when calling \");\n }\n\n var pathParams = {\n 'list_id': listId,\n 'survey_id': surveyId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/lists/{list_id}/surveys/{survey_id}/actions/unpublish', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Unpublish a Survey\n * Unpublish a survey that has been published.\n * @param {String} listId The unique ID for the list.\n * @param {String} surveyId The ID of the survey.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.unpublishSurvey = function(listId, surveyId) {\n return this.unpublishSurveyWithHttpInfo(listId, surveyId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * TemplateFolders service.\n * @module api/TemplateFoldersApi\n */\n\n/**\n * Constructs a new TemplateFoldersApi. \n * @alias module:api/TemplateFoldersApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete template folder\n * Delete a specific template folder, and mark all the templates in the folder as 'unfiled'.\n * @param {String} folderId The unique id for the template folder.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.removeWithHttpInfo = function(folderId) {\n var postBody = null;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/template-folders/{folder_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete template folder\n * Delete a specific template folder, and mark all the templates in the folder as 'unfiled'.\n * @param {String} folderId The unique id for the template folder.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.remove = function(folderId) {\n return this.removeWithHttpInfo(folderId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List template folders\n * Get all folders used to organize templates.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TemplateFolders} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/template-folders', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List template folders\n * Get all folders used to organize templates.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TemplateFolders}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get template folder\n * Get information about a specific folder used to organize templates.\n * @param {String} folderId The unique id for the template folder.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TemplateFolder} and HTTP response\n */\n this.getWithHttpInfo = function(folderId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/template-folders/{folder_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get template folder\n * Get information about a specific folder used to organize templates.\n * @param {String} folderId The unique id for the template folder.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TemplateFolder}\n */\n this.get = function(folderId, opts) {\n return this.getWithHttpInfo(folderId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update template folder\n * Update a specific folder used to organize templates.\n * @param {String} folderId The unique id for the template folder.\n * @param {module:model/TemplateFolder2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TemplateFolder} and HTTP response\n */\n this.updateWithHttpInfo = function(folderId, body) {\n var postBody = body;\n\n // verify the required parameter 'folderId' is set\n if (folderId === undefined || folderId === null) {\n throw new Error(\"Missing the required parameter 'folderId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'folder_id': folderId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/template-folders/{folder_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update template folder\n * Update a specific folder used to organize templates.\n * @param {String} folderId The unique id for the template folder.\n * @param {module:model/TemplateFolder2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TemplateFolder}\n */\n this.update = function(folderId, body) {\n return this.updateWithHttpInfo(folderId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add template folder\n * Create a new template folder.\n * @param {module:model/TemplateFolder1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TemplateFolder} and HTTP response\n */\n this.createWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/template-folders', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add template folder\n * Create a new template folder.\n * @param {module:model/TemplateFolder1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TemplateFolder}\n */\n this.create = function(body) {\n return this.createWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * Templates service.\n * @module api/TemplatesApi\n */\n\n/**\n * Constructs a new TemplatesApi. \n * @alias module:api/TemplatesApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Delete template\n * Delete a specific template.\n * @param {String} templateId The unique id for the template.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteTemplateWithHttpInfo = function(templateId) {\n var postBody = null;\n\n // verify the required parameter 'templateId' is set\n if (templateId === undefined || templateId === null) {\n throw new Error(\"Missing the required parameter 'templateId' when calling \");\n }\n\n var pathParams = {\n 'template_id': templateId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/templates/{template_id}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete template\n * Delete a specific template.\n * @param {String} templateId The unique id for the template.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteTemplate = function(templateId) {\n return this.deleteTemplateWithHttpInfo(templateId)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List templates\n * Get a list of an account's available templates.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.createdBy The Mailchimp account user who created the template.\n * @param {String} opts.sinceDateCreated Restrict the response to templates created after the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeDateCreated Restrict the response to templates created before the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.type Limit results based on template type.\n * @param {String} opts.category Limit results based on category.\n * @param {String} opts.folderId The unique folder id.\n * @param {module:model/String} opts.sortField Returns user templates sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/Templates} and HTTP response\n */\n this.listWithHttpInfo = function(opts) {\n opts = opts || {};\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv'),\n 'count': ( opts['count'] ? opts['count'] : opts['count']),\n 'offset': ( opts['offset'] ? opts['offset'] : opts['offset']),\n 'created_by': ( opts['createdBy'] ? opts['createdBy'] : opts['created_by']),\n 'since_date_created': ( opts['sinceDateCreated'] ? opts['sinceDateCreated'] : opts['since_date_created']),\n 'before_date_created': ( opts['beforeDateCreated'] ? opts['beforeDateCreated'] : opts['before_date_created']),\n 'type': ( opts['type'] ? opts['type'] : opts['type']),\n 'category': ( opts['category'] ? opts['category'] : opts['category']),\n 'folder_id': ( opts['folderId'] ? opts['folderId'] : opts['folder_id']),\n 'sort_field': ( opts['sortField'] ? opts['sortField'] : opts['sort_field']),\n 'sort_dir': ( opts['sortDir'] ? opts['sortDir'] : opts['sort_dir'])\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/templates', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List templates\n * Get a list of an account's available templates.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @param {Number} opts.count The number of records to return. Default value is 10. Maximum value is 1000 (default to 10)\n * @param {Number} opts.offset Used for [pagination](https://mailchimp.com/developer/marketing/docs/methods-parameters/#pagination), this it the number of records from a collection to skip. Default value is 0. (default to 0)\n * @param {String} opts.createdBy The Mailchimp account user who created the template.\n * @param {String} opts.sinceDateCreated Restrict the response to templates created after the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.beforeDateCreated Restrict the response to templates created before the set date. Uses ISO 8601 time format: 2015-10-21T15:41:36+00:00.\n * @param {String} opts.type Limit results based on template type.\n * @param {String} opts.category Limit results based on category.\n * @param {String} opts.folderId The unique folder id.\n * @param {module:model/String} opts.sortField Returns user templates sorted by the specified field.\n * @param {module:model/String} opts.sortDir Determines the order direction for sorted results.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/Templates}\n */\n this.list = function(opts) {\n return this.listWithHttpInfo(opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get template info\n * Get information about a specific template.\n * @param {String} templateId The unique id for the template.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TemplateInstance} and HTTP response\n */\n this.getTemplateWithHttpInfo = function(templateId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'templateId' is set\n if (templateId === undefined || templateId === null) {\n throw new Error(\"Missing the required parameter 'templateId' when calling \");\n }\n\n var pathParams = {\n 'template_id': templateId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/templates/{template_id}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get template info\n * Get information about a specific template.\n * @param {String} templateId The unique id for the template.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TemplateInstance}\n */\n this.getTemplate = function(templateId, opts) {\n return this.getTemplateWithHttpInfo(templateId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * View default content\n * Get the sections that you can edit in a template, including each section's default content.\n * @param {String} templateId The unique id for the template.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TemplateDefaultContent} and HTTP response\n */\n this.getDefaultContentForTemplateWithHttpInfo = function(templateId, opts) {\n opts = opts || {};\n var postBody = null;\n\n // verify the required parameter 'templateId' is set\n if (templateId === undefined || templateId === null) {\n throw new Error(\"Missing the required parameter 'templateId' when calling \");\n }\n\n var pathParams = {\n 'template_id': templateId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n 'fields': this.apiClient.buildCollectionParam(opts['fields'] ? opts['fields'] : opts['fields'], 'csv'),\n 'exclude_fields': this.apiClient.buildCollectionParam(opts['excludeFields'] ? opts['excludeFields'] : opts['exclude_fields'], 'csv')\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/templates/{template_id}/default-content', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * View default content\n * Get the sections that you can edit in a template, including each section's default content.\n * @param {String} templateId The unique id for the template.\n * @param {Object} opts Optional parameters\n * @param {Array.} opts.fields A comma-separated list of fields to return. Reference parameters of sub-objects with dot notation.\n * @param {Array.} opts.excludeFields A comma-separated list of fields to exclude. Reference parameters of sub-objects with dot notation.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TemplateDefaultContent}\n */\n this.getDefaultContentForTemplate = function(templateId, opts) {\n return this.getDefaultContentForTemplateWithHttpInfo(templateId, opts)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Update template\n * Update the name, HTML, or `folder_id` of an existing template.\n * @param {String} templateId The unique id for the template.\n * @param {module:model/TemplateInstance2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TemplateInstance} and HTTP response\n */\n this.updateTemplateWithHttpInfo = function(templateId, body) {\n var postBody = body;\n\n // verify the required parameter 'templateId' is set\n if (templateId === undefined || templateId === null) {\n throw new Error(\"Missing the required parameter 'templateId' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'template_id': templateId\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/templates/{template_id}', 'PATCH',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Update template\n * Update the name, HTML, or `folder_id` of an existing template.\n * @param {String} templateId The unique id for the template.\n * @param {module:model/TemplateInstance2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TemplateInstance}\n */\n this.updateTemplate = function(templateId, body) {\n return this.updateTemplateWithHttpInfo(templateId, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Add template\n * Create a new template for the account. Only Classic templates are supported.\n * @param {module:model/TemplateInstance1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/TemplateInstance} and HTTP response\n */\n this.createWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/templates', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add template\n * Create a new template for the account. Only Classic templates are supported.\n * @param {module:model/TemplateInstance1} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/TemplateInstance}\n */\n this.create = function(body) {\n return this.createWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","/*\n * Mailchimp Marketing API\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * OpenAPI spec version: 3.0.80\n * Contact: apihelp@mailchimp.com\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n *\n * Swagger Codegen version: 2.4.12\n *\n * Do not edit the class manually.\n *\n */\n\n\n\nvar ApiClient = require('../ApiClient');\n\n/**\n * VerifiedDomains service.\n * @module api/VerifiedDomainsApi\n */\n\n/**\n * Constructs a new VerifiedDomainsApi. \n * @alias module:api/VerifiedDomainsApi\n * @class\n * @param {module:ApiClient} apiClient Optional API client implementation to use,\n * default to {@link module:ApiClient#instance} if unspecified.\n */\nmodule.exports = function(apiClient) {\n this.apiClient = apiClient || ApiClient.instance;\n\n /**\n * Add domain to account\n * Add a domain to the account.\n * @param {module:model/VerifiedDomains2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/VerifiedDomains} and HTTP response\n */\n this.createVerifiedDomainWithHttpInfo = function(body) {\n var postBody = body;\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/verified-domains', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Add domain to account\n * Add a domain to the account.\n * @param {module:model/VerifiedDomains2} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/VerifiedDomains}\n */\n this.createVerifiedDomain = function(body) {\n return this.createVerifiedDomainWithHttpInfo(body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Delete domain\n * Delete a verified domain from the account.\n * @param {String} domainName The domain name.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response\n */\n this.deleteDomainWithHttpInfo = function(domainName) {\n var postBody = null;\n\n // verify the required parameter 'domainName' is set\n if (domainName === undefined || domainName === null) {\n throw new Error(\"Missing the required parameter 'domainName' when calling \");\n }\n\n var pathParams = {\n 'domain_name': domainName\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/verified-domains/{domain_name}', 'DELETE',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Delete domain\n * Delete a verified domain from the account.\n * @param {String} domainName The domain name.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}\n */\n this.deleteDomain = function(domainName) {\n return this.deleteDomainWithHttpInfo(domainName)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Get domain info\n * Get the details for a single domain on the account.\n * @param {String} domainName The domain name.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/VerifiedDomains} and HTTP response\n */\n this.getDomainWithHttpInfo = function(domainName) {\n var postBody = null;\n\n // verify the required parameter 'domainName' is set\n if (domainName === undefined || domainName === null) {\n throw new Error(\"Missing the required parameter 'domainName' when calling \");\n }\n\n var pathParams = {\n 'domain_name': domainName\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/verified-domains/{domain_name}', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Get domain info\n * Get the details for a single domain on the account.\n * @param {String} domainName The domain name.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/VerifiedDomains}\n */\n this.getDomain = function(domainName) {\n return this.getDomainWithHttpInfo(domainName)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * List sending domains\n * Get all of the sending domains on the account.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/VerifiedDomains1} and HTTP response\n */\n this.getVerifiedDomainsAllWithHttpInfo = function() {\n var postBody = null;\n\n var pathParams = {\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/verified-domains', 'GET',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * List sending domains\n * Get all of the sending domains on the account.\n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/VerifiedDomains1}\n */\n this.getVerifiedDomainsAll = function() {\n return this.getVerifiedDomainsAllWithHttpInfo()\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n\n /**\n * Verify domain\n * Verify a domain for sending.\n * @param {String} domainName The domain name.\n * @param {module:model/VerifyADomainForSending_} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/VerifiedDomains} and HTTP response\n */\n this.submitDomainVerificationWithHttpInfo = function(domainName, body) {\n var postBody = body;\n\n // verify the required parameter 'domainName' is set\n if (domainName === undefined || domainName === null) {\n throw new Error(\"Missing the required parameter 'domainName' when calling \");\n }\n\n // verify the required parameter 'body' is set\n if (body === undefined || body === null) {\n throw new Error(\"Missing the required parameter 'body' when calling \");\n }\n\n var pathParams = {\n 'domain_name': domainName\n };\n \n /*\n The following block building queryParams is going to look a little odd, we're going look for values in $opts with both\n camelCase and snake_case format (which will be the same if singular word). This is because the API docs use snake_case\n but early versions of these SDKs used camelCase. So to be backward compatible we'll use both. \n */\n var queryParams = {\n };\n var headerParams = {\n };\n\n var formParams = {\n };\n\n var authNames = ['basicAuth'];\n var contentTypes = ['application/json'];\n var accepts = ['application/json', 'application/problem+json'];\n var returnType = 'application/json';\n\n return this.apiClient.callApi(\n '/verified-domains/{domain_name}/actions/verify', 'POST',\n pathParams, queryParams, headerParams, formParams, postBody,\n authNames, contentTypes, accepts, returnType\n );\n }\n /**\n * Verify domain\n * Verify a domain for sending.\n * @param {String} domainName The domain name.\n * @param {module:model/VerifyADomainForSending_} body \n * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/VerifiedDomains}\n */\n this.submitDomainVerification = function(domainName, body) {\n return this.submitDomainVerificationWithHttpInfo(domainName, body)\n .then(function(response_and_data) {\n return response_and_data.data;\n });\n }\n};\n","var ApiClient = require('./ApiClient');\n\nmodule.exports = ApiClient.instance;\n","/*!\r\n * ScrollMagic v2.0.8 (2020-08-14)\r\n * The javascript library for magical scroll interactions.\r\n * (c) 2020 Jan Paepke (@janpaepke)\r\n * Project Website: http://scrollmagic.io\r\n * \r\n * @version 2.0.8\r\n * @license Dual licensed under MIT license and GPL.\r\n * @author Jan Paepke - e-mail@janpaepke.de\r\n *\r\n * @file ScrollMagic main library.\r\n */\r\n/**\r\n * @namespace ScrollMagic\r\n */\r\n(function (root, factory) {\r\n\tif (typeof define === 'function' && define.amd) {\r\n\t\t// AMD. Register as an anonymous module.\r\n\t\tdefine(factory);\r\n\t} else if (typeof exports === 'object') {\r\n\t\t// CommonJS\r\n\t\tmodule.exports = factory();\r\n\t} else {\r\n\t\t// Browser global\r\n\t\troot.ScrollMagic = factory();\r\n\t}\r\n}(this, function () {\r\n\t\"use strict\";\r\n\r\n\tvar ScrollMagic = function () {\r\n\t\t_util.log(2, '(COMPATIBILITY NOTICE) -> As of ScrollMagic 2.0.0 you need to use \\'new ScrollMagic.Controller()\\' to create a new controller instance. Use \\'new ScrollMagic.Scene()\\' to instance a scene.');\r\n\t};\r\n\r\n\tScrollMagic.version = \"2.0.8\";\r\n\r\n\t// TODO: temporary workaround for chrome's scroll jitter bug\r\n\tif (typeof (window) !== 'undefined') {\r\n\t\twindow.addEventListener(\"mousewheel\", void(0));\r\n\t}\r\n\r\n\t// global const\r\n\tvar PIN_SPACER_ATTRIBUTE = \"data-scrollmagic-pin-spacer\";\r\n\r\n\t/**\r\n\t * The main class that is needed once per scroll container.\r\n\t *\r\n\t * @class\r\n\t *\r\n\t * @example\r\n\t * // basic initialization\r\n\t * var controller = new ScrollMagic.Controller();\r\n\t *\r\n\t * // passing options\r\n\t * var controller = new ScrollMagic.Controller({container: \"#myContainer\", loglevel: 3});\r\n\t *\r\n\t * @param {object} [options] - An object containing one or more options for the controller.\r\n\t * @param {(string|object)} [options.container=window] - A selector, DOM object that references the main container for scrolling.\r\n\t * @param {boolean} [options.vertical=true] - Sets the scroll mode to vertical (`true`) or horizontal (`false`) scrolling.\r\n\t * @param {object} [options.globalSceneOptions={}] - These options will be passed to every Scene that is added to the controller using the addScene method. For more information on Scene options see {@link ScrollMagic.Scene}.\r\n\t * @param {number} [options.loglevel=2] Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic.\r\n\t\t\t\t\t\t\t\t\t\t\t ** `0` => silent\r\n\t\t\t\t\t\t\t\t\t\t\t ** `1` => errors\r\n\t\t\t\t\t\t\t\t\t\t\t ** `2` => errors, warnings\r\n\t\t\t\t\t\t\t\t\t\t\t ** `3` => errors, warnings, debuginfo\r\n\t * @param {boolean} [options.refreshInterval=100] - Some changes don't call events by default, like changing the container size or moving a scene trigger element. \r\n\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t This interval polls these parameters to fire the necessary events. \r\n\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t If you don't use custom containers, trigger elements or have static layouts, where the positions of the trigger elements don't change, you can set this to 0 disable interval checking and improve performance.\r\n\t *\r\n\t */\r\n\tScrollMagic.Controller = function (options) {\r\n\t\t/*\r\n\t\t * ----------------------------------------------------------------\r\n\t\t * settings\r\n\t\t * ----------------------------------------------------------------\r\n\t\t */\r\n\t\tvar\r\n\t\t\tNAMESPACE = 'ScrollMagic.Controller',\r\n\t\t\tSCROLL_DIRECTION_FORWARD = 'FORWARD',\r\n\t\t\tSCROLL_DIRECTION_REVERSE = 'REVERSE',\r\n\t\t\tSCROLL_DIRECTION_PAUSED = 'PAUSED',\r\n\t\t\tDEFAULT_OPTIONS = CONTROLLER_OPTIONS.defaults;\r\n\r\n\t\t/*\r\n\t\t * ----------------------------------------------------------------\r\n\t\t * private vars\r\n\t\t * ----------------------------------------------------------------\r\n\t\t */\r\n\t\tvar\r\n\t\t\tController = this,\r\n\t\t\t_options = _util.extend({}, DEFAULT_OPTIONS, options),\r\n\t\t\t_sceneObjects = [],\r\n\t\t\t_updateScenesOnNextCycle = false, // can be boolean (true => all scenes) or an array of scenes to be updated\r\n\t\t\t_scrollPos = 0,\r\n\t\t\t_scrollDirection = SCROLL_DIRECTION_PAUSED,\r\n\t\t\t_isDocument = true,\r\n\t\t\t_viewPortSize = 0,\r\n\t\t\t_enabled = true,\r\n\t\t\t_updateTimeout,\r\n\t\t\t_refreshTimeout;\r\n\r\n\t\t/*\r\n\t\t * ----------------------------------------------------------------\r\n\t\t * private functions\r\n\t\t * ----------------------------------------------------------------\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * Internal constructor function of the ScrollMagic Controller\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar construct = function () {\r\n\t\t\tfor (var key in _options) {\r\n\t\t\t\tif (!DEFAULT_OPTIONS.hasOwnProperty(key)) {\r\n\t\t\t\t\tlog(2, \"WARNING: Unknown option \\\"\" + key + \"\\\"\");\r\n\t\t\t\t\tdelete _options[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_options.container = _util.get.elements(_options.container)[0];\r\n\t\t\t// check ScrollContainer\r\n\t\t\tif (!_options.container) {\r\n\t\t\t\tlog(1, \"ERROR creating object \" + NAMESPACE + \": No valid scroll container supplied\");\r\n\t\t\t\tthrow NAMESPACE + \" init failed.\"; // cancel\r\n\t\t\t}\r\n\t\t\t_isDocument = _options.container === window || _options.container === document.body || !document.body.contains(_options.container);\r\n\t\t\t// normalize to window\r\n\t\t\tif (_isDocument) {\r\n\t\t\t\t_options.container = window;\r\n\t\t\t}\r\n\t\t\t// update container size immediately\r\n\t\t\t_viewPortSize = getViewportSize();\r\n\t\t\t// set event handlers\r\n\t\t\t_options.container.addEventListener(\"resize\", onChange);\r\n\t\t\t_options.container.addEventListener(\"scroll\", onChange);\r\n\r\n\t\t\tvar ri = parseInt(_options.refreshInterval, 10);\r\n\t\t\t_options.refreshInterval = _util.type.Number(ri) ? ri : DEFAULT_OPTIONS.refreshInterval;\r\n\t\t\tscheduleRefresh();\r\n\r\n\t\t\tlog(3, \"added new \" + NAMESPACE + \" controller (v\" + ScrollMagic.version + \")\");\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Schedule the next execution of the refresh function\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar scheduleRefresh = function () {\r\n\t\t\tif (_options.refreshInterval > 0) {\r\n\t\t\t\t_refreshTimeout = window.setTimeout(refresh, _options.refreshInterval);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Default function to get scroll pos - overwriteable using `Controller.scrollPos(newFunction)`\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar getScrollPos = function () {\r\n\t\t\treturn _options.vertical ? _util.get.scrollTop(_options.container) : _util.get.scrollLeft(_options.container);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Returns the current viewport Size (width vor horizontal, height for vertical)\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar getViewportSize = function () {\r\n\t\t\treturn _options.vertical ? _util.get.height(_options.container) : _util.get.width(_options.container);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Default function to set scroll pos - overwriteable using `Controller.scrollTo(newFunction)`\r\n\t\t * Make available publicly for pinned mousewheel workaround.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar setScrollPos = this._setScrollPos = function (pos) {\r\n\t\t\tif (_options.vertical) {\r\n\t\t\t\tif (_isDocument) {\r\n\t\t\t\t\twindow.scrollTo(_util.get.scrollLeft(), pos);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t_options.container.scrollTop = pos;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (_isDocument) {\r\n\t\t\t\t\twindow.scrollTo(pos, _util.get.scrollTop());\r\n\t\t\t\t} else {\r\n\t\t\t\t\t_options.container.scrollLeft = pos;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Handle updates in cycles instead of on scroll (performance)\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar updateScenes = function () {\r\n\t\t\tif (_enabled && _updateScenesOnNextCycle) {\r\n\t\t\t\t// determine scenes to update\r\n\t\t\t\tvar scenesToUpdate = _util.type.Array(_updateScenesOnNextCycle) ? _updateScenesOnNextCycle : _sceneObjects.slice(0);\r\n\t\t\t\t// reset scenes\r\n\t\t\t\t_updateScenesOnNextCycle = false;\r\n\t\t\t\tvar oldScrollPos = _scrollPos;\r\n\t\t\t\t// update scroll pos now instead of onChange, as it might have changed since scheduling (i.e. in-browser smooth scroll)\r\n\t\t\t\t_scrollPos = Controller.scrollPos();\r\n\t\t\t\tvar deltaScroll = _scrollPos - oldScrollPos;\r\n\t\t\t\tif (deltaScroll !== 0) { // scroll position changed?\r\n\t\t\t\t\t_scrollDirection = (deltaScroll > 0) ? SCROLL_DIRECTION_FORWARD : SCROLL_DIRECTION_REVERSE;\r\n\t\t\t\t}\r\n\t\t\t\t// reverse order of scenes if scrolling reverse\r\n\t\t\t\tif (_scrollDirection === SCROLL_DIRECTION_REVERSE) {\r\n\t\t\t\t\tscenesToUpdate.reverse();\r\n\t\t\t\t}\r\n\t\t\t\t// update scenes\r\n\t\t\t\tscenesToUpdate.forEach(function (scene, index) {\r\n\t\t\t\t\tlog(3, \"updating Scene \" + (index + 1) + \"/\" + scenesToUpdate.length + \" (\" + _sceneObjects.length + \" total)\");\r\n\t\t\t\t\tscene.update(true);\r\n\t\t\t\t});\r\n\t\t\t\tif (scenesToUpdate.length === 0 && _options.loglevel >= 3) {\r\n\t\t\t\t\tlog(3, \"updating 0 Scenes (nothing added to controller)\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Initializes rAF callback\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar debounceUpdate = function () {\r\n\t\t\t_updateTimeout = _util.rAF(updateScenes);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Handles Container changes\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar onChange = function (e) {\r\n\t\t\tlog(3, \"event fired causing an update:\", e.type);\r\n\t\t\tif (e.type == \"resize\") {\r\n\t\t\t\t// resize\r\n\t\t\t\t_viewPortSize = getViewportSize();\r\n\t\t\t\t_scrollDirection = SCROLL_DIRECTION_PAUSED;\r\n\t\t\t}\r\n\t\t\t// schedule update\r\n\t\t\tif (_updateScenesOnNextCycle !== true) {\r\n\t\t\t\t_updateScenesOnNextCycle = true;\r\n\t\t\t\tdebounceUpdate();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar refresh = function () {\r\n\t\t\tif (!_isDocument) {\r\n\t\t\t\t// simulate resize event. Only works for viewport relevant param (performance)\r\n\t\t\t\tif (_viewPortSize != getViewportSize()) {\r\n\t\t\t\t\tvar resizeEvent;\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tresizeEvent = new Event('resize', {\r\n\t\t\t\t\t\t\tbubbles: false,\r\n\t\t\t\t\t\t\tcancelable: false\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} catch (e) { // stupid IE\r\n\t\t\t\t\t\tresizeEvent = document.createEvent(\"Event\");\r\n\t\t\t\t\t\tresizeEvent.initEvent(\"resize\", false, false);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_options.container.dispatchEvent(resizeEvent);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t_sceneObjects.forEach(function (scene, index) { // refresh all scenes\r\n\t\t\t\tscene.refresh();\r\n\t\t\t});\r\n\t\t\tscheduleRefresh();\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Send a debug message to the console.\r\n\t\t * provided publicly with _log for plugins\r\n\t\t * @private\r\n\t\t *\r\n\t\t * @param {number} loglevel - The loglevel required to initiate output for the message.\r\n\t\t * @param {...mixed} output - One or more variables that should be passed to the console.\r\n\t\t */\r\n\t\tvar log = this._log = function (loglevel, output) {\r\n\t\t\tif (_options.loglevel >= loglevel) {\r\n\t\t\t\tArray.prototype.splice.call(arguments, 1, 0, \"(\" + NAMESPACE + \") ->\");\r\n\t\t\t\t_util.log.apply(window, arguments);\r\n\t\t\t}\r\n\t\t};\r\n\t\t// for scenes we have getters for each option, but for the controller we don't, so we need to make it available externally for plugins\r\n\t\tthis._options = _options;\r\n\r\n\t\t/**\r\n\t\t * Sort scenes in ascending order of their start offset.\r\n\t\t * @private\r\n\t\t *\r\n\t\t * @param {array} ScenesArray - an array of ScrollMagic Scenes that should be sorted\r\n\t\t * @return {array} The sorted array of Scenes.\r\n\t\t */\r\n\t\tvar sortScenes = function (ScenesArray) {\r\n\t\t\tif (ScenesArray.length <= 1) {\r\n\t\t\t\treturn ScenesArray;\r\n\t\t\t} else {\r\n\t\t\t\tvar scenes = ScenesArray.slice(0);\r\n\t\t\t\tscenes.sort(function (a, b) {\r\n\t\t\t\t\treturn a.scrollOffset() > b.scrollOffset() ? 1 : -1;\r\n\t\t\t\t});\r\n\t\t\t\treturn scenes;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * ----------------------------------------------------------------\r\n\t\t * public functions\r\n\t\t * ----------------------------------------------------------------\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * Add one ore more scene(s) to the controller. \r\n\t\t * This is the equivalent to `Scene.addTo(controller)`.\r\n\t\t * @public\r\n\t\t * @example\r\n\t\t * // with a previously defined scene\r\n\t\t * controller.addScene(scene);\r\n\t\t *\r\n\t\t * // with a newly created scene.\r\n\t\t * controller.addScene(new ScrollMagic.Scene({duration : 0}));\r\n\t\t *\r\n\t\t * // adding multiple scenes\r\n\t\t * controller.addScene([scene, scene2, new ScrollMagic.Scene({duration : 0})]);\r\n\t\t *\r\n\t\t * @param {(ScrollMagic.Scene|array)} newScene - ScrollMagic Scene or Array of Scenes to be added to the controller.\r\n\t\t * @return {Controller} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.addScene = function (newScene) {\r\n\t\t\tif (_util.type.Array(newScene)) {\r\n\t\t\t\tnewScene.forEach(function (scene, index) {\r\n\t\t\t\t\tController.addScene(scene);\r\n\t\t\t\t});\r\n\t\t\t} else if (newScene instanceof ScrollMagic.Scene) {\r\n\t\t\t\tif (newScene.controller() !== Controller) {\r\n\t\t\t\t\tnewScene.addTo(Controller);\r\n\t\t\t\t} else if (_sceneObjects.indexOf(newScene) < 0) {\r\n\t\t\t\t\t// new scene\r\n\t\t\t\t\t_sceneObjects.push(newScene); // add to array\r\n\t\t\t\t\t_sceneObjects = sortScenes(_sceneObjects); // sort\r\n\t\t\t\t\tnewScene.on(\"shift.controller_sort\", function () { // resort whenever scene moves\r\n\t\t\t\t\t\t_sceneObjects = sortScenes(_sceneObjects);\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// insert Global defaults.\r\n\t\t\t\t\tfor (var key in _options.globalSceneOptions) {\r\n\t\t\t\t\t\tif (newScene[key]) {\r\n\t\t\t\t\t\t\tnewScene[key].call(newScene, _options.globalSceneOptions[key]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlog(3, \"adding Scene (now \" + _sceneObjects.length + \" total)\");\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tlog(1, \"ERROR: invalid argument supplied for '.addScene()'\");\r\n\t\t\t}\r\n\t\t\treturn Controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Remove one ore more scene(s) from the controller. \r\n\t\t * This is the equivalent to `Scene.remove()`.\r\n\t\t * @public\r\n\t\t * @example\r\n\t\t * // remove a scene from the controller\r\n\t\t * controller.removeScene(scene);\r\n\t\t *\r\n\t\t * // remove multiple scenes from the controller\r\n\t\t * controller.removeScene([scene, scene2, scene3]);\r\n\t\t *\r\n\t\t * @param {(ScrollMagic.Scene|array)} Scene - ScrollMagic Scene or Array of Scenes to be removed from the controller.\r\n\t\t * @returns {Controller} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.removeScene = function (Scene) {\r\n\t\t\tif (_util.type.Array(Scene)) {\r\n\t\t\t\tScene.forEach(function (scene, index) {\r\n\t\t\t\t\tController.removeScene(scene);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tvar index = _sceneObjects.indexOf(Scene);\r\n\t\t\t\tif (index > -1) {\r\n\t\t\t\t\tScene.off(\"shift.controller_sort\");\r\n\t\t\t\t\t_sceneObjects.splice(index, 1);\r\n\t\t\t\t\tlog(3, \"removing Scene (now \" + _sceneObjects.length + \" left)\");\r\n\t\t\t\t\tScene.remove();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn Controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t * Update one ore more scene(s) according to the scroll position of the container. \r\n\t * This is the equivalent to `Scene.update()`. \r\n\t * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container. \r\n\t * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress. \r\n\t * _**Note:** This method gets called constantly whenever Controller detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._\r\n\t * @public\r\n\t * @example\r\n\t * // update a specific scene on next cycle\r\n \t * controller.updateScene(scene);\r\n \t *\r\n\t * // update a specific scene immediately\r\n\t * controller.updateScene(scene, true);\r\n \t *\r\n\t * // update multiple scenes scene on next cycle\r\n\t * controller.updateScene([scene1, scene2, scene3]);\r\n\t *\r\n\t * @param {ScrollMagic.Scene} Scene - ScrollMagic Scene or Array of Scenes that is/are supposed to be updated.\r\n\t * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle. \r\n\t \t\t\t\t\t\t\t\t\t\t This is useful when changing multiple properties of the scene - this way it will only be updated once all new properties are set (updateScenes).\r\n\t * @return {Controller} Parent object for chaining.\r\n\t */\r\n\t\tthis.updateScene = function (Scene, immediately) {\r\n\t\t\tif (_util.type.Array(Scene)) {\r\n\t\t\t\tScene.forEach(function (scene, index) {\r\n\t\t\t\t\tController.updateScene(scene, immediately);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tif (immediately) {\r\n\t\t\t\t\tScene.update(true);\r\n\t\t\t\t} else if (_updateScenesOnNextCycle !== true && Scene instanceof ScrollMagic.Scene) { // if _updateScenesOnNextCycle is true, all connected scenes are already scheduled for update\r\n\t\t\t\t\t// prep array for next update cycle\r\n\t\t\t\t\t_updateScenesOnNextCycle = _updateScenesOnNextCycle || [];\r\n\t\t\t\t\tif (_updateScenesOnNextCycle.indexOf(Scene) == -1) {\r\n\t\t\t\t\t\t_updateScenesOnNextCycle.push(Scene);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_updateScenesOnNextCycle = sortScenes(_updateScenesOnNextCycle); // sort\r\n\t\t\t\t\tdebounceUpdate();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn Controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Updates the controller params and calls updateScene on every scene, that is attached to the controller. \r\n\t\t * See `Controller.updateScene()` for more information about what this means. \r\n\t\t * In most cases you will not need this function, as it is called constantly, whenever ScrollMagic detects a state change event, like resize or scroll. \r\n\t\t * The only application for this method is when ScrollMagic fails to detect these events. \r\n\t\t * One application is with some external scroll libraries (like iScroll) that move an internal container to a negative offset instead of actually scrolling. In this case the update on the controller needs to be called whenever the child container's position changes.\r\n\t\t * For this case there will also be the need to provide a custom function to calculate the correct scroll position. See `Controller.scrollPos()` for details.\r\n\t\t * @public\r\n\t\t * @example\r\n\t\t * // update the controller on next cycle (saves performance due to elimination of redundant updates)\r\n\t\t * controller.update();\r\n\t\t *\r\n\t\t * // update the controller immediately\r\n\t\t * controller.update(true);\r\n\t\t *\r\n\t\t * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance)\r\n\t\t * @return {Controller} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.update = function (immediately) {\r\n\t\t\tonChange({\r\n\t\t\t\ttype: \"resize\"\r\n\t\t\t}); // will update size and set _updateScenesOnNextCycle to true\r\n\t\t\tif (immediately) {\r\n\t\t\t\tupdateScenes();\r\n\t\t\t}\r\n\t\t\treturn Controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Scroll to a numeric scroll offset, a DOM element, the start of a scene or provide an alternate method for scrolling. \r\n\t\t * For vertical controllers it will change the top scroll offset and for horizontal applications it will change the left offset.\r\n\t\t * @public\r\n\t\t *\r\n\t\t * @since 1.1.0\r\n\t\t * @example\r\n\t\t * // scroll to an offset of 100\r\n\t\t * controller.scrollTo(100);\r\n\t\t *\r\n\t\t * // scroll to a DOM element\r\n\t\t * controller.scrollTo(\"#anchor\");\r\n\t\t *\r\n\t\t * // scroll to the beginning of a scene\r\n\t\t * var scene = new ScrollMagic.Scene({offset: 200});\r\n\t\t * controller.scrollTo(scene);\r\n\t\t *\r\n\t\t * // define a new scroll position modification function (jQuery animate instead of jump)\r\n\t\t * controller.scrollTo(function (newScrollPos) {\r\n\t\t *\t$(\"html, body\").animate({scrollTop: newScrollPos});\r\n\t\t * });\r\n\t\t * controller.scrollTo(100); // call as usual, but the new function will be used instead\r\n\t\t *\r\n\t\t * // define a new scroll function with an additional parameter\r\n\t\t * controller.scrollTo(function (newScrollPos, message) {\r\n\t\t * console.log(message);\r\n\t\t *\t$(this).animate({scrollTop: newScrollPos});\r\n\t\t * });\r\n\t\t * // call as usual, but supply an extra parameter to the defined custom function\r\n\t\t * controller.scrollTo(100, \"my message\");\r\n\t\t *\r\n\t\t * // define a new scroll function with an additional parameter containing multiple variables\r\n\t\t * controller.scrollTo(function (newScrollPos, options) {\r\n\t\t * someGlobalVar = options.a + options.b;\r\n\t\t *\t$(this).animate({scrollTop: newScrollPos});\r\n\t\t * });\r\n\t\t * // call as usual, but supply an extra parameter containing multiple options\r\n\t\t * controller.scrollTo(100, {a: 1, b: 2});\r\n\t\t *\r\n\t\t * // define a new scroll function with a callback supplied as an additional parameter\r\n\t\t * controller.scrollTo(function (newScrollPos, callback) {\r\n\t\t *\t$(this).animate({scrollTop: newScrollPos}, 400, \"swing\", callback);\r\n\t\t * });\r\n\t\t * // call as usual, but supply an extra parameter, which is used as a callback in the previously defined custom scroll function\r\n\t\t * controller.scrollTo(100, function() {\r\n\t\t *\tconsole.log(\"scroll has finished.\");\r\n\t\t * });\r\n\t\t *\r\n\t\t * @param {mixed} scrollTarget - The supplied argument can be one of these types:\r\n\t\t * 1. `number` -> The container will scroll to this new scroll offset.\r\n\t\t * 2. `string` or `object` -> Can be a selector or a DOM object. \r\n\t\t * The container will scroll to the position of this element.\r\n\t\t * 3. `ScrollMagic Scene` -> The container will scroll to the start of this scene.\r\n\t\t * 4. `function` -> This function will be used for future scroll position modifications. \r\n\t\t * This provides a way for you to change the behaviour of scrolling and adding new behaviour like animation. The function receives the new scroll position as a parameter and a reference to the container element using `this`. \r\n\t\t * It may also optionally receive an optional additional parameter (see below) \r\n\t\t * _**NOTE:** \r\n\t\t * All other options will still work as expected, using the new function to scroll._\r\n\t\t * @param {mixed} [additionalParameter] - If a custom scroll function was defined (see above 4.), you may want to supply additional parameters to it, when calling it. You can do this using this parameter – see examples for details. Please note, that this parameter will have no effect, if you use the default scrolling function.\r\n\t\t * @returns {Controller} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.scrollTo = function (scrollTarget, additionalParameter) {\r\n\t\t\tif (_util.type.Number(scrollTarget)) { // excecute\r\n\t\t\t\tsetScrollPos.call(_options.container, scrollTarget, additionalParameter);\r\n\t\t\t} else if (scrollTarget instanceof ScrollMagic.Scene) { // scroll to scene\r\n\t\t\t\tif (scrollTarget.controller() === Controller) { // check if the controller is associated with this scene\r\n\t\t\t\t\tController.scrollTo(scrollTarget.scrollOffset(), additionalParameter);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlog(2, \"scrollTo(): The supplied scene does not belong to this controller. Scroll cancelled.\", scrollTarget);\r\n\t\t\t\t}\r\n\t\t\t} else if (_util.type.Function(scrollTarget)) { // assign new scroll function\r\n\t\t\t\tsetScrollPos = scrollTarget;\r\n\t\t\t} else { // scroll to element\r\n\t\t\t\tvar elem = _util.get.elements(scrollTarget)[0];\r\n\t\t\t\tif (elem) {\r\n\t\t\t\t\t// if parent is pin spacer, use spacer position instead so correct start position is returned for pinned elements.\r\n\t\t\t\t\twhile (elem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {\r\n\t\t\t\t\t\telem = elem.parentNode;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar\r\n\t\t\t\t\t\tparam = _options.vertical ? \"top\" : \"left\", // which param is of interest ?\r\n\t\t\t\t\t\tcontainerOffset = _util.get.offset(_options.container), // container position is needed because element offset is returned in relation to document, not in relation to container.\r\n\t\t\t\t\t\telementOffset = _util.get.offset(elem);\r\n\r\n\t\t\t\t\tif (!_isDocument) { // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent\r\n\t\t\t\t\t\tcontainerOffset[param] -= Controller.scrollPos();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tController.scrollTo(elementOffset[param] - containerOffset[param], additionalParameter);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlog(2, \"scrollTo(): The supplied argument is invalid. Scroll cancelled.\", scrollTarget);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn Controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** the current scrollPosition or **Set** a new method to calculate it. \r\n\t\t * -> **GET**:\r\n\t\t * When used as a getter this function will return the current scroll position. \r\n\t\t * To get a cached value use Controller.info(\"scrollPos\"), which will be updated in the update cycle. \r\n\t\t * For vertical controllers it will return the top scroll offset and for horizontal applications it will return the left offset.\r\n\t\t *\r\n\t\t * -> **SET**:\r\n\t\t * When used as a setter this method prodes a way to permanently overwrite the controller's scroll position calculation. \r\n\t\t * A typical usecase is when the scroll position is not reflected by the containers scrollTop or scrollLeft values, but for example by the inner offset of a child container. \r\n\t\t * Moving a child container inside a parent is a commonly used method for several scrolling frameworks, including iScroll. \r\n\t\t * By providing an alternate calculation function you can make sure ScrollMagic receives the correct scroll position. \r\n\t\t * Please also bear in mind that your function should return y values for vertical scrolls an x for horizontals.\r\n\t\t *\r\n\t\t * To change the current scroll position please use `Controller.scrollTo()`.\r\n\t\t * @public\r\n\t\t *\r\n\t\t * @example\r\n\t\t * // get the current scroll Position\r\n\t\t * var scrollPos = controller.scrollPos();\r\n\t\t *\r\n\t\t * // set a new scroll position calculation method\r\n\t\t * controller.scrollPos(function () {\r\n\t\t *\treturn this.info(\"vertical\") ? -mychildcontainer.y : -mychildcontainer.x\r\n\t\t * });\r\n\t\t *\r\n\t\t * @param {function} [scrollPosMethod] - The function to be used for the scroll position calculation of the container.\r\n\t\t * @returns {(number|Controller)} Current scroll position or parent object for chaining.\r\n\t\t */\r\n\t\tthis.scrollPos = function (scrollPosMethod) {\r\n\t\t\tif (!arguments.length) { // get\r\n\t\t\t\treturn getScrollPos.call(Controller);\r\n\t\t\t} else { // set\r\n\t\t\t\tif (_util.type.Function(scrollPosMethod)) {\r\n\t\t\t\t\tgetScrollPos = scrollPosMethod;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlog(2, \"Provided value for method 'scrollPos' is not a function. To change the current scroll position use 'scrollTo()'.\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn Controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** all infos or one in particular about the controller.\r\n\t\t * @public\r\n\t\t * @example\r\n\t\t * // returns the current scroll position (number)\r\n\t\t * var scrollPos = controller.info(\"scrollPos\");\r\n\t\t *\r\n\t\t * // returns all infos as an object\r\n\t\t * var infos = controller.info();\r\n\t\t *\r\n\t\t * @param {string} [about] - If passed only this info will be returned instead of an object containing all. \r\n\t\t \t\t\t\t\t\t\t Valid options are:\r\n\t\t \t\t\t\t\t\t\t ** `\"size\"` => the current viewport size of the container\r\n\t\t \t\t\t\t\t\t\t ** `\"vertical\"` => true if vertical scrolling, otherwise false\r\n\t\t \t\t\t\t\t\t\t ** `\"scrollPos\"` => the current scroll position\r\n\t\t \t\t\t\t\t\t\t ** `\"scrollDirection\"` => the last known direction of the scroll\r\n\t\t \t\t\t\t\t\t\t ** `\"container\"` => the container element\r\n\t\t \t\t\t\t\t\t\t ** `\"isDocument\"` => true if container element is the document.\r\n\t\t * @returns {(mixed|object)} The requested info(s).\r\n\t\t */\r\n\t\tthis.info = function (about) {\r\n\t\t\tvar values = {\r\n\t\t\t\tsize: _viewPortSize, // contains height or width (in regard to orientation);\r\n\t\t\t\tvertical: _options.vertical,\r\n\t\t\t\tscrollPos: _scrollPos,\r\n\t\t\t\tscrollDirection: _scrollDirection,\r\n\t\t\t\tcontainer: _options.container,\r\n\t\t\t\tisDocument: _isDocument\r\n\t\t\t};\r\n\t\t\tif (!arguments.length) { // get all as an object\r\n\t\t\t\treturn values;\r\n\t\t\t} else if (values[about] !== undefined) {\r\n\t\t\t\treturn values[about];\r\n\t\t\t} else {\r\n\t\t\t\tlog(1, \"ERROR: option \\\"\" + about + \"\\\" is not available\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the current loglevel option value.\r\n\t\t * @public\r\n\t\t *\r\n\t\t * @example\r\n\t\t * // get the current value\r\n\t\t * var loglevel = controller.loglevel();\r\n\t\t *\r\n\t\t * // set a new value\r\n\t\t * controller.loglevel(3);\r\n\t\t *\r\n\t\t * @param {number} [newLoglevel] - The new loglevel setting of the Controller. `[0-3]`\r\n\t\t * @returns {(number|Controller)} Current loglevel or parent object for chaining.\r\n\t\t */\r\n\t\tthis.loglevel = function (newLoglevel) {\r\n\t\t\tif (!arguments.length) { // get\r\n\t\t\t\treturn _options.loglevel;\r\n\t\t\t} else if (_options.loglevel != newLoglevel) { // set\r\n\t\t\t\t_options.loglevel = newLoglevel;\r\n\t\t\t}\r\n\t\t\treturn Controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the current enabled state of the controller. \r\n\t\t * This can be used to disable all Scenes connected to the controller without destroying or removing them.\r\n\t\t * @public\r\n\t\t *\r\n\t\t * @example\r\n\t\t * // get the current value\r\n\t\t * var enabled = controller.enabled();\r\n\t\t *\r\n\t\t * // disable the controller\r\n\t\t * controller.enabled(false);\r\n\t\t *\r\n\t\t * @param {boolean} [newState] - The new enabled state of the controller `true` or `false`.\r\n\t\t * @returns {(boolean|Controller)} Current enabled state or parent object for chaining.\r\n\t\t */\r\n\t\tthis.enabled = function (newState) {\r\n\t\t\tif (!arguments.length) { // get\r\n\t\t\t\treturn _enabled;\r\n\t\t\t} else if (_enabled != newState) { // set\r\n\t\t\t\t_enabled = !!newState;\r\n\t\t\t\tController.updateScene(_sceneObjects, true);\r\n\t\t\t}\r\n\t\t\treturn Controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Destroy the Controller, all Scenes and everything.\r\n\t\t * @public\r\n\t\t *\r\n\t\t * @example\r\n\t\t * // without resetting the scenes\r\n\t\t * controller = controller.destroy();\r\n\t\t *\r\n\t\t * // with scene reset\r\n\t\t * controller = controller.destroy(true);\r\n\t\t *\r\n\t\t * @param {boolean} [resetScenes=false] - If `true` the pins and tweens (if existent) of all scenes will be reset.\r\n\t\t * @returns {null} Null to unset handler variables.\r\n\t\t */\r\n\t\tthis.destroy = function (resetScenes) {\r\n\t\t\twindow.clearTimeout(_refreshTimeout);\r\n\t\t\tvar i = _sceneObjects.length;\r\n\t\t\twhile (i--) {\r\n\t\t\t\t_sceneObjects[i].destroy(resetScenes);\r\n\t\t\t}\r\n\t\t\t_options.container.removeEventListener(\"resize\", onChange);\r\n\t\t\t_options.container.removeEventListener(\"scroll\", onChange);\r\n\t\t\t_util.cAF(_updateTimeout);\r\n\t\t\tlog(3, \"destroyed \" + NAMESPACE + \" (reset: \" + (resetScenes ? \"true\" : \"false\") + \")\");\r\n\t\t\treturn null;\r\n\t\t};\r\n\r\n\t\t// INIT\r\n\t\tconstruct();\r\n\t\treturn Controller;\r\n\t};\r\n\r\n\t// store pagewide controller options\r\n\tvar CONTROLLER_OPTIONS = {\r\n\t\tdefaults: {\r\n\t\t\tcontainer: window,\r\n\t\t\tvertical: true,\r\n\t\t\tglobalSceneOptions: {},\r\n\t\t\tloglevel: 2,\r\n\t\t\trefreshInterval: 100\r\n\t\t}\r\n\t};\r\n\t/*\r\n\t * method used to add an option to ScrollMagic Scenes.\r\n\t */\r\n\tScrollMagic.Controller.addOption = function (name, defaultValue) {\r\n\t\tCONTROLLER_OPTIONS.defaults[name] = defaultValue;\r\n\t};\r\n\t// instance extension function for plugins\r\n\tScrollMagic.Controller.extend = function (extension) {\r\n\t\tvar oldClass = this;\r\n\t\tScrollMagic.Controller = function () {\r\n\t\t\toldClass.apply(this, arguments);\r\n\t\t\tthis.$super = _util.extend({}, this); // copy parent state\r\n\t\t\treturn extension.apply(this, arguments) || this;\r\n\t\t};\r\n\t\t_util.extend(ScrollMagic.Controller, oldClass); // copy properties\r\n\t\tScrollMagic.Controller.prototype = oldClass.prototype; // copy prototype\r\n\t\tScrollMagic.Controller.prototype.constructor = ScrollMagic.Controller; // restore constructor\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * A Scene defines where the controller should react and how.\r\n\t *\r\n\t * @class\r\n\t *\r\n\t * @example\r\n\t * // create a standard scene and add it to a controller\r\n\t * new ScrollMagic.Scene()\r\n\t *\t\t.addTo(controller);\r\n\t *\r\n\t * // create a scene with custom options and assign a handler to it.\r\n\t * var scene = new ScrollMagic.Scene({\r\n\t * \t\tduration: 100,\r\n\t *\t\toffset: 200,\r\n\t *\t\ttriggerHook: \"onEnter\",\r\n\t *\t\treverse: false\r\n\t * });\r\n\t *\r\n\t * @param {object} [options] - Options for the Scene. The options can be updated at any time. \r\n\t \t\t\t\t\t\t\t Instead of setting the options for each scene individually you can also set them globally in the controller as the controllers `globalSceneOptions` option. The object accepts the same properties as the ones below. \r\n\t \t\t\t\t\t\t\t When a scene is added to the controller the options defined using the Scene constructor will be overwritten by those set in `globalSceneOptions`.\r\n\t * @param {(number|string|function)} [options.duration=0] - The duration of the scene. \r\n\t \t\t\t\t\tPlease see `Scene.duration()` for details.\r\n\t * @param {number} [options.offset=0] - Offset Value for the Trigger Position. If no triggerElement is defined this will be the scroll distance from the start of the page, after which the scene will start.\r\n\t * @param {(string|object)} [options.triggerElement=null] - Selector or DOM object that defines the start of the scene. If undefined the scene will start right at the start of the page (unless an offset is set).\r\n\t * @param {(number|string)} [options.triggerHook=\"onCenter\"] - Can be a number between 0 and 1 defining the position of the trigger Hook in relation to the viewport. \r\n\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t Can also be defined using a string:\r\n\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t ** `\"onEnter\"` => `1`\r\n\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t ** `\"onCenter\"` => `0.5`\r\n\t \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t ** `\"onLeave\"` => `0`\r\n\t * @param {boolean} [options.reverse=true] - Should the scene reverse, when scrolling up?\r\n\t * @param {number} [options.loglevel=2] - Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic.\r\n\t \t\t\t\t\t\t\t\t\t\t ** `0` => silent\r\n\t \t\t\t\t\t\t\t\t\t\t ** `1` => errors\r\n\t \t\t\t\t\t\t\t\t\t\t ** `2` => errors, warnings\r\n\t \t\t\t\t\t\t\t\t\t\t ** `3` => errors, warnings, debuginfo\r\n\t * \r\n\t */\r\n\tScrollMagic.Scene = function (options) {\r\n\r\n\t\t/*\r\n\t\t * ----------------------------------------------------------------\r\n\t\t * settings\r\n\t\t * ----------------------------------------------------------------\r\n\t\t */\r\n\r\n\t\tvar\r\n\t\t\tNAMESPACE = 'ScrollMagic.Scene',\r\n\t\t\tSCENE_STATE_BEFORE = 'BEFORE',\r\n\t\t\tSCENE_STATE_DURING = 'DURING',\r\n\t\t\tSCENE_STATE_AFTER = 'AFTER',\r\n\t\t\tDEFAULT_OPTIONS = SCENE_OPTIONS.defaults;\r\n\r\n\t\t/*\r\n\t\t * ----------------------------------------------------------------\r\n\t\t * private vars\r\n\t\t * ----------------------------------------------------------------\r\n\t\t */\r\n\r\n\t\tvar\r\n\t\t\tScene = this,\r\n\t\t\t_options = _util.extend({}, DEFAULT_OPTIONS, options),\r\n\t\t\t_state = SCENE_STATE_BEFORE,\r\n\t\t\t_progress = 0,\r\n\t\t\t_scrollOffset = {\r\n\t\t\t\tstart: 0,\r\n\t\t\t\tend: 0\r\n\t\t\t}, // reflects the controllers's scroll position for the start and end of the scene respectively\r\n\t\t\t_triggerPos = 0,\r\n\t\t\t_enabled = true,\r\n\t\t\t_durationUpdateMethod,\r\n\t\t\t_controller;\r\n\r\n\t\t/**\r\n\t\t * Internal constructor function of the ScrollMagic Scene\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar construct = function () {\r\n\t\t\tfor (var key in _options) { // check supplied options\r\n\t\t\t\tif (!DEFAULT_OPTIONS.hasOwnProperty(key)) {\r\n\t\t\t\t\tlog(2, \"WARNING: Unknown option \\\"\" + key + \"\\\"\");\r\n\t\t\t\t\tdelete _options[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// add getters/setters for all possible options\r\n\t\t\tfor (var optionName in DEFAULT_OPTIONS) {\r\n\t\t\t\taddSceneOption(optionName);\r\n\t\t\t}\r\n\t\t\t// validate all options\r\n\t\t\tvalidateOption();\r\n\t\t};\r\n\r\n\t\t/*\r\n\t\t * ----------------------------------------------------------------\r\n\t\t * Event Management\r\n\t\t * ----------------------------------------------------------------\r\n\t\t */\r\n\r\n\t\tvar _listeners = {};\r\n\t\t/**\r\n\t\t * Scene start event. \r\n\t\t * Fires whenever the scroll position its the starting point of the scene. \r\n\t\t * It will also fire when scrolling back up going over the start position of the scene. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback.\r\n\t\t *\r\n\t\t * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#start\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"start\", function (event) {\r\n\t\t * \tconsole.log(\"Hit start point of scene.\");\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {number} event.progress - Reflects the current progress of the scene\r\n\t\t * @property {string} event.state - The current state of the scene `\"BEFORE\"` or `\"DURING\"`\r\n\t\t * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene end event. \r\n\t\t * Fires whenever the scroll position its the ending point of the scene. \r\n\t\t * It will also fire when scrolling back up from after the scene and going over its end position. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback.\r\n\t\t *\r\n\t\t * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#end\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"end\", function (event) {\r\n\t\t * \tconsole.log(\"Hit end point of scene.\");\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {number} event.progress - Reflects the current progress of the scene\r\n\t\t * @property {string} event.state - The current state of the scene `\"DURING\"` or `\"AFTER\"`\r\n\t\t * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene enter event. \r\n\t\t * Fires whenever the scene enters the \"DURING\" state. \r\n\t\t * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene enters its active scroll timeframe, regardless of the scroll-direction.\r\n\t\t *\r\n\t\t * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#enter\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"enter\", function (event) {\r\n\t\t * \tconsole.log(\"Scene entered.\");\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {number} event.progress - Reflects the current progress of the scene\r\n\t\t * @property {string} event.state - The current state of the scene - always `\"DURING\"`\r\n\t\t * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene leave event. \r\n\t\t * Fires whenever the scene's state goes from \"DURING\" to either \"BEFORE\" or \"AFTER\". \r\n\t\t * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene leaves its active scroll timeframe, regardless of the scroll-direction.\r\n\t\t *\r\n\t\t * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#leave\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"leave\", function (event) {\r\n\t\t * \tconsole.log(\"Scene left.\");\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {number} event.progress - Reflects the current progress of the scene\r\n\t\t * @property {string} event.state - The current state of the scene `\"BEFORE\"` or `\"AFTER\"`\r\n\t\t * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene update event. \r\n\t\t * Fires whenever the scene is updated (but not necessarily changes the progress).\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#update\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"update\", function (event) {\r\n\t\t * \tconsole.log(\"Scene updated.\");\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {number} event.startPos - The starting position of the scene (in relation to the conainer)\r\n\t\t * @property {number} event.endPos - The ending position of the scene (in relation to the conainer)\r\n\t\t * @property {number} event.scrollPos - The current scroll position of the container\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene progress event. \r\n\t\t * Fires whenever the progress of the scene changes.\r\n\t\t *\r\n\t\t * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#progress\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"progress\", function (event) {\r\n\t\t * \tconsole.log(\"Scene progress changed to \" + event.progress);\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {number} event.progress - Reflects the current progress of the scene\r\n\t\t * @property {string} event.state - The current state of the scene `\"BEFORE\"`, `\"DURING\"` or `\"AFTER\"`\r\n\t\t * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene change event. \r\n\t\t * Fires whenvever a property of the scene is changed.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#change\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"change\", function (event) {\r\n\t\t * \tconsole.log(\"Scene Property \\\"\" + event.what + \"\\\" changed to \" + event.newval);\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {string} event.what - Indicates what value has been changed\r\n\t\t * @property {mixed} event.newval - The new value of the changed property\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene shift event. \r\n\t\t * Fires whenvever the start or end **scroll offset** of the scene change.\r\n\t\t * This happens explicitely, when one of these values change: `offset`, `duration` or `triggerHook`.\r\n\t\t * It will fire implicitly when the `triggerElement` changes, if the new element has a different position (most cases).\r\n\t\t * It will also fire implicitly when the size of the container changes and the triggerHook is anything other than `onLeave`.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#shift\r\n\t\t * @since 1.1.0\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"shift\", function (event) {\r\n\t\t * \tconsole.log(\"Scene moved, because the \" + event.reason + \" has changed.)\");\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {string} event.reason - Indicates why the scene has shifted\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene destroy event. \r\n\t\t * Fires whenvever the scene is destroyed.\r\n\t\t * This can be used to tidy up custom behaviour used in events.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#destroy\r\n\t\t * @since 1.1.0\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"enter\", function (event) {\r\n\t\t * // add custom action\r\n\t\t * $(\"#my-elem\").left(\"200\");\r\n\t\t * })\r\n\t\t * .on(\"destroy\", function (event) {\r\n\t\t * // reset my element to start position\r\n\t\t * if (event.reset) {\r\n\t\t * $(\"#my-elem\").left(\"0\");\r\n\t\t * }\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {boolean} event.reset - Indicates if the destroy method was called with reset `true` or `false`.\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene add event. \r\n\t\t * Fires when the scene is added to a controller.\r\n\t\t * This is mostly used by plugins to know that change might be due.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#add\r\n\t\t * @since 2.0.0\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"add\", function (event) {\r\n\t\t * \tconsole.log('Scene was added to a new controller.');\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t * @property {boolean} event.controller - The controller object the scene was added to.\r\n\t\t */\r\n\t\t/**\r\n\t\t * Scene remove event. \r\n\t\t * Fires when the scene is removed from a controller.\r\n\t\t * This is mostly used by plugins to know that change might be due.\r\n\t\t *\r\n\t\t * @event ScrollMagic.Scene#remove\r\n\t\t * @since 2.0.0\r\n\t\t *\r\n\t\t * @example\r\n\t\t * scene.on(\"remove\", function (event) {\r\n\t\t * \tconsole.log('Scene was removed from its controller.');\r\n\t\t * });\r\n\t\t *\r\n\t\t * @property {object} event - The event Object passed to each callback\r\n\t\t * @property {string} event.type - The name of the event\r\n\t\t * @property {Scene} event.target - The Scene object that triggered this event\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * Add one ore more event listener. \r\n\t\t * The callback function will be fired at the respective event, and an object containing relevant data will be passed to the callback.\r\n\t\t * @method ScrollMagic.Scene#on\r\n\t\t *\r\n\t\t * @example\r\n\t\t * function callback (event) {\r\n\t\t * \t\tconsole.log(\"Event fired! (\" + event.type + \")\");\r\n\t\t * }\r\n\t\t * // add listeners\r\n\t\t * scene.on(\"change update progress start end enter leave\", callback);\r\n\t\t *\r\n\t\t * @param {string} names - The name or names of the event the callback should be attached to.\r\n\t\t * @param {function} callback - A function that should be executed, when the event is dispatched. An event object will be passed to the callback.\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.on = function (names, callback) {\r\n\t\t\tif (_util.type.Function(callback)) {\r\n\t\t\t\tnames = names.trim().split(' ');\r\n\t\t\t\tnames.forEach(function (fullname) {\r\n\t\t\t\t\tvar\r\n\t\t\t\t\t\tnameparts = fullname.split('.'),\r\n\t\t\t\t\t\teventname = nameparts[0],\r\n\t\t\t\t\t\tnamespace = nameparts[1];\r\n\t\t\t\t\tif (eventname != \"*\") { // disallow wildcards\r\n\t\t\t\t\t\tif (!_listeners[eventname]) {\r\n\t\t\t\t\t\t\t_listeners[eventname] = [];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_listeners[eventname].push({\r\n\t\t\t\t\t\t\tnamespace: namespace || '',\r\n\t\t\t\t\t\t\tcallback: callback\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tlog(1, \"ERROR when calling '.on()': Supplied callback for '\" + names + \"' is not a valid function!\");\r\n\t\t\t}\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Remove one or more event listener.\r\n\t\t * @method ScrollMagic.Scene#off\r\n\t\t *\r\n\t\t * @example\r\n\t\t * function callback (event) {\r\n\t\t * \t\tconsole.log(\"Event fired! (\" + event.type + \")\");\r\n\t\t * }\r\n\t\t * // add listeners\r\n\t\t * scene.on(\"change update\", callback);\r\n\t\t * // remove listeners\r\n\t\t * scene.off(\"change update\", callback);\r\n\t\t *\r\n\t\t * @param {string} names - The name or names of the event that should be removed.\r\n\t\t * @param {function} [callback] - A specific callback function that should be removed. If none is passed all callbacks to the event listener will be removed.\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.off = function (names, callback) {\r\n\t\t\tif (!names) {\r\n\t\t\t\tlog(1, \"ERROR: Invalid event name supplied.\");\r\n\t\t\t\treturn Scene;\r\n\t\t\t}\r\n\t\t\tnames = names.trim().split(' ');\r\n\t\t\tnames.forEach(function (fullname, key) {\r\n\t\t\t\tvar\r\n\t\t\t\t\tnameparts = fullname.split('.'),\r\n\t\t\t\t\teventname = nameparts[0],\r\n\t\t\t\t\tnamespace = nameparts[1] || '',\r\n\t\t\t\t\tremoveList = eventname === '*' ? Object.keys(_listeners) : [eventname];\r\n\t\t\t\tremoveList.forEach(function (remove) {\r\n\t\t\t\t\tvar\r\n\t\t\t\t\t\tlist = _listeners[remove] || [],\r\n\t\t\t\t\t\ti = list.length;\r\n\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\tvar listener = list[i];\r\n\t\t\t\t\t\tif (listener && (namespace === listener.namespace || namespace === '*') && (!callback || callback == listener.callback)) {\r\n\t\t\t\t\t\t\tlist.splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!list.length) {\r\n\t\t\t\t\t\tdelete _listeners[remove];\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Trigger an event.\r\n\t\t * @method ScrollMagic.Scene#trigger\r\n\t\t *\r\n\t\t * @example\r\n\t\t * this.trigger(\"change\");\r\n\t\t *\r\n\t\t * @param {string} name - The name of the event that should be triggered.\r\n\t\t * @param {object} [vars] - An object containing info that should be passed to the callback.\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.trigger = function (name, vars) {\r\n\t\t\tif (name) {\r\n\t\t\t\tvar\r\n\t\t\t\t\tnameparts = name.trim().split('.'),\r\n\t\t\t\t\teventname = nameparts[0],\r\n\t\t\t\t\tnamespace = nameparts[1],\r\n\t\t\t\t\tlisteners = _listeners[eventname];\r\n\t\t\t\tlog(3, 'event fired:', eventname, vars ? \"->\" : '', vars || '');\r\n\t\t\t\tif (listeners) {\r\n\t\t\t\t\tlisteners.forEach(function (listener, key) {\r\n\t\t\t\t\t\tif (!namespace || namespace === listener.namespace) {\r\n\t\t\t\t\t\t\tlistener.callback.call(Scene, new ScrollMagic.Event(eventname, listener.namespace, Scene, vars));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tlog(1, \"ERROR: Invalid event name supplied.\");\r\n\t\t\t}\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t// set event listeners\r\n\t\tScene\r\n\t\t\t.on(\"change.internal\", function (e) {\r\n\t\t\t\tif (e.what !== \"loglevel\" && e.what !== \"tweenChanges\") { // no need for a scene update scene with these options...\r\n\t\t\t\t\tif (e.what === \"triggerElement\") {\r\n\t\t\t\t\t\tupdateTriggerElementPosition();\r\n\t\t\t\t\t} else if (e.what === \"reverse\") { // the only property left that may have an impact on the current scene state. Everything else is handled by the shift event.\r\n\t\t\t\t\t\tScene.update();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.on(\"shift.internal\", function (e) {\r\n\t\t\t\tupdateScrollOffset();\r\n\t\t\t\tScene.update(); // update scene to reflect new position\r\n\t\t\t});\r\n\r\n\t\t/**\r\n\t\t * Send a debug message to the console.\r\n\t\t * @private\r\n\t\t * but provided publicly with _log for plugins\r\n\t\t *\r\n\t\t * @param {number} loglevel - The loglevel required to initiate output for the message.\r\n\t\t * @param {...mixed} output - One or more variables that should be passed to the console.\r\n\t\t */\r\n\t\tvar log = this._log = function (loglevel, output) {\r\n\t\t\tif (_options.loglevel >= loglevel) {\r\n\t\t\t\tArray.prototype.splice.call(arguments, 1, 0, \"(\" + NAMESPACE + \") ->\");\r\n\t\t\t\t_util.log.apply(window, arguments);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Add the scene to a controller. \r\n\t\t * This is the equivalent to `Controller.addScene(scene)`.\r\n\t\t * @method ScrollMagic.Scene#addTo\r\n\t\t *\r\n\t\t * @example\r\n\t\t * // add a scene to a ScrollMagic Controller\r\n\t\t * scene.addTo(controller);\r\n\t\t *\r\n\t\t * @param {ScrollMagic.Controller} controller - The controller to which the scene should be added.\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.addTo = function (controller) {\r\n\t\t\tif (!(controller instanceof ScrollMagic.Controller)) {\r\n\t\t\t\tlog(1, \"ERROR: supplied argument of 'addTo()' is not a valid ScrollMagic Controller\");\r\n\t\t\t} else if (_controller != controller) {\r\n\t\t\t\t// new controller\r\n\t\t\t\tif (_controller) { // was associated to a different controller before, so remove it...\r\n\t\t\t\t\t_controller.removeScene(Scene);\r\n\t\t\t\t}\r\n\t\t\t\t_controller = controller;\r\n\t\t\t\tvalidateOption();\r\n\t\t\t\tupdateDuration(true);\r\n\t\t\t\tupdateTriggerElementPosition(true);\r\n\t\t\t\tupdateScrollOffset();\r\n\t\t\t\t_controller.info(\"container\").addEventListener('resize', onContainerResize);\r\n\t\t\t\tcontroller.addScene(Scene);\r\n\t\t\t\tScene.trigger(\"add\", {\r\n\t\t\t\t\tcontroller: _controller\r\n\t\t\t\t});\r\n\t\t\t\tlog(3, \"added \" + NAMESPACE + \" to controller\");\r\n\t\t\t\tScene.update();\r\n\t\t\t}\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the current enabled state of the scene. \r\n\t\t * This can be used to disable this scene without removing or destroying it.\r\n\t\t * @method ScrollMagic.Scene#enabled\r\n\t\t *\r\n\t\t * @example\r\n\t\t * // get the current value\r\n\t\t * var enabled = scene.enabled();\r\n\t\t *\r\n\t\t * // disable the scene\r\n\t\t * scene.enabled(false);\r\n\t\t *\r\n\t\t * @param {boolean} [newState] - The new enabled state of the scene `true` or `false`.\r\n\t\t * @returns {(boolean|Scene)} Current enabled state or parent object for chaining.\r\n\t\t */\r\n\t\tthis.enabled = function (newState) {\r\n\t\t\tif (!arguments.length) { // get\r\n\t\t\t\treturn _enabled;\r\n\t\t\t} else if (_enabled != newState) { // set\r\n\t\t\t\t_enabled = !!newState;\r\n\t\t\t\tScene.update(true);\r\n\t\t\t}\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Remove the scene from the controller. \r\n\t\t * This is the equivalent to `Controller.removeScene(scene)`.\r\n\t\t * The scene will not be updated anymore until you readd it to a controller.\r\n\t\t * To remove the pin or the tween you need to call removeTween() or removePin() respectively.\r\n\t\t * @method ScrollMagic.Scene#remove\r\n\t\t * @example\r\n\t\t * // remove the scene from its controller\r\n\t\t * scene.remove();\r\n\t\t *\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.remove = function () {\r\n\t\t\tif (_controller) {\r\n\t\t\t\t_controller.info(\"container\").removeEventListener('resize', onContainerResize);\r\n\t\t\t\tvar tmpParent = _controller;\r\n\t\t\t\t_controller = undefined;\r\n\t\t\t\ttmpParent.removeScene(Scene);\r\n\t\t\t\tScene.trigger(\"remove\");\r\n\t\t\t\tlog(3, \"removed \" + NAMESPACE + \" from controller\");\r\n\t\t\t}\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Destroy the scene and everything.\r\n\t\t * @method ScrollMagic.Scene#destroy\r\n\t\t * @example\r\n\t\t * // destroy the scene without resetting the pin and tween to their initial positions\r\n\t\t * scene = scene.destroy();\r\n\t\t *\r\n\t\t * // destroy the scene and reset the pin and tween\r\n\t\t * scene = scene.destroy(true);\r\n\t\t *\r\n\t\t * @param {boolean} [reset=false] - If `true` the pin and tween (if existent) will be reset.\r\n\t\t * @returns {null} Null to unset handler variables.\r\n\t\t */\r\n\t\tthis.destroy = function (reset) {\r\n\t\t\tScene.trigger(\"destroy\", {\r\n\t\t\t\treset: reset\r\n\t\t\t});\r\n\t\t\tScene.remove();\r\n\t\t\tScene.off(\"*.*\");\r\n\t\t\tlog(3, \"destroyed \" + NAMESPACE + \" (reset: \" + (reset ? \"true\" : \"false\") + \")\");\r\n\t\t\treturn null;\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * Updates the Scene to reflect the current state. \r\n\t\t * This is the equivalent to `Controller.updateScene(scene, immediately)`. \r\n\t\t * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container. \r\n\t\t * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress.\r\n\t\t * This means an update doesn't necessarily result in a progress change. The `progress` event will be fired if the progress has indeed changed between this update and the last. \r\n\t\t * _**NOTE:** This method gets called constantly whenever ScrollMagic detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._\r\n\t\t * @method ScrollMagic.Scene#update\r\n\t\t * @example\r\n\t\t * // update the scene on next tick\r\n\t\t * scene.update();\r\n\t\t *\r\n\t\t * // update the scene immediately\r\n\t\t * scene.update(true);\r\n\t\t *\r\n\t\t * @fires Scene.update\r\n\t\t *\r\n\t\t * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance).\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.update = function (immediately) {\r\n\t\t\tif (_controller) {\r\n\t\t\t\tif (immediately) {\r\n\t\t\t\t\tif (_controller.enabled() && _enabled) {\r\n\t\t\t\t\t\tvar\r\n\t\t\t\t\t\t\tscrollPos = _controller.info(\"scrollPos\"),\r\n\t\t\t\t\t\t\tnewProgress;\r\n\r\n\t\t\t\t\t\tif (_options.duration > 0) {\r\n\t\t\t\t\t\t\tnewProgress = (scrollPos - _scrollOffset.start) / (_scrollOffset.end - _scrollOffset.start);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnewProgress = scrollPos >= _scrollOffset.start ? 1 : 0;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tScene.trigger(\"update\", {\r\n\t\t\t\t\t\t\tstartPos: _scrollOffset.start,\r\n\t\t\t\t\t\t\tendPos: _scrollOffset.end,\r\n\t\t\t\t\t\t\tscrollPos: scrollPos\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tScene.progress(newProgress);\r\n\t\t\t\t\t} else if (_pin && _state === SCENE_STATE_DURING) {\r\n\t\t\t\t\t\tupdatePinState(true); // unpin in position\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t_controller.updateScene(Scene, false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Updates dynamic scene variables like the trigger element position or the duration.\r\n\t\t * This method is automatically called in regular intervals from the controller. See {@link ScrollMagic.Controller} option `refreshInterval`.\r\n\t\t * \r\n\t\t * You can call it to minimize lag, for example when you intentionally change the position of the triggerElement.\r\n\t\t * If you don't it will simply be updated in the next refresh interval of the container, which is usually sufficient.\r\n\t\t *\r\n\t\t * @method ScrollMagic.Scene#refresh\r\n\t\t * @since 1.1.0\r\n\t\t * @example\r\n\t\t * scene = new ScrollMagic.Scene({triggerElement: \"#trigger\"});\r\n\t\t * \r\n\t\t * // change the position of the trigger\r\n\t\t * $(\"#trigger\").css(\"top\", 500);\r\n\t\t * // immediately let the scene know of this change\r\n\t\t * scene.refresh();\r\n\t\t *\r\n\t\t * @fires {@link Scene.shift}, if the trigger element position or the duration changed\r\n\t\t * @fires {@link Scene.change}, if the duration changed\r\n\t\t *\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.refresh = function () {\r\n\t\t\tupdateDuration();\r\n\t\t\tupdateTriggerElementPosition();\r\n\t\t\t// update trigger element position\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the scene's progress. \r\n\t\t * Usually it shouldn't be necessary to use this as a setter, as it is set automatically by scene.update(). \r\n\t\t * The order in which the events are fired depends on the duration of the scene:\r\n\t\t * 1. Scenes with `duration == 0`: \r\n\t\t * Scenes that have no duration by definition have no ending. Thus the `end` event will never be fired. \r\n\t\t * When the trigger position of the scene is passed the events are always fired in this order: \r\n\t\t * `enter`, `start`, `progress` when scrolling forward \r\n\t\t * and \r\n\t\t * `progress`, `start`, `leave` when scrolling in reverse\r\n\t\t * 2. Scenes with `duration > 0`: \r\n\t\t * Scenes with a set duration have a defined start and end point. \r\n\t\t * When scrolling past the start position of the scene it will fire these events in this order: \r\n\t\t * `enter`, `start`, `progress` \r\n\t\t * When continuing to scroll and passing the end point it will fire these events: \r\n\t\t * `progress`, `end`, `leave` \r\n\t\t * When reversing through the end point these events are fired: \r\n\t\t * `enter`, `end`, `progress` \r\n\t\t * And when continuing to scroll past the start position in reverse it will fire: \r\n\t\t * `progress`, `start`, `leave` \r\n\t\t * In between start and end the `progress` event will be called constantly, whenever the progress changes.\r\n\t\t * \r\n\t\t * In short: \r\n\t\t * `enter` events will always trigger **before** the progress update and `leave` envents will trigger **after** the progress update. \r\n\t\t * `start` and `end` will always trigger at their respective position.\r\n\t\t * \r\n\t\t * Please review the event descriptions for details on the events and the event object that is passed to the callback.\r\n\t\t * \r\n\t\t * @method ScrollMagic.Scene#progress\r\n\t\t * @example\r\n\t\t * // get the current scene progress\r\n\t\t * var progress = scene.progress();\r\n\t\t *\r\n\t\t * // set new scene progress\r\n\t\t * scene.progress(0.3);\r\n\t\t *\r\n\t\t * @fires {@link Scene.enter}, when used as setter\r\n\t\t * @fires {@link Scene.start}, when used as setter\r\n\t\t * @fires {@link Scene.progress}, when used as setter\r\n\t\t * @fires {@link Scene.end}, when used as setter\r\n\t\t * @fires {@link Scene.leave}, when used as setter\r\n\t\t *\r\n\t\t * @param {number} [progress] - The new progress value of the scene `[0-1]`.\r\n\t\t * @returns {number} `get` - Current scene progress.\r\n\t\t * @returns {Scene} `set` - Parent object for chaining.\r\n\t\t */\r\n\t\tthis.progress = function (progress) {\r\n\t\t\tif (!arguments.length) { // get\r\n\t\t\t\treturn _progress;\r\n\t\t\t} else { // set\r\n\t\t\t\tvar\r\n\t\t\t\t\tdoUpdate = false,\r\n\t\t\t\t\toldState = _state,\r\n\t\t\t\t\tscrollDirection = _controller ? _controller.info(\"scrollDirection\") : 'PAUSED',\r\n\t\t\t\t\treverseOrForward = _options.reverse || progress >= _progress;\r\n\t\t\t\tif (_options.duration === 0) {\r\n\t\t\t\t\t// zero duration scenes\r\n\t\t\t\t\tdoUpdate = _progress != progress;\r\n\t\t\t\t\t_progress = progress < 1 && reverseOrForward ? 0 : 1;\r\n\t\t\t\t\t_state = _progress === 0 ? SCENE_STATE_BEFORE : SCENE_STATE_DURING;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// scenes with start and end\r\n\t\t\t\t\tif (progress < 0 && _state !== SCENE_STATE_BEFORE && reverseOrForward) {\r\n\t\t\t\t\t\t// go back to initial state\r\n\t\t\t\t\t\t_progress = 0;\r\n\t\t\t\t\t\t_state = SCENE_STATE_BEFORE;\r\n\t\t\t\t\t\tdoUpdate = true;\r\n\t\t\t\t\t} else if (progress >= 0 && progress < 1 && reverseOrForward) {\r\n\t\t\t\t\t\t_progress = progress;\r\n\t\t\t\t\t\t_state = SCENE_STATE_DURING;\r\n\t\t\t\t\t\tdoUpdate = true;\r\n\t\t\t\t\t} else if (progress >= 1 && _state !== SCENE_STATE_AFTER) {\r\n\t\t\t\t\t\t_progress = 1;\r\n\t\t\t\t\t\t_state = SCENE_STATE_AFTER;\r\n\t\t\t\t\t\tdoUpdate = true;\r\n\t\t\t\t\t} else if (_state === SCENE_STATE_DURING && !reverseOrForward) {\r\n\t\t\t\t\t\tupdatePinState(); // in case we scrolled backwards mid-scene and reverse is disabled => update the pin position, so it doesn't move back as well.\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (doUpdate) {\r\n\t\t\t\t\t// fire events\r\n\t\t\t\t\tvar\r\n\t\t\t\t\t\teventVars = {\r\n\t\t\t\t\t\t\tprogress: _progress,\r\n\t\t\t\t\t\t\tstate: _state,\r\n\t\t\t\t\t\t\tscrollDirection: scrollDirection\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tstateChanged = _state != oldState;\r\n\r\n\t\t\t\t\tvar trigger = function (eventName) { // tmp helper to simplify code\r\n\t\t\t\t\t\tScene.trigger(eventName, eventVars);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (stateChanged) { // enter events\r\n\t\t\t\t\t\tif (oldState !== SCENE_STATE_DURING) {\r\n\t\t\t\t\t\t\ttrigger(\"enter\");\r\n\t\t\t\t\t\t\ttrigger(oldState === SCENE_STATE_BEFORE ? \"start\" : \"end\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttrigger(\"progress\");\r\n\t\t\t\t\tif (stateChanged) { // leave events\r\n\t\t\t\t\t\tif (_state !== SCENE_STATE_DURING) {\r\n\t\t\t\t\t\t\ttrigger(_state === SCENE_STATE_BEFORE ? \"start\" : \"end\");\r\n\t\t\t\t\t\t\ttrigger(\"leave\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn Scene;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * Update the start and end scrollOffset of the container.\r\n\t\t * The positions reflect what the controller's scroll position will be at the start and end respectively.\r\n\t\t * Is called, when:\r\n\t\t * - Scene event \"change\" is called with: offset, triggerHook, duration \r\n\t\t * - scroll container event \"resize\" is called\r\n\t\t * - the position of the triggerElement changes\r\n\t\t * - the controller changes -> addTo()\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar updateScrollOffset = function () {\r\n\t\t\t_scrollOffset = {\r\n\t\t\t\tstart: _triggerPos + _options.offset\r\n\t\t\t};\r\n\t\t\tif (_controller && _options.triggerElement) {\r\n\t\t\t\t// take away triggerHook portion to get relative to top\r\n\t\t\t\t_scrollOffset.start -= _controller.info(\"size\") * _options.triggerHook;\r\n\t\t\t}\r\n\t\t\t_scrollOffset.end = _scrollOffset.start + _options.duration;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Updates the duration if set to a dynamic function.\r\n\t\t * This method is called when the scene is added to a controller and in regular intervals from the controller through scene.refresh().\r\n\t\t * \r\n\t\t * @fires {@link Scene.change}, if the duration changed\r\n\t\t * @fires {@link Scene.shift}, if the duration changed\r\n\t\t *\r\n\t\t * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar updateDuration = function (suppressEvents) {\r\n\t\t\t// update duration\r\n\t\t\tif (_durationUpdateMethod) {\r\n\t\t\t\tvar varname = \"duration\";\r\n\t\t\t\tif (changeOption(varname, _durationUpdateMethod.call(Scene)) && !suppressEvents) { // set\r\n\t\t\t\t\tScene.trigger(\"change\", {\r\n\t\t\t\t\t\twhat: varname,\r\n\t\t\t\t\t\tnewval: _options[varname]\r\n\t\t\t\t\t});\r\n\t\t\t\t\tScene.trigger(\"shift\", {\r\n\t\t\t\t\t\treason: varname\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Updates the position of the triggerElement, if present.\r\n\t\t * This method is called ...\r\n\t\t * - ... when the triggerElement is changed\r\n\t\t * - ... when the scene is added to a (new) controller\r\n\t\t * - ... in regular intervals from the controller through scene.refresh().\r\n\t\t * \r\n\t\t * @fires {@link Scene.shift}, if the position changed\r\n\t\t *\r\n\t\t * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar updateTriggerElementPosition = function (suppressEvents) {\r\n\t\t\tvar\r\n\t\t\t\telementPos = 0,\r\n\t\t\t\ttelem = _options.triggerElement;\r\n\t\t\tif (_controller && (telem || _triggerPos > 0)) { // either an element exists or was removed and the triggerPos is still > 0\r\n\t\t\t\tif (telem) { // there currently a triggerElement set\r\n\t\t\t\t\tif (telem.parentNode) { // check if element is still attached to DOM\r\n\t\t\t\t\t\tvar\r\n\t\t\t\t\t\t\tcontrollerInfo = _controller.info(),\r\n\t\t\t\t\t\t\tcontainerOffset = _util.get.offset(controllerInfo.container), // container position is needed because element offset is returned in relation to document, not in relation to container.\r\n\t\t\t\t\t\t\tparam = controllerInfo.vertical ? \"top\" : \"left\"; // which param is of interest ?\r\n\r\n\t\t\t\t\t\t// if parent is spacer, use spacer position instead so correct start position is returned for pinned elements.\r\n\t\t\t\t\t\twhile (telem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {\r\n\t\t\t\t\t\t\ttelem = telem.parentNode;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar elementOffset = _util.get.offset(telem);\r\n\r\n\t\t\t\t\t\tif (!controllerInfo.isDocument) { // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent\r\n\t\t\t\t\t\t\tcontainerOffset[param] -= _controller.scrollPos();\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\telementPos = elementOffset[param] - containerOffset[param];\r\n\r\n\t\t\t\t\t} else { // there was an element, but it was removed from DOM\r\n\t\t\t\t\t\tlog(2, \"WARNING: triggerElement was removed from DOM and will be reset to\", undefined);\r\n\t\t\t\t\t\tScene.triggerElement(undefined); // unset, so a change event is triggered\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar changed = elementPos != _triggerPos;\r\n\t\t\t\t_triggerPos = elementPos;\r\n\t\t\t\tif (changed && !suppressEvents) {\r\n\t\t\t\t\tScene.trigger(\"shift\", {\r\n\t\t\t\t\t\treason: \"triggerElementPosition\"\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Trigger a shift event, when the container is resized and the triggerHook is > 1.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar onContainerResize = function (e) {\r\n\t\t\tif (_options.triggerHook > 0) {\r\n\t\t\t\tScene.trigger(\"shift\", {\r\n\t\t\t\t\treason: \"containerResize\"\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tvar _validate = _util.extend(SCENE_OPTIONS.validate, {\r\n\t\t\t// validation for duration handled internally for reference to private var _durationMethod\r\n\t\t\tduration: function (val) {\r\n\t\t\t\tif (_util.type.String(val) && val.match(/^(\\.|\\d)*\\d+%$/)) {\r\n\t\t\t\t\t// percentage value\r\n\t\t\t\t\tvar perc = parseFloat(val) / 100;\r\n\t\t\t\t\tval = function () {\r\n\t\t\t\t\t\treturn _controller ? _controller.info(\"size\") * perc : 0;\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tif (_util.type.Function(val)) {\r\n\t\t\t\t\t// function\r\n\t\t\t\t\t_durationUpdateMethod = val;\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tval = parseFloat(_durationUpdateMethod.call(Scene));\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tval = -1; // will cause error below\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// val has to be float\r\n\t\t\t\tval = parseFloat(val);\r\n\t\t\t\tif (!_util.type.Number(val) || val < 0) {\r\n\t\t\t\t\tif (_durationUpdateMethod) {\r\n\t\t\t\t\t\t_durationUpdateMethod = undefined;\r\n\t\t\t\t\t\tthrow [\"Invalid return value of supplied function for option \\\"duration\\\":\", val];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthrow [\"Invalid value for option \\\"duration\\\":\", val];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn val;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Checks the validity of a specific or all options and reset to default if neccessary.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar validateOption = function (check) {\r\n\t\t\tcheck = arguments.length ? [check] : Object.keys(_validate);\r\n\t\t\tcheck.forEach(function (optionName, key) {\r\n\t\t\t\tvar value;\r\n\t\t\t\tif (_validate[optionName]) { // there is a validation method for this option\r\n\t\t\t\t\ttry { // validate value\r\n\t\t\t\t\t\tvalue = _validate[optionName](_options[optionName]);\r\n\t\t\t\t\t} catch (e) { // validation failed -> reset to default\r\n\t\t\t\t\t\tvalue = DEFAULT_OPTIONS[optionName];\r\n\t\t\t\t\t\tvar logMSG = _util.type.String(e) ? [e] : e;\r\n\t\t\t\t\t\tif (_util.type.Array(logMSG)) {\r\n\t\t\t\t\t\t\tlogMSG[0] = \"ERROR: \" + logMSG[0];\r\n\t\t\t\t\t\t\tlogMSG.unshift(1); // loglevel 1 for error msg\r\n\t\t\t\t\t\t\tlog.apply(this, logMSG);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tlog(1, \"ERROR: Problem executing validation callback for option '\" + optionName + \"':\", e.message);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} finally {\r\n\t\t\t\t\t\t_options[optionName] = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Helper used by the setter/getters for scene options\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar changeOption = function (varname, newval) {\r\n\t\t\tvar\r\n\t\t\t\tchanged = false,\r\n\t\t\t\toldval = _options[varname];\r\n\t\t\tif (_options[varname] != newval) {\r\n\t\t\t\t_options[varname] = newval;\r\n\t\t\t\tvalidateOption(varname); // resets to default if necessary\r\n\t\t\t\tchanged = oldval != _options[varname];\r\n\t\t\t}\r\n\t\t\treturn changed;\r\n\t\t};\r\n\r\n\t\t// generate getters/setters for all options\r\n\t\tvar addSceneOption = function (optionName) {\r\n\t\t\tif (!Scene[optionName]) {\r\n\t\t\t\tScene[optionName] = function (newVal) {\r\n\t\t\t\t\tif (!arguments.length) { // get\r\n\t\t\t\t\t\treturn _options[optionName];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (optionName === \"duration\") { // new duration is set, so any previously set function must be unset\r\n\t\t\t\t\t\t\t_durationUpdateMethod = undefined;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (changeOption(optionName, newVal)) { // set\r\n\t\t\t\t\t\t\tScene.trigger(\"change\", {\r\n\t\t\t\t\t\t\t\twhat: optionName,\r\n\t\t\t\t\t\t\t\tnewval: _options[optionName]\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tif (SCENE_OPTIONS.shifts.indexOf(optionName) > -1) {\r\n\t\t\t\t\t\t\t\tScene.trigger(\"shift\", {\r\n\t\t\t\t\t\t\t\t\treason: optionName\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn Scene;\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the duration option value.\r\n\t\t *\r\n\t\t * As a **setter** it accepts three types of parameters:\r\n\t\t * 1. `number`: Sets the duration of the scene to exactly this amount of pixels. \r\n\t\t * This means the scene will last for exactly this amount of pixels scrolled. Sub-Pixels are also valid.\r\n\t\t * A value of `0` means that the scene is 'open end' and no end will be triggered. Pins will never unpin and animations will play independently of scroll progress.\r\n\t\t * 2. `string`: Always updates the duration relative to parent scroll container. \r\n\t\t * For example `\"100%\"` will keep the duration always exactly at the inner height of the scroll container.\r\n\t\t * When scrolling vertically the width is used for reference respectively.\r\n\t\t * 3. `function`: The supplied function will be called to return the scene duration.\r\n\t\t * This is useful in setups where the duration depends on other elements who might change size. By supplying a function you can return a value instead of updating potentially multiple scene durations. \r\n\t\t * The scene can be referenced inside the callback using `this`.\r\n\t\t * _**WARNING:** This is an easy way to kill performance, as the callback will be executed every time `Scene.refresh()` is called, which happens a lot. The interval is defined by the controller (see ScrollMagic.Controller option `refreshInterval`). \r\n\t\t * It's recomended to avoid calculations within the function and use cached variables as return values. \r\n\t\t * This counts double if you use the same function for multiple scenes._\r\n\t\t *\r\n\t\t * @method ScrollMagic.Scene#duration\r\n\t\t * @example\r\n\t\t * // get the current duration value\r\n\t\t * var duration = scene.duration();\r\n\t\t *\r\n\t\t * // set a new duration\r\n\t\t * scene.duration(300);\r\n\t\t *\r\n\t\t * // set duration responsively to container size\r\n\t\t * scene.duration(\"100%\");\r\n\t\t *\r\n\t\t * // use a function to randomize the duration for some reason.\r\n\t\t * var durationValueCache;\r\n\t\t * function durationCallback () {\r\n\t\t * return durationValueCache;\r\n\t\t * }\r\n\t\t * function updateDuration () {\r\n\t\t * durationValueCache = Math.random() * 100;\r\n\t\t * }\r\n\t\t * updateDuration(); // set to initial value\r\n\t\t * scene.duration(durationCallback); // set duration callback\r\n\t\t *\r\n\t\t * @fires {@link Scene.change}, when used as setter\r\n\t\t * @fires {@link Scene.shift}, when used as setter\r\n\t\t * @param {(number|string|function)} [newDuration] - The new duration setting for the scene.\r\n\t\t * @returns {number} `get` - Current scene duration.\r\n\t\t * @returns {Scene} `set` - Parent object for chaining.\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the offset option value.\r\n\t\t * @method ScrollMagic.Scene#offset\r\n\t\t * @example\r\n\t\t * // get the current offset\r\n\t\t * var offset = scene.offset();\r\n\t\t *\r\n\t\t * // set a new offset\r\n\t\t * scene.offset(100);\r\n\t\t *\r\n\t\t * @fires {@link Scene.change}, when used as setter\r\n\t\t * @fires {@link Scene.shift}, when used as setter\r\n\t\t * @param {number} [newOffset] - The new offset of the scene.\r\n\t\t * @returns {number} `get` - Current scene offset.\r\n\t\t * @returns {Scene} `set` - Parent object for chaining.\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the triggerElement option value.\r\n\t\t * Does **not** fire `Scene.shift`, because changing the trigger Element doesn't necessarily mean the start position changes. This will be determined in `Scene.refresh()`, which is automatically triggered.\r\n\t\t * @method ScrollMagic.Scene#triggerElement\r\n\t\t * @example\r\n\t\t * // get the current triggerElement\r\n\t\t * var triggerElement = scene.triggerElement();\r\n\t\t *\r\n\t\t * // set a new triggerElement using a selector\r\n\t\t * scene.triggerElement(\"#trigger\");\r\n\t\t * // set a new triggerElement using a DOM object\r\n\t\t * scene.triggerElement(document.getElementById(\"trigger\"));\r\n\t\t *\r\n\t\t * @fires {@link Scene.change}, when used as setter\r\n\t\t * @param {(string|object)} [newTriggerElement] - The new trigger element for the scene.\r\n\t\t * @returns {(string|object)} `get` - Current triggerElement.\r\n\t\t * @returns {Scene} `set` - Parent object for chaining.\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the triggerHook option value.\r\n\t\t * @method ScrollMagic.Scene#triggerHook\r\n\t\t * @example\r\n\t\t * // get the current triggerHook value\r\n\t\t * var triggerHook = scene.triggerHook();\r\n\t\t *\r\n\t\t * // set a new triggerHook using a string\r\n\t\t * scene.triggerHook(\"onLeave\");\r\n\t\t * // set a new triggerHook using a number\r\n\t\t * scene.triggerHook(0.7);\r\n\t\t *\r\n\t\t * @fires {@link Scene.change}, when used as setter\r\n\t\t * @fires {@link Scene.shift}, when used as setter\r\n\t\t * @param {(number|string)} [newTriggerHook] - The new triggerHook of the scene. See {@link Scene} parameter description for value options.\r\n\t\t * @returns {number} `get` - Current triggerHook (ALWAYS numerical).\r\n\t\t * @returns {Scene} `set` - Parent object for chaining.\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the reverse option value.\r\n\t\t * @method ScrollMagic.Scene#reverse\r\n\t\t * @example\r\n\t\t * // get the current reverse option\r\n\t\t * var reverse = scene.reverse();\r\n\t\t *\r\n\t\t * // set new reverse option\r\n\t\t * scene.reverse(false);\r\n\t\t *\r\n\t\t * @fires {@link Scene.change}, when used as setter\r\n\t\t * @param {boolean} [newReverse] - The new reverse setting of the scene.\r\n\t\t * @returns {boolean} `get` - Current reverse option value.\r\n\t\t * @returns {Scene} `set` - Parent object for chaining.\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * **Get** or **Set** the loglevel option value.\r\n\t\t * @method ScrollMagic.Scene#loglevel\r\n\t\t * @example\r\n\t\t * // get the current loglevel\r\n\t\t * var loglevel = scene.loglevel();\r\n\t\t *\r\n\t\t * // set new loglevel\r\n\t\t * scene.loglevel(3);\r\n\t\t *\r\n\t\t * @fires {@link Scene.change}, when used as setter\r\n\t\t * @param {number} [newLoglevel] - The new loglevel setting of the scene. `[0-3]`\r\n\t\t * @returns {number} `get` - Current loglevel.\r\n\t\t * @returns {Scene} `set` - Parent object for chaining.\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * **Get** the associated controller.\r\n\t\t * @method ScrollMagic.Scene#controller\r\n\t\t * @example\r\n\t\t * // get the controller of a scene\r\n\t\t * var controller = scene.controller();\r\n\t\t *\r\n\t\t * @returns {ScrollMagic.Controller} Parent controller or `undefined`\r\n\t\t */\r\n\t\tthis.controller = function () {\r\n\t\t\treturn _controller;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** the current state.\r\n\t\t * @method ScrollMagic.Scene#state\r\n\t\t * @example\r\n\t\t * // get the current state\r\n\t\t * var state = scene.state();\r\n\t\t *\r\n\t\t * @returns {string} `\"BEFORE\"`, `\"DURING\"` or `\"AFTER\"`\r\n\t\t */\r\n\t\tthis.state = function () {\r\n\t\t\treturn _state;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** the current scroll offset for the start of the scene. \r\n\t\t * Mind, that the scrollOffset is related to the size of the container, if `triggerHook` is bigger than `0` (or `\"onLeave\"`). \r\n\t\t * This means, that resizing the container or changing the `triggerHook` will influence the scene's start offset.\r\n\t\t * @method ScrollMagic.Scene#scrollOffset\r\n\t\t * @example\r\n\t\t * // get the current scroll offset for the start and end of the scene.\r\n\t\t * var start = scene.scrollOffset();\r\n\t\t * var end = scene.scrollOffset() + scene.duration();\r\n\t\t * console.log(\"the scene starts at\", start, \"and ends at\", end);\r\n\t\t *\r\n\t\t * @returns {number} The scroll offset (of the container) at which the scene will trigger. Y value for vertical and X value for horizontal scrolls.\r\n\t\t */\r\n\t\tthis.scrollOffset = function () {\r\n\t\t\treturn _scrollOffset.start;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * **Get** the trigger position of the scene (including the value of the `offset` option). \r\n\t\t * @method ScrollMagic.Scene#triggerPosition\r\n\t\t * @example\r\n\t\t * // get the scene's trigger position\r\n\t\t * var triggerPosition = scene.triggerPosition();\r\n\t\t *\r\n\t\t * @returns {number} Start position of the scene. Top position value for vertical and left position value for horizontal scrolls.\r\n\t\t */\r\n\t\tthis.triggerPosition = function () {\r\n\t\t\tvar pos = _options.offset; // the offset is the basis\r\n\t\t\tif (_controller) {\r\n\t\t\t\t// get the trigger position\r\n\t\t\t\tif (_options.triggerElement) {\r\n\t\t\t\t\t// Element as trigger\r\n\t\t\t\t\tpos += _triggerPos;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// return the height of the triggerHook to start at the beginning\r\n\t\t\t\t\tpos += _controller.info(\"size\") * Scene.triggerHook();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn pos;\r\n\t\t};\r\n\r\n\r\n\t\tvar\r\n\t\t\t_pin,\r\n\t\t\t_pinOptions;\r\n\r\n\t\tScene\r\n\t\t\t.on(\"shift.internal\", function (e) {\r\n\t\t\t\tvar durationChanged = e.reason === \"duration\";\r\n\t\t\t\tif ((_state === SCENE_STATE_AFTER && durationChanged) || (_state === SCENE_STATE_DURING && _options.duration === 0)) {\r\n\t\t\t\t\t// if [duration changed after a scene (inside scene progress updates pin position)] or [duration is 0, we are in pin phase and some other value changed].\r\n\t\t\t\t\tupdatePinState();\r\n\t\t\t\t}\r\n\t\t\t\tif (durationChanged) {\r\n\t\t\t\t\tupdatePinDimensions();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.on(\"progress.internal\", function (e) {\r\n\t\t\t\tupdatePinState();\r\n\t\t\t})\r\n\t\t\t.on(\"add.internal\", function (e) {\r\n\t\t\t\tupdatePinDimensions();\r\n\t\t\t})\r\n\t\t\t.on(\"destroy.internal\", function (e) {\r\n\t\t\t\tScene.removePin(e.reset);\r\n\t\t\t});\r\n\t\t/**\r\n\t\t * Update the pin state.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar updatePinState = function (forceUnpin) {\r\n\t\t\tif (_pin && _controller) {\r\n\t\t\t\tvar\r\n\t\t\t\t\tcontainerInfo = _controller.info(),\r\n\t\t\t\t\tpinTarget = _pinOptions.spacer.firstChild; // may be pin element or another spacer, if cascading pins\r\n\r\n\t\t\t\tif (!forceUnpin && _state === SCENE_STATE_DURING) { // during scene or if duration is 0 and we are past the trigger\r\n\t\t\t\t\t// pinned state\r\n\t\t\t\t\tif (_util.css(pinTarget, \"position\") != \"fixed\") {\r\n\t\t\t\t\t\t// change state before updating pin spacer (position changes due to fixed collapsing might occur.)\r\n\t\t\t\t\t\t_util.css(pinTarget, {\r\n\t\t\t\t\t\t\t\"position\": \"fixed\"\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t// update pin spacer\r\n\t\t\t\t\t\tupdatePinDimensions();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar\r\n\t\t\t\t\t\tfixedPos = _util.get.offset(_pinOptions.spacer, true), // get viewport position of spacer\r\n\t\t\t\t\t\tscrollDistance = _options.reverse || _options.duration === 0 ?\r\n\t\t\t\t\t\tcontainerInfo.scrollPos - _scrollOffset.start // quicker\r\n\t\t\t\t\t\t:\r\n\t\t\t\t\t\tMath.round(_progress * _options.duration * 10) / 10; // if no reverse and during pin the position needs to be recalculated using the progress\r\n\r\n\t\t\t\t\t// add scrollDistance\r\n\t\t\t\t\tfixedPos[containerInfo.vertical ? \"top\" : \"left\"] += scrollDistance;\r\n\r\n\t\t\t\t\t// set new values\r\n\t\t\t\t\t_util.css(_pinOptions.spacer.firstChild, {\r\n\t\t\t\t\t\ttop: fixedPos.top,\r\n\t\t\t\t\t\tleft: fixedPos.left\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// unpinned state\r\n\t\t\t\t\tvar\r\n\t\t\t\t\t\tnewCSS = {\r\n\t\t\t\t\t\t\tposition: _pinOptions.inFlow ? \"relative\" : \"absolute\",\r\n\t\t\t\t\t\t\ttop: 0,\r\n\t\t\t\t\t\t\tleft: 0\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tchange = _util.css(pinTarget, \"position\") != newCSS.position;\r\n\r\n\t\t\t\t\tif (!_pinOptions.pushFollowers) {\r\n\t\t\t\t\t\tnewCSS[containerInfo.vertical ? \"top\" : \"left\"] = _options.duration * _progress;\r\n\t\t\t\t\t} else if (_options.duration > 0) { // only concerns scenes with duration\r\n\t\t\t\t\t\tif (_state === SCENE_STATE_AFTER && parseFloat(_util.css(_pinOptions.spacer, \"padding-top\")) === 0) {\r\n\t\t\t\t\t\t\tchange = true; // if in after state but havent updated spacer yet (jumped past pin)\r\n\t\t\t\t\t\t} else if (_state === SCENE_STATE_BEFORE && parseFloat(_util.css(_pinOptions.spacer, \"padding-bottom\")) === 0) { // before\r\n\t\t\t\t\t\t\tchange = true; // jumped past fixed state upward direction\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// set new values\r\n\t\t\t\t\t_util.css(pinTarget, newCSS);\r\n\t\t\t\t\tif (change) {\r\n\t\t\t\t\t\t// update pin spacer if state changed\r\n\t\t\t\t\t\tupdatePinDimensions();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Update the pin spacer and/or element size.\r\n\t\t * The size of the spacer needs to be updated whenever the duration of the scene changes, if it is to push down following elements.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar updatePinDimensions = function () {\r\n\t\t\tif (_pin && _controller && _pinOptions.inFlow) { // no spacerresize, if original position is absolute\r\n\t\t\t\tvar\r\n\t\t\t\t\tafter = (_state === SCENE_STATE_AFTER),\r\n\t\t\t\t\tbefore = (_state === SCENE_STATE_BEFORE),\r\n\t\t\t\t\tduring = (_state === SCENE_STATE_DURING),\r\n\t\t\t\t\tvertical = _controller.info(\"vertical\"),\r\n\t\t\t\t\tpinTarget = _pinOptions.spacer.firstChild, // usually the pined element but can also be another spacer (cascaded pins)\r\n\t\t\t\t\tmarginCollapse = _util.isMarginCollapseType(_util.css(_pinOptions.spacer, \"display\")),\r\n\t\t\t\t\tcss = {};\r\n\r\n\t\t\t\t// set new size\r\n\t\t\t\t// if relsize: spacer -> pin | else: pin -> spacer\r\n\t\t\t\tif (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) {\r\n\t\t\t\t\tif (during) {\r\n\t\t\t\t\t\t_util.css(_pin, {\r\n\t\t\t\t\t\t\t\"width\": _util.get.width(_pinOptions.spacer)\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t_util.css(_pin, {\r\n\t\t\t\t\t\t\t\"width\": \"100%\"\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// minwidth is needed for cascaded pins.\r\n\t\t\t\t\tcss[\"min-width\"] = _util.get.width(vertical ? _pin : pinTarget, true, true);\r\n\t\t\t\t\tcss.width = during ? css[\"min-width\"] : \"auto\";\r\n\t\t\t\t}\r\n\t\t\t\tif (_pinOptions.relSize.height) {\r\n\t\t\t\t\tif (during) {\r\n\t\t\t\t\t\t// the only padding the spacer should ever include is the duration (if pushFollowers = true), so we need to substract that.\r\n\t\t\t\t\t\t_util.css(_pin, {\r\n\t\t\t\t\t\t\t\"height\": _util.get.height(_pinOptions.spacer) - (_pinOptions.pushFollowers ? _options.duration : 0)\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t_util.css(_pin, {\r\n\t\t\t\t\t\t\t\"height\": \"100%\"\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// margin is only included if it's a cascaded pin to resolve an IE9 bug\r\n\t\t\t\t\tcss[\"min-height\"] = _util.get.height(vertical ? pinTarget : _pin, true, !marginCollapse); // needed for cascading pins\r\n\t\t\t\t\tcss.height = during ? css[\"min-height\"] : \"auto\";\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add space for duration if pushFollowers is true\r\n\t\t\t\tif (_pinOptions.pushFollowers) {\r\n\t\t\t\t\tcss[\"padding\" + (vertical ? \"Top\" : \"Left\")] = _options.duration * _progress;\r\n\t\t\t\t\tcss[\"padding\" + (vertical ? \"Bottom\" : \"Right\")] = _options.duration * (1 - _progress);\r\n\t\t\t\t}\r\n\t\t\t\t_util.css(_pinOptions.spacer, css);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Updates the Pin state (in certain scenarios)\r\n\t\t * If the controller container is not the document and we are mid-pin-phase scrolling or resizing the main document can result to wrong pin positions.\r\n\t\t * So this function is called on resize and scroll of the document.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar updatePinInContainer = function () {\r\n\t\t\tif (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info(\"isDocument\")) {\r\n\t\t\t\tupdatePinState();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Updates the Pin spacer size state (in certain scenarios)\r\n\t\t * If container is resized during pin and relatively sized the size of the pin might need to be updated...\r\n\t\t * So this function is called on resize of the container.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar updateRelativePinSpacer = function () {\r\n\t\t\tif (_controller && _pin && // well, duh\r\n\t\t\t\t_state === SCENE_STATE_DURING && // element in pinned state?\r\n\t\t\t\t( // is width or height relatively sized, but not in relation to body? then we need to recalc.\r\n\t\t\t\t\t((_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) && _util.get.width(window) != _util.get.width(_pinOptions.spacer.parentNode)) ||\r\n\t\t\t\t\t(_pinOptions.relSize.height && _util.get.height(window) != _util.get.height(_pinOptions.spacer.parentNode))\r\n\t\t\t\t)\r\n\t\t\t) {\r\n\t\t\t\tupdatePinDimensions();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Is called, when the mousewhel is used while over a pinned element inside a div container.\r\n\t\t * If the scene is in fixed state scroll events would be counted towards the body. This forwards the event to the scroll container.\r\n\t\t * @private\r\n\t\t */\r\n\t\tvar onMousewheelOverPin = function (e) {\r\n\t\t\tif (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info(\"isDocument\")) { // in pin state\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\t_controller._setScrollPos(_controller.info(\"scrollPos\") - ((e.wheelDelta || e[_controller.info(\"vertical\") ? \"wheelDeltaY\" : \"wheelDeltaX\"]) / 3 || -e.detail * 30));\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Pin an element for the duration of the scene.\r\n\t\t * If the scene duration is 0 the element will only be unpinned, if the user scrolls back past the start position. \r\n\t\t * Make sure only one pin is applied to an element at the same time.\r\n\t\t * An element can be pinned multiple times, but only successively.\r\n\t\t * _**NOTE:** The option `pushFollowers` has no effect, when the scene duration is 0._\r\n\t\t * @method ScrollMagic.Scene#setPin\r\n\t\t * @example\r\n\t\t * // pin element and push all following elements down by the amount of the pin duration.\r\n\t\t * scene.setPin(\"#pin\");\r\n\t\t *\r\n\t\t * // pin element and keeping all following elements in their place. The pinned element will move past them.\r\n\t\t * scene.setPin(\"#pin\", {pushFollowers: false});\r\n\t\t *\r\n\t\t * @param {(string|object)} element - A Selector targeting an element or a DOM object that is supposed to be pinned.\r\n\t\t * @param {object} [settings] - settings for the pin\r\n\t\t * @param {boolean} [settings.pushFollowers=true] - If `true` following elements will be \"pushed\" down for the duration of the pin, if `false` the pinned element will just scroll past them. \r\n\t\t \t\t\t\t\t\t\t\t\t\t\t\t Ignored, when duration is `0`.\r\n\t\t * @param {string} [settings.spacerClass=\"scrollmagic-pin-spacer\"] - Classname of the pin spacer element, which is used to replace the element.\r\n\t\t *\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.setPin = function (element, settings) {\r\n\t\t\tvar\r\n\t\t\t\tdefaultSettings = {\r\n\t\t\t\t\tpushFollowers: true,\r\n\t\t\t\t\tspacerClass: \"scrollmagic-pin-spacer\"\r\n\t\t\t\t};\r\n\t\t\tvar pushFollowersActivelySet = settings && settings.hasOwnProperty('pushFollowers');\r\n\t\t\tsettings = _util.extend({}, defaultSettings, settings);\r\n\r\n\t\t\t// validate Element\r\n\t\t\telement = _util.get.elements(element)[0];\r\n\t\t\tif (!element) {\r\n\t\t\t\tlog(1, \"ERROR calling method 'setPin()': Invalid pin element supplied.\");\r\n\t\t\t\treturn Scene; // cancel\r\n\t\t\t} else if (_util.css(element, \"position\") === \"fixed\") {\r\n\t\t\t\tlog(1, \"ERROR calling method 'setPin()': Pin does not work with elements that are positioned 'fixed'.\");\r\n\t\t\t\treturn Scene; // cancel\r\n\t\t\t}\r\n\r\n\t\t\tif (_pin) { // preexisting pin?\r\n\t\t\t\tif (_pin === element) {\r\n\t\t\t\t\t// same pin we already have -> do nothing\r\n\t\t\t\t\treturn Scene; // cancel\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// kill old pin\r\n\t\t\t\t\tScene.removePin();\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t\t_pin = element;\r\n\r\n\t\t\tvar\r\n\t\t\t\tparentDisplay = _pin.parentNode.style.display,\r\n\t\t\t\tboundsParams = [\"top\", \"left\", \"bottom\", \"right\", \"margin\", \"marginLeft\", \"marginRight\", \"marginTop\", \"marginBottom\"];\r\n\r\n\t\t\t_pin.parentNode.style.display = 'none'; // hack start to force css to return stylesheet values instead of calculated px values.\r\n\t\t\tvar\r\n\t\t\t\tinFlow = _util.css(_pin, \"position\") != \"absolute\",\r\n\t\t\t\tpinCSS = _util.css(_pin, boundsParams.concat([\"display\"])),\r\n\t\t\t\tsizeCSS = _util.css(_pin, [\"width\", \"height\"]);\r\n\t\t\t_pin.parentNode.style.display = parentDisplay; // hack end.\r\n\r\n\t\t\tif (!inFlow && settings.pushFollowers) {\r\n\t\t\t\tlog(2, \"WARNING: If the pinned element is positioned absolutely pushFollowers will be disabled.\");\r\n\t\t\t\tsettings.pushFollowers = false;\r\n\t\t\t}\r\n\t\t\twindow.setTimeout(function () { // wait until all finished, because with responsive duration it will only be set after scene is added to controller\r\n\t\t\t\tif (_pin && _options.duration === 0 && pushFollowersActivelySet && settings.pushFollowers) {\r\n\t\t\t\t\tlog(2, \"WARNING: pushFollowers =\", true, \"has no effect, when scene duration is 0.\");\r\n\t\t\t\t}\r\n\t\t\t}, 0);\r\n\r\n\t\t\t// create spacer and insert\r\n\t\t\tvar\r\n\t\t\t\tspacer = _pin.parentNode.insertBefore(document.createElement('div'), _pin),\r\n\t\t\t\tspacerCSS = _util.extend(pinCSS, {\r\n\t\t\t\t\tposition: inFlow ? \"relative\" : \"absolute\",\r\n\t\t\t\t\tboxSizing: \"content-box\",\r\n\t\t\t\t\tmozBoxSizing: \"content-box\",\r\n\t\t\t\t\twebkitBoxSizing: \"content-box\"\r\n\t\t\t\t});\r\n\r\n\t\t\tif (!inFlow) { // copy size if positioned absolutely, to work for bottom/right positioned elements.\r\n\t\t\t\t_util.extend(spacerCSS, _util.css(_pin, [\"width\", \"height\"]));\r\n\t\t\t}\r\n\r\n\t\t\t_util.css(spacer, spacerCSS);\r\n\t\t\tspacer.setAttribute(PIN_SPACER_ATTRIBUTE, \"\");\r\n\t\t\t_util.addClass(spacer, settings.spacerClass);\r\n\r\n\t\t\t// set the pin Options\r\n\t\t\t_pinOptions = {\r\n\t\t\t\tspacer: spacer,\r\n\t\t\t\trelSize: { // save if size is defined using % values. if so, handle spacer resize differently...\r\n\t\t\t\t\twidth: sizeCSS.width.slice(-1) === \"%\",\r\n\t\t\t\t\theight: sizeCSS.height.slice(-1) === \"%\",\r\n\t\t\t\t\tautoFullWidth: sizeCSS.width === \"auto\" && inFlow && _util.isMarginCollapseType(pinCSS.display)\r\n\t\t\t\t},\r\n\t\t\t\tpushFollowers: settings.pushFollowers,\r\n\t\t\t\tinFlow: inFlow, // stores if the element takes up space in the document flow\r\n\t\t\t};\r\n\r\n\t\t\tif (!_pin.___origStyle) {\r\n\t\t\t\t_pin.___origStyle = {};\r\n\t\t\t\tvar\r\n\t\t\t\t\tpinInlineCSS = _pin.style,\r\n\t\t\t\t\tcopyStyles = boundsParams.concat([\"width\", \"height\", \"position\", \"boxSizing\", \"mozBoxSizing\", \"webkitBoxSizing\"]);\r\n\t\t\t\tcopyStyles.forEach(function (val) {\r\n\t\t\t\t\t_pin.___origStyle[val] = pinInlineCSS[val] || \"\";\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// if relative size, transfer it to spacer and make pin calculate it...\r\n\t\t\tif (_pinOptions.relSize.width) {\r\n\t\t\t\t_util.css(spacer, {\r\n\t\t\t\t\twidth: sizeCSS.width\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif (_pinOptions.relSize.height) {\r\n\t\t\t\t_util.css(spacer, {\r\n\t\t\t\t\theight: sizeCSS.height\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// now place the pin element inside the spacer\t\r\n\t\t\tspacer.appendChild(_pin);\r\n\t\t\t// and set new css\r\n\t\t\t_util.css(_pin, {\r\n\t\t\t\tposition: inFlow ? \"relative\" : \"absolute\",\r\n\t\t\t\tmargin: \"auto\",\r\n\t\t\t\ttop: \"auto\",\r\n\t\t\t\tleft: \"auto\",\r\n\t\t\t\tbottom: \"auto\",\r\n\t\t\t\tright: \"auto\"\r\n\t\t\t});\r\n\r\n\t\t\tif (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) {\r\n\t\t\t\t_util.css(_pin, {\r\n\t\t\t\t\tboxSizing: \"border-box\",\r\n\t\t\t\t\tmozBoxSizing: \"border-box\",\r\n\t\t\t\t\twebkitBoxSizing: \"border-box\"\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// add listener to document to update pin position in case controller is not the document.\r\n\t\t\twindow.addEventListener('scroll', updatePinInContainer);\r\n\t\t\twindow.addEventListener('resize', updatePinInContainer);\r\n\t\t\twindow.addEventListener('resize', updateRelativePinSpacer);\r\n\t\t\t// add mousewheel listener to catch scrolls over fixed elements\r\n\t\t\t_pin.addEventListener(\"mousewheel\", onMousewheelOverPin);\r\n\t\t\t_pin.addEventListener(\"DOMMouseScroll\", onMousewheelOverPin);\r\n\r\n\t\t\tlog(3, \"added pin\");\r\n\r\n\t\t\t// finally update the pin to init\r\n\t\t\tupdatePinState();\r\n\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Remove the pin from the scene.\r\n\t\t * @method ScrollMagic.Scene#removePin\r\n\t\t * @example\r\n\t\t * // remove the pin from the scene without resetting it (the spacer is not removed)\r\n\t\t * scene.removePin();\r\n\t\t *\r\n\t\t * // remove the pin from the scene and reset the pin element to its initial position (spacer is removed)\r\n\t\t * scene.removePin(true);\r\n\t\t *\r\n\t\t * @param {boolean} [reset=false] - If `false` the spacer will not be removed and the element's position will not be reset.\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.removePin = function (reset) {\r\n\t\t\tif (_pin) {\r\n\t\t\t\tif (_state === SCENE_STATE_DURING) {\r\n\t\t\t\t\tupdatePinState(true); // force unpin at position\r\n\t\t\t\t}\r\n\t\t\t\tif (reset || !_controller) { // if there's no controller no progress was made anyway...\r\n\t\t\t\t\tvar pinTarget = _pinOptions.spacer.firstChild; // usually the pin element, but may be another spacer (cascaded pins)...\r\n\t\t\t\t\tif (pinTarget.hasAttribute(PIN_SPACER_ATTRIBUTE)) { // copy margins to child spacer\r\n\t\t\t\t\t\tvar\r\n\t\t\t\t\t\t\tstyle = _pinOptions.spacer.style,\r\n\t\t\t\t\t\t\tvalues = [\"margin\", \"marginLeft\", \"marginRight\", \"marginTop\", \"marginBottom\"],\r\n\t\t\t\t\t\t\tmargins = {};\r\n\t\t\t\t\t\tvalues.forEach(function (val) {\r\n\t\t\t\t\t\t\tmargins[val] = style[val] || \"\";\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t_util.css(pinTarget, margins);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_pinOptions.spacer.parentNode.insertBefore(pinTarget, _pinOptions.spacer);\r\n\t\t\t\t\t_pinOptions.spacer.parentNode.removeChild(_pinOptions.spacer);\r\n\t\t\t\t\tif (!_pin.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) { // if it's the last pin for this element -> restore inline styles\r\n\t\t\t\t\t\t// TODO: only correctly set for first pin (when cascading) - how to fix?\r\n\t\t\t\t\t\t_util.css(_pin, _pin.___origStyle);\r\n\t\t\t\t\t\tdelete _pin.___origStyle;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\twindow.removeEventListener('scroll', updatePinInContainer);\r\n\t\t\t\twindow.removeEventListener('resize', updatePinInContainer);\r\n\t\t\t\twindow.removeEventListener('resize', updateRelativePinSpacer);\r\n\t\t\t\t_pin.removeEventListener(\"mousewheel\", onMousewheelOverPin);\r\n\t\t\t\t_pin.removeEventListener(\"DOMMouseScroll\", onMousewheelOverPin);\r\n\t\t\t\t_pin = undefined;\r\n\t\t\t\tlog(3, \"removed pin (reset: \" + (reset ? \"true\" : \"false\") + \")\");\r\n\t\t\t}\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\r\n\t\tvar\r\n\t\t\t_cssClasses,\r\n\t\t\t_cssClassElems = [];\r\n\r\n\t\tScene\r\n\t\t\t.on(\"destroy.internal\", function (e) {\r\n\t\t\t\tScene.removeClassToggle(e.reset);\r\n\t\t\t});\r\n\t\t/**\r\n\t\t * Define a css class modification while the scene is active. \r\n\t\t * When the scene triggers the classes will be added to the supplied element and removed, when the scene is over.\r\n\t\t * If the scene duration is 0 the classes will only be removed if the user scrolls back past the start position.\r\n\t\t * @method ScrollMagic.Scene#setClassToggle\r\n\t\t * @example\r\n\t\t * // add the class 'myclass' to the element with the id 'my-elem' for the duration of the scene\r\n\t\t * scene.setClassToggle(\"#my-elem\", \"myclass\");\r\n\t\t *\r\n\t\t * // add multiple classes to multiple elements defined by the selector '.classChange'\r\n\t\t * scene.setClassToggle(\".classChange\", \"class1 class2 class3\");\r\n\t\t *\r\n\t\t * @param {(string|object)} element - A Selector targeting one or more elements or a DOM object that is supposed to be modified.\r\n\t\t * @param {string} classes - One or more Classnames (separated by space) that should be added to the element during the scene.\r\n\t\t *\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.setClassToggle = function (element, classes) {\r\n\t\t\tvar elems = _util.get.elements(element);\r\n\t\t\tif (elems.length === 0 || !_util.type.String(classes)) {\r\n\t\t\t\tlog(1, \"ERROR calling method 'setClassToggle()': Invalid \" + (elems.length === 0 ? \"element\" : \"classes\") + \" supplied.\");\r\n\t\t\t\treturn Scene;\r\n\t\t\t}\r\n\t\t\tif (_cssClassElems.length > 0) {\r\n\t\t\t\t// remove old ones\r\n\t\t\t\tScene.removeClassToggle();\r\n\t\t\t}\r\n\t\t\t_cssClasses = classes;\r\n\t\t\t_cssClassElems = elems;\r\n\t\t\tScene.on(\"enter.internal_class leave.internal_class\", function (e) {\r\n\t\t\t\tvar toggle = e.type === \"enter\" ? _util.addClass : _util.removeClass;\r\n\t\t\t\t_cssClassElems.forEach(function (elem, key) {\r\n\t\t\t\t\ttoggle(elem, _cssClasses);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Remove the class binding from the scene.\r\n\t\t * @method ScrollMagic.Scene#removeClassToggle\r\n\t\t * @example\r\n\t\t * // remove class binding from the scene without reset\r\n\t\t * scene.removeClassToggle();\r\n\t\t *\r\n\t\t * // remove class binding and remove the changes it caused\r\n\t\t * scene.removeClassToggle(true);\r\n\t\t *\r\n\t\t * @param {boolean} [reset=false] - If `false` and the classes are currently active, they will remain on the element. If `true` they will be removed.\r\n\t\t * @returns {Scene} Parent object for chaining.\r\n\t\t */\r\n\t\tthis.removeClassToggle = function (reset) {\r\n\t\t\tif (reset) {\r\n\t\t\t\t_cssClassElems.forEach(function (elem, key) {\r\n\t\t\t\t\t_util.removeClass(elem, _cssClasses);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tScene.off(\"start.internal_class end.internal_class\");\r\n\t\t\t_cssClasses = undefined;\r\n\t\t\t_cssClassElems = [];\r\n\t\t\treturn Scene;\r\n\t\t};\r\n\r\n\t\t// INIT\r\n\t\tconstruct();\r\n\t\treturn Scene;\r\n\t};\r\n\r\n\t// store pagewide scene options\r\n\tvar SCENE_OPTIONS = {\r\n\t\tdefaults: {\r\n\t\t\tduration: 0,\r\n\t\t\toffset: 0,\r\n\t\t\ttriggerElement: undefined,\r\n\t\t\ttriggerHook: 0.5,\r\n\t\t\treverse: true,\r\n\t\t\tloglevel: 2\r\n\t\t},\r\n\t\tvalidate: {\r\n\t\t\toffset: function (val) {\r\n\t\t\t\tval = parseFloat(val);\r\n\t\t\t\tif (!_util.type.Number(val)) {\r\n\t\t\t\t\tthrow [\"Invalid value for option \\\"offset\\\":\", val];\r\n\t\t\t\t}\r\n\t\t\t\treturn val;\r\n\t\t\t},\r\n\t\t\ttriggerElement: function (val) {\r\n\t\t\t\tval = val || undefined;\r\n\t\t\t\tif (val) {\r\n\t\t\t\t\tvar elem = _util.get.elements(val)[0];\r\n\t\t\t\t\tif (elem && elem.parentNode) {\r\n\t\t\t\t\t\tval = elem;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthrow [\"Element defined in option \\\"triggerElement\\\" was not found:\", val];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn val;\r\n\t\t\t},\r\n\t\t\ttriggerHook: function (val) {\r\n\t\t\t\tvar translate = {\r\n\t\t\t\t\t\"onCenter\": 0.5,\r\n\t\t\t\t\t\"onEnter\": 1,\r\n\t\t\t\t\t\"onLeave\": 0\r\n\t\t\t\t};\r\n\t\t\t\tif (_util.type.Number(val)) {\r\n\t\t\t\t\tval = Math.max(0, Math.min(parseFloat(val), 1)); // make sure its betweeen 0 and 1\r\n\t\t\t\t} else if (val in translate) {\r\n\t\t\t\t\tval = translate[val];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrow [\"Invalid value for option \\\"triggerHook\\\": \", val];\r\n\t\t\t\t}\r\n\t\t\t\treturn val;\r\n\t\t\t},\r\n\t\t\treverse: function (val) {\r\n\t\t\t\treturn !!val; // force boolean\r\n\t\t\t},\r\n\t\t\tloglevel: function (val) {\r\n\t\t\t\tval = parseInt(val);\r\n\t\t\t\tif (!_util.type.Number(val) || val < 0 || val > 3) {\r\n\t\t\t\t\tthrow [\"Invalid value for option \\\"loglevel\\\":\", val];\r\n\t\t\t\t}\r\n\t\t\t\treturn val;\r\n\t\t\t}\r\n\t\t}, // holder for validation methods. duration validation is handled in 'getters-setters.js'\r\n\t\tshifts: [\"duration\", \"offset\", \"triggerHook\"], // list of options that trigger a `shift` event\r\n\t};\r\n\t/*\r\n\t * method used to add an option to ScrollMagic Scenes.\r\n\t * TODO: DOC (private for dev)\r\n\t */\r\n\tScrollMagic.Scene.addOption = function (name, defaultValue, validationCallback, shifts) {\r\n\t\tif (!(name in SCENE_OPTIONS.defaults)) {\r\n\t\t\tSCENE_OPTIONS.defaults[name] = defaultValue;\r\n\t\t\tSCENE_OPTIONS.validate[name] = validationCallback;\r\n\t\t\tif (shifts) {\r\n\t\t\t\tSCENE_OPTIONS.shifts.push(name);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tScrollMagic._util.log(1, \"[static] ScrollMagic.Scene -> Cannot add Scene option '\" + name + \"', because it already exists.\");\r\n\t\t}\r\n\t};\r\n\t// instance extension function for plugins\r\n\t// TODO: DOC (private for dev)\r\n\tScrollMagic.Scene.extend = function (extension) {\r\n\t\tvar oldClass = this;\r\n\t\tScrollMagic.Scene = function () {\r\n\t\t\toldClass.apply(this, arguments);\r\n\t\t\tthis.$super = _util.extend({}, this); // copy parent state\r\n\t\t\treturn extension.apply(this, arguments) || this;\r\n\t\t};\r\n\t\t_util.extend(ScrollMagic.Scene, oldClass); // copy properties\r\n\t\tScrollMagic.Scene.prototype = oldClass.prototype; // copy prototype\r\n\t\tScrollMagic.Scene.prototype.constructor = ScrollMagic.Scene; // restore constructor\r\n\t};\r\n\r\n\r\n\r\n\t/**\r\n\t * TODO: DOCS (private for dev)\r\n\t * @class\r\n\t * @private\r\n\t */\r\n\r\n\tScrollMagic.Event = function (type, namespace, target, vars) {\r\n\t\tvars = vars || {};\r\n\t\tfor (var key in vars) {\r\n\t\t\tthis[key] = vars[key];\r\n\t\t}\r\n\t\tthis.type = type;\r\n\t\tthis.target = this.currentTarget = target;\r\n\t\tthis.namespace = namespace || '';\r\n\t\tthis.timeStamp = this.timestamp = Date.now();\r\n\t\treturn this;\r\n\t};\r\n\r\n\t/*\r\n\t * TODO: DOCS (private for dev)\r\n\t */\r\n\r\n\tvar _util = ScrollMagic._util = (function (window) {\r\n\t\tvar U = {},\r\n\t\t\ti;\r\n\r\n\t\t/**\r\n\t\t * ------------------------------\r\n\t\t * internal helpers\r\n\t\t * ------------------------------\r\n\t\t */\r\n\r\n\t\t// parse float and fall back to 0.\r\n\t\tvar floatval = function (number) {\r\n\t\t\treturn parseFloat(number) || 0;\r\n\t\t};\r\n\t\t// get current style IE safe (otherwise IE would return calculated values for 'auto')\r\n\t\tvar _getComputedStyle = function (elem) {\r\n\t\t\treturn elem.currentStyle ? elem.currentStyle : window.getComputedStyle(elem);\r\n\t\t};\r\n\r\n\t\t// get element dimension (width or height)\r\n\t\tvar _dimension = function (which, elem, outer, includeMargin) {\r\n\t\t\telem = (elem === document) ? window : elem;\r\n\t\t\tif (elem === window) {\r\n\t\t\t\tincludeMargin = false;\r\n\t\t\t} else if (!_type.DomElement(elem)) {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\twhich = which.charAt(0).toUpperCase() + which.substr(1).toLowerCase();\r\n\t\t\tvar dimension = (outer ? elem['offset' + which] || elem['outer' + which] : elem['client' + which] || elem['inner' + which]) || 0;\r\n\t\t\tif (outer && includeMargin) {\r\n\t\t\t\tvar style = _getComputedStyle(elem);\r\n\t\t\t\tdimension += which === 'Height' ? floatval(style.marginTop) + floatval(style.marginBottom) : floatval(style.marginLeft) + floatval(style.marginRight);\r\n\t\t\t}\r\n\t\t\treturn dimension;\r\n\t\t};\r\n\t\t// converts 'margin-top' into 'marginTop'\r\n\t\tvar _camelCase = function (str) {\r\n\t\t\treturn str.replace(/^[^a-z]+([a-z])/g, '$1').replace(/-([a-z])/g, function (g) {\r\n\t\t\t\treturn g[1].toUpperCase();\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * ------------------------------\r\n\t\t * external helpers\r\n\t\t * ------------------------------\r\n\t\t */\r\n\r\n\t\t// extend obj – same as jQuery.extend({}, objA, objB)\r\n\t\tU.extend = function (obj) {\r\n\t\t\tobj = obj || {};\r\n\t\t\tfor (i = 1; i < arguments.length; i++) {\r\n\t\t\t\tif (!arguments[i]) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tfor (var key in arguments[i]) {\r\n\t\t\t\t\tif (arguments[i].hasOwnProperty(key)) {\r\n\t\t\t\t\t\tobj[key] = arguments[i][key];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn obj;\r\n\t\t};\r\n\r\n\t\t// check if a css display type results in margin-collapse or not\r\n\t\tU.isMarginCollapseType = function (str) {\r\n\t\t\treturn [\"block\", \"flex\", \"list-item\", \"table\", \"-webkit-box\"].indexOf(str) > -1;\r\n\t\t};\r\n\r\n\t\t// implementation of requestAnimationFrame\r\n\t\t// based on https://gist.github.com/paulirish/1579671\r\n\t\tvar\r\n\t\t\tlastTime = 0,\r\n\t\t\tvendors = ['ms', 'moz', 'webkit', 'o'];\r\n\t\tvar _requestAnimationFrame = window.requestAnimationFrame;\r\n\t\tvar _cancelAnimationFrame = window.cancelAnimationFrame;\r\n\t\t// try vendor prefixes if the above doesn't work\r\n\t\tfor (i = 0; !_requestAnimationFrame && i < vendors.length; ++i) {\r\n\t\t\t_requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame'];\r\n\t\t\t_cancelAnimationFrame = window[vendors[i] + 'CancelAnimationFrame'] || window[vendors[i] + 'CancelRequestAnimationFrame'];\r\n\t\t}\r\n\r\n\t\t// fallbacks\r\n\t\tif (!_requestAnimationFrame) {\r\n\t\t\t_requestAnimationFrame = function (callback) {\r\n\t\t\t\tvar\r\n\t\t\t\t\tcurrTime = new Date().getTime(),\r\n\t\t\t\t\ttimeToCall = Math.max(0, 16 - (currTime - lastTime)),\r\n\t\t\t\t\tid = window.setTimeout(function () {\r\n\t\t\t\t\t\tcallback(currTime + timeToCall);\r\n\t\t\t\t\t}, timeToCall);\r\n\t\t\t\tlastTime = currTime + timeToCall;\r\n\t\t\t\treturn id;\r\n\t\t\t};\r\n\t\t}\r\n\t\tif (!_cancelAnimationFrame) {\r\n\t\t\t_cancelAnimationFrame = function (id) {\r\n\t\t\t\twindow.clearTimeout(id);\r\n\t\t\t};\r\n\t\t}\r\n\t\tU.rAF = _requestAnimationFrame.bind(window);\r\n\t\tU.cAF = _cancelAnimationFrame.bind(window);\r\n\r\n\t\tvar\r\n\t\t\tloglevels = [\"error\", \"warn\", \"log\"],\r\n\t\t\tconsole = window.console || {};\r\n\r\n\t\tconsole.log = console.log || function () {}; // no console log, well - do nothing then...\r\n\t\t// make sure methods for all levels exist.\r\n\t\tfor (i = 0; i < loglevels.length; i++) {\r\n\t\t\tvar method = loglevels[i];\r\n\t\t\tif (!console[method]) {\r\n\t\t\t\tconsole[method] = console.log; // prefer .log over nothing\r\n\t\t\t}\r\n\t\t}\r\n\t\tU.log = function (loglevel) {\r\n\t\t\tif (loglevel > loglevels.length || loglevel <= 0) loglevel = loglevels.length;\r\n\t\t\tvar now = new Date(),\r\n\t\t\t\ttime = (\"0\" + now.getHours()).slice(-2) + \":\" + (\"0\" + now.getMinutes()).slice(-2) + \":\" + (\"0\" + now.getSeconds()).slice(-2) + \":\" + (\"00\" + now.getMilliseconds()).slice(-3),\r\n\t\t\t\tmethod = loglevels[loglevel - 1],\r\n\t\t\t\targs = Array.prototype.splice.call(arguments, 1),\r\n\t\t\t\tfunc = Function.prototype.bind.call(console[method], console);\r\n\t\t\targs.unshift(time);\r\n\t\t\tfunc.apply(console, args);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * ------------------------------\r\n\t\t * type testing\r\n\t\t * ------------------------------\r\n\t\t */\r\n\r\n\t\tvar _type = U.type = function (v) {\r\n\t\t\treturn Object.prototype.toString.call(v).replace(/^\\[object (.+)\\]$/, \"$1\").toLowerCase();\r\n\t\t};\r\n\t\t_type.String = function (v) {\r\n\t\t\treturn _type(v) === 'string';\r\n\t\t};\r\n\t\t_type.Function = function (v) {\r\n\t\t\treturn _type(v) === 'function';\r\n\t\t};\r\n\t\t_type.Array = function (v) {\r\n\t\t\treturn Array.isArray(v);\r\n\t\t};\r\n\t\t_type.Number = function (v) {\r\n\t\t\treturn !_type.Array(v) && (v - parseFloat(v) + 1) >= 0;\r\n\t\t};\r\n\t\t_type.DomElement = function (o) {\r\n\t\t\treturn (\r\n\t\t\t\ttypeof HTMLElement === \"object\" || typeof HTMLElement === \"function\" ? o instanceof HTMLElement || o instanceof SVGElement : //DOM2\r\n\t\t\t\to && typeof o === \"object\" && o !== null && o.nodeType === 1 && typeof o.nodeName === \"string\"\r\n\t\t\t);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * ------------------------------\r\n\t\t * DOM Element info\r\n\t\t * ------------------------------\r\n\t\t */\r\n\t\t// always returns a list of matching DOM elements, from a selector, a DOM element or an list of elements or even an array of selectors\r\n\t\tvar _get = U.get = {};\r\n\t\t_get.elements = function (selector) {\r\n\t\t\tvar arr = [];\r\n\t\t\tif (_type.String(selector)) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tselector = document.querySelectorAll(selector);\r\n\t\t\t\t} catch (e) { // invalid selector\r\n\t\t\t\t\treturn arr;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_type(selector) === 'nodelist' || _type.Array(selector) || selector instanceof NodeList) {\r\n\t\t\t\tfor (var i = 0, ref = arr.length = selector.length; i < ref; i++) { // list of elements\r\n\t\t\t\t\tvar elem = selector[i];\r\n\t\t\t\t\tarr[i] = _type.DomElement(elem) ? elem : _get.elements(elem); // if not an element, try to resolve recursively\r\n\t\t\t\t}\r\n\t\t\t} else if (_type.DomElement(selector) || selector === document || selector === window) {\r\n\t\t\t\tarr = [selector]; // only the element\r\n\t\t\t}\r\n\t\t\treturn arr;\r\n\t\t};\r\n\t\t// get scroll top value\r\n\t\t_get.scrollTop = function (elem) {\r\n\t\t\treturn (elem && typeof elem.scrollTop === 'number') ? elem.scrollTop : window.pageYOffset || 0;\r\n\t\t};\r\n\t\t// get scroll left value\r\n\t\t_get.scrollLeft = function (elem) {\r\n\t\t\treturn (elem && typeof elem.scrollLeft === 'number') ? elem.scrollLeft : window.pageXOffset || 0;\r\n\t\t};\r\n\t\t// get element height\r\n\t\t_get.width = function (elem, outer, includeMargin) {\r\n\t\t\treturn _dimension('width', elem, outer, includeMargin);\r\n\t\t};\r\n\t\t// get element width\r\n\t\t_get.height = function (elem, outer, includeMargin) {\r\n\t\t\treturn _dimension('height', elem, outer, includeMargin);\r\n\t\t};\r\n\r\n\t\t// get element position (optionally relative to viewport)\r\n\t\t_get.offset = function (elem, relativeToViewport) {\r\n\t\t\tvar offset = {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tleft: 0\r\n\t\t\t};\r\n\t\t\tif (elem && elem.getBoundingClientRect) { // check if available\r\n\t\t\t\tvar rect = elem.getBoundingClientRect();\r\n\t\t\t\toffset.top = rect.top;\r\n\t\t\t\toffset.left = rect.left;\r\n\t\t\t\tif (!relativeToViewport) { // clientRect is by default relative to viewport...\r\n\t\t\t\t\toffset.top += _get.scrollTop();\r\n\t\t\t\t\toffset.left += _get.scrollLeft();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn offset;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * ------------------------------\r\n\t\t * DOM Element manipulation\r\n\t\t * ------------------------------\r\n\t\t */\r\n\r\n\t\tU.addClass = function (elem, classname) {\r\n\t\t\tif (classname) {\r\n\t\t\t\tif (elem.classList)\r\n\t\t\t\t\telem.classList.add(classname);\r\n\t\t\t\telse\r\n\t\t\t\t\telem.className += ' ' + classname;\r\n\t\t\t}\r\n\t\t};\r\n\t\tU.removeClass = function (elem, classname) {\r\n\t\t\tif (classname) {\r\n\t\t\t\tif (elem.classList)\r\n\t\t\t\t\telem.classList.remove(classname);\r\n\t\t\t\telse\r\n\t\t\t\t\telem.className = elem.className.replace(new RegExp('(^|\\\\b)' + classname.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\r\n\t\t\t}\r\n\t\t};\r\n\t\t// if options is string -> returns css value\r\n\t\t// if options is array -> returns object with css value pairs\r\n\t\t// if options is object -> set new css values\r\n\t\tU.css = function (elem, options) {\r\n\t\t\tif (_type.String(options)) {\r\n\t\t\t\treturn _getComputedStyle(elem)[_camelCase(options)];\r\n\t\t\t} else if (_type.Array(options)) {\r\n\t\t\t\tvar\r\n\t\t\t\t\tobj = {},\r\n\t\t\t\t\tstyle = _getComputedStyle(elem);\r\n\t\t\t\toptions.forEach(function (option, key) {\r\n\t\t\t\t\tobj[option] = style[_camelCase(option)];\r\n\t\t\t\t});\r\n\t\t\t\treturn obj;\r\n\t\t\t} else {\r\n\t\t\t\tfor (var option in options) {\r\n\t\t\t\t\tvar val = options[option];\r\n\t\t\t\t\tif (val == parseFloat(val)) { // assume pixel for seemingly numerical values\r\n\t\t\t\t\t\tval += 'px';\r\n\t\t\t\t\t}\r\n\t\t\t\t\telem.style[_camelCase(option)] = val;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn U;\r\n\t}(window || {}));\r\n\r\n\r\n\tScrollMagic.Scene.prototype.addIndicators = function () {\r\n\t\tScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling addIndicators() due to missing Plugin \\'debug.addIndicators\\'. Please make sure to include plugins/debug.addIndicators.js');\r\n\t\treturn this;\r\n\t}\r\n\tScrollMagic.Scene.prototype.removeIndicators = function () {\r\n\t\tScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeIndicators() due to missing Plugin \\'debug.addIndicators\\'. Please make sure to include plugins/debug.addIndicators.js');\r\n\t\treturn this;\r\n\t}\r\n\tScrollMagic.Scene.prototype.setTween = function () {\r\n\t\tScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setTween() due to missing Plugin \\'animation.gsap\\'. Please make sure to include plugins/animation.gsap.js');\r\n\t\treturn this;\r\n\t}\r\n\tScrollMagic.Scene.prototype.removeTween = function () {\r\n\t\tScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeTween() due to missing Plugin \\'animation.gsap\\'. Please make sure to include plugins/animation.gsap.js');\r\n\t\treturn this;\r\n\t}\r\n\tScrollMagic.Scene.prototype.setVelocity = function () {\r\n\t\tScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setVelocity() due to missing Plugin \\'animation.velocity\\'. Please make sure to include plugins/animation.velocity.js');\r\n\t\treturn this;\r\n\t}\r\n\tScrollMagic.Scene.prototype.removeVelocity = function () {\r\n\t\tScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeVelocity() due to missing Plugin \\'animation.velocity\\'. Please make sure to include plugins/animation.velocity.js');\r\n\t\treturn this;\r\n\t}\r\n\r\n\treturn ScrollMagic;\r\n}));","export const EventBus = document.body;\r\n\r\nexport const EventTypes = Object.freeze({\r\n ALL_COMPONENTS_READY: 'ALL_COMPONENTS_READY',\r\n MY_CUSTOM_EVENT: 'MY_CUSTOM_EVENT'\r\n})\r\n","const BASE_URL = '/umbraco/api'\r\nexport const ENDPOINT_IS_AUTHENTICATED = `${BASE_URL}/account/IsAuthenticated`\r\n\r\nexport const ENDPOINT_GH_REPOS = `https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits`\r\nexport const ENDPOINT_SMK_ART = `https://api.smk.dk/api/v1/art/search/?keys=hest&offset=0&rows=5`\r\nexport const ENDPOINT_MATRIKEL = `https://dawa.aws.dk/jordstykker/2000174/1209?format=geojson&srid=25832&noformat&cache=no-cache`\r\n\r\n\r\nconst headersDefault = Object.freeze({\r\n 'Content-Type': 'application/json'\r\n})\r\n\r\n\r\nexport const getEndpoint = (ENDPOINT, POST = false, payload) => {\r\n const options = {\r\n method: POST ? 'POST' : 'GET',\r\n headers: {...{}, ...headersDefault},\r\n ...POST && payload && {body: JSON.stringify({...{}, ...payload})}\r\n }\r\n\r\n return fetch(ENDPOINT, options)\r\n .then(res => res)\r\n .then(res => res.json())\r\n .catch(error => console.log(error))\r\n}\r\n\r\nexport function simulateDelayedResponse(data, delay, shouldSucceed) {\r\n return new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n if (shouldSucceed) {\r\n resolve({\r\n success: true,\r\n status: 200,\r\n data: data\r\n });\r\n } else {\r\n reject({\r\n success: false,\r\n status: 500,\r\n error: 'Simulated Error'\r\n });\r\n }\r\n }, delay);\r\n });\r\n}\r\n","import users from '../json/mockdata.json'\r\nimport {EventBus, EventTypes} from '../consts/const-event-types'\r\nimport UserItem from './user-item/user-item'\r\nimport {ENDPOINT_SMK_ART, getEndpoint} from '../services/service-some-api'\r\n\r\n/*\r\nUse App.js for global functionality\r\n*/\r\n\r\nexport default class App {\r\n constructor(element) {\r\n // save a reference of your component-element so you can access it from your methods:\r\n this.el = element\r\n\r\n // bind your methods to 'this' when calling them from event-listeners:\r\n this.onAppReady = this.onAppReady.bind(this)\r\n\r\n this.init()\r\n }\r\n\r\n init() {\r\n console.log(\"app init\")\r\n // Use init-method to store DOM-references and setup initial event-listeners:\r\n if(this.el) this.someElement = this.el.querySelector('[data-example-js-selector]')\r\n\r\n // You could listen for all components to be instantiated to make sure events between components are captured:\r\n EventBus.addEventListener(EventTypes.ALL_COMPONENTS_READY, this.onAppReady);\r\n\r\n \r\n\r\n\r\n }\r\n\r\n onAppReady(event) {\r\n \r\n // create your own event-types for component-to-component communication (fx. this event will be picked up by Header.js component):\r\n const eventData = {detail: new Date().toJSON()}\r\n const ev = new CustomEvent(EventTypes.MY_CUSTOM_EVENT, eventData)\r\n EventBus.dispatchEvent(ev)\r\n }\r\n\r\n}\r\n","export default class ExampleComponent {\r\n constructor(element) {\r\n this.el = element\r\n this.init()\r\n }\r\n\r\n init() {\r\n // console.log('Example-component initiated with this element', this.el)\r\n }\r\n}\r\n","export default class UserItem {\r\n constructor(element, data) {\r\n this.el = element\r\n this.data = data\r\n\r\n this.onClick = this.onClick.bind(this)\r\n\r\n this.init()\r\n }\r\n\r\n init() {\r\n this.el.addEventListener('click', this.onClick)\r\n }\r\n\r\n onClick() {\r\n console.log('UserItem clicked', this.el.textContent, this.data)\r\n }\r\n\r\n static template(data) {\r\n const {name} = data\r\n return `\r\n
  • ${name}
  • \r\n `\r\n }\r\n}\r\n","export default class MenuDropdown {\r\n constructor(element) {\r\n this.el = element;\r\n this.checkbox = this.el.querySelector(\"input\");\r\n this.svg = this.el.querySelector(\"label svg\");\r\n this.dropdown = this.el.querySelector(\"[data-dropdown]\");\r\n this.setTabState = this.setTabState.bind(this);\r\n this.init()\r\n }\r\n \r\n init() {\r\n if (this.checkbox){ \r\n this.checkbox.addEventListener('change', e =>{\r\n this.setTabState()\r\n })\r\n }\r\n window.addEventListener('scroll', () => {\r\n if (this.checkbox.checked){\r\n this.checkbox.checked = false;\r\n this.setTabState();\r\n }\r\n }, {passive:true})\r\n window.addEventListener('click', (e) => {\r\n if (!this.el.contains(e.target)){\r\n this.checkbox.checked = false;\r\n this.setTabState();\r\n }\r\n })\r\n }\r\n\r\n setTabState(){\r\n let dropdownlinks = this.dropdown.querySelectorAll(\"a\");\r\n if (this.checkbox.checked){\r\n this.svg.classList.add(\"rotate\");\r\n if (dropdownlinks){\r\n dropdownlinks.forEach(element => {\r\n element.tabIndex = 0;\r\n });\r\n }\r\n } else{\r\n this.svg.classList.remove(\"rotate\");\r\n if (dropdownlinks){\r\n dropdownlinks.forEach(element => {\r\n element.tabIndex = -1;\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n","export default class MenuMain {\r\n constructor(element) {\r\n this.el = element\r\n this.burger = this.el.querySelector('#menuburger');\r\n this.menuSlider = this.el.querySelector('#menu-slider');\r\n this.burgerContainer = this.el.querySelector(\"[data-burgercontainer]\");\r\n this.init()\r\n }\r\n \r\n init() {\r\n this.burger.addEventListener(\"change\", e =>{\r\n this.menuSlider.classList.add(\"duration-500\")\r\n if (this.burger.checked){\r\n this.burgerContainer.ariaExpanded = !JSON.parse(this.burgerContainer.ariaExpanded);\r\n this.menuSlider.classList.remove(\"translate-x-full\")\r\n this.menuSlider.classList.add(\"translate-x-0\");\r\n this.menuSlider.addEventListener('transitionend', () => {\r\n this.menuSlider.classList.remove(\"duration-500\");})\r\n }else{\r\n this.burgerContainer.ariaExpanded = !JSON.parse(this.burgerContainer.ariaExpanded, \"false\");\r\n this.menuSlider.classList.remove(\"translate-x-0\")\r\n this.menuSlider.classList.add(\"translate-x-full\")\r\n }\r\n })\r\n }\r\n}","export default class Accordion {\r\n constructor(element) {\r\n this.el = element;\r\n this.title = this.el.querySelector(\"[data-title]\");\r\n this.svg = this.title.querySelector(\"svg\");\r\n this.container = this.el.querySelector(\"[data-container]\");\r\n this.content = this.el.querySelector(\"[data-content]\");\r\n this.toggleAccordion = this.toggleAccordion.bind(this);\r\n this.init()\r\n }\r\n\r\n init() {\r\n this.el.addEventListener('click', e =>{\r\n this.toggleAccordion();\r\n })\r\n }\r\n\r\n toggleAccordion(){\r\n console.log(\"this.el: \", this.el)\r\n console.log('this.container: ', this.container)\r\n \r\n let contentHeight = this.content.offsetHeight;\r\n if (this.el.classList.contains(\"active\")){\r\n this.svg.classList.remove(\"rotate\")\r\n this.container.style.height = \"0px\";\r\n this.el.classList.remove(\"active\");\r\n this.el.setAttribute('aria-expanded', false);\r\n }\r\n else{\r\n this.svg.classList.add(\"rotate\")\r\n this.container.style.height = `${contentHeight}px`;\r\n this.el.classList.add(\"active\");\r\n this.el.setAttribute('aria-expanded', true);\r\n }\r\n }\r\n\r\n}\r\n","import ScrollMagic from 'ScrollMagic'\r\nexport default class MediaPlayer {\r\n constructor(element) {\r\n this.el = element;\r\n this.videoID = this.el.dataset.videoid;\r\n this.videoPlayerContainer = this.el.querySelector(\".video-container\");\r\n this.videoPlay = this.el.querySelector(\"svg\");\r\n this.videoImageOverlay = this.el.querySelector(\".video-image-overlay\");\r\n this.videoPlayer = this.el.querySelector(\".video-player\");\r\n \r\n this.hideImageOverlay = this.hideImageOverlay.bind(this);\r\n this.scrollCheck = this.scrollCheck.bind(this);\r\n\r\n this.onPlayerReady = this.onPlayerReady.bind(this);\r\n this.onYouTubeIframeAPIReady = this.onYouTubeIframeAPIReady.bind(this);\r\n this.onPlayerStateChange = this.onPlayerStateChange.bind(this);\r\n this.stopVideo = this.stopVideo.bind(this);\r\n this.playVideo = this.playVideo.bind(this);\r\n this.pauseVideo = this.pauseVideo.bind(this);\r\n this.isMyScriptLoaded = this.isMyScriptLoaded.bind(this);\r\n\r\n this.loadScript = this.loadScript.bind(this);\r\n\r\n this.done = false;\r\n this.player = {};\r\n this.init();\r\n }\r\n init(){\r\n \r\n if (!this.videoImageOverlay){\r\n this.loadScript()\r\n this.videoPlayerContainer.style.opacity = 1;\r\n this.scrollCheck();\r\n }else{\r\n if (this.videoPlay){\r\n this.videoPlay.addEventListener('click', e =>{\r\n this.hideImageOverlay(this.videoImageOverlay);\r\n \r\n })\r\n }\r\n }\r\n \r\n \r\n \r\n }\r\n\r\n loadScript(){\r\n if (this.videoID && !this.isMyScriptLoaded()){\r\n var tag = document.createElement('script');\r\n tag.src = \"https://www.youtube.com/iframe_api\";\r\n var firstScriptTag = document.getElementsByTagName('script')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n }\r\n if (this.videoID){\r\n this.playVideo();\r\n }\r\n // if (this.videoPlay){\r\n // this.videoPlay.addEventListener('click', e =>{\r\n // this.hideImageOverlay(this.videoImageOverlay);\r\n // })\r\n // }else{\r\n // this.videoPlayerContainer.style.opacity = 1;\r\n // this.scrollCheck();\r\n // }\r\n }\r\n\r\n hideImageOverlay(overlay){\r\n this.loadScript()\r\n if (overlay){\r\n overlay.style.opacity = 0;\r\n overlay.style.zIndex = 0;\r\n this.videoPlayer.style.opacity = 1;\r\n }\r\n if (this.videoPlayerContainer){\r\n this.videoPlayerContainer.style.opacity = 1; \r\n }\r\n this.onPlayerReady();\r\n //this.playVideo(); \r\n \r\n this.scrollCheck();\r\n }\r\n\r\n scrollCheck(){\r\n\r\n var controller = new ScrollMagic.Controller();\r\n var ourScene = new ScrollMagic.Scene({\r\n triggerElement:this.videoPlayerContainer,\r\n duration:\"100%\"\r\n }).on(\"leave\", e =>{\r\n console.log(\"im leaving\")\r\n this.player.pause();\r\n }).addTo(controller)\r\n\r\n }\r\n\r\n playVideo(){ \r\n if((typeof YT !== \"undefined\") && YT && YT.Player){ \r\n this.onYouTubeIframeAPIReady();\r\n this.scrollCheck();\r\n }else{\r\n setTimeout(this.playVideo, 100);\r\n }\r\n }\r\n \r\n\r\n onYouTubeIframeAPIReady(){\r\n this.player = new YT.Player('player-' +this.videoID, {\r\n height: '390',\r\n width: '640',\r\n videoId: this.videoID,\r\n host: 'http://www.youtube.com',\r\n events: {\r\n //'onReady': this.onPlayerReady,\r\n 'onStateChange': this.onPlayerStateChange\r\n }\r\n }); \r\n }\r\n\r\n onPlayerReady() { \r\n let thisIframe = this.el.querySelector(\"iframe\")\r\n if (thisIframe){\r\n thisIframe.classList.remove(\"opacity-0\"); \r\n }\r\n this.player.playVideo(); \r\n }\r\n\r\n onPlayerStateChange(event) {\r\n // if (event.data == YT.PlayerState.PLAYING && !this.done) {\r\n // setTimeout(this.stopVideo, 6000);\r\n // this.done = true;\r\n // }\r\n }\r\n\r\n stopVideo() { \r\n this.player.stopVideo();\r\n }\r\n\r\n pauseVideo(){\r\n this.player.pauseVideo();\r\n }\r\n\r\n scrollCheck(){\r\n console.log(\"scroll check\")\r\n var controller = new ScrollMagic.Controller();\r\n var ourScene = new ScrollMagic.Scene({\r\n triggerElement:this.videoPlayerContainer,\r\n duration:\"100%\"\r\n }).on(\"leave\", e =>{\r\n this.player.pauseVideo();\r\n }).addTo(controller)\r\n }\r\n\r\n isMyScriptLoaded(url) {\r\n if (!url) url = \"https://www.youtube.com/iframe_api\";\r\n var scripts = document.getElementsByTagName('script');\r\n for (var i = scripts.length; i--;) {\r\n if (scripts[i].src == url) return true;\r\n }\r\n return false;\r\n}\r\n\r\n}","import { openLogin } from \"../../services/service-login\";\r\n\r\nexport default class Header {\r\n constructor(element) {\r\n this.el = element;\r\n this.body = document.querySelector(\"body\");\r\n this.main = document.querySelector(\"main\");\r\n this.loginButtons = this.el.querySelectorAll(\"[data-login]\");\r\n this.loginPopup = document.querySelector(\"[data-loginpopup]\");\r\n this.searchButton = this.el.querySelectorAll(\"[data-searchbutton]\");\r\n this.searchArea = this.el.querySelector(\"[data-searcharea]\");\r\n this.messageCounter = this.el.querySelectorAll(\"[data-messagecounter]\");\r\n this.searchInput = this.el.querySelector(\"#global-search\");\r\n this.setScrollDirection = this.setScrollDirection.bind(this);\r\n this.toggleSearch = this.toggleSearch.bind(this);\r\n this.getMessageNumber = this.getMessageNumber.bind(this);\r\n this.insertMessageNumber = this.insertMessageNumber.bind(this);\r\n this.message = (this.el.dataset.message === \"True\");\r\n this.isEmployee = (this.el.dataset.employee === \"True\");\r\n this.isImpersonating = (this.el.dataset.isimpersonating === \"True\");\r\n this.isAuth = (this.el.dataset.message === \"True\");\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.setScrollDirection();\r\n if ((!this.isEmployee && this.isAuth) || (this.isEmployee && this.isImpersonating)) {\r\n this.getMessageNumber();\r\n }\r\n if (this.loginButtons) {\r\n this.loginButtons.forEach((button) => {\r\n let disabled = button.dataset.isDisabled;\r\n if (disabled === \"True\") {\r\n button.classList.add(\"cursor-not-allowed\");\r\n //remove href from button\r\n button.removeAttribute(\"href\");\r\n }\r\n });\r\n\r\n if (this.searchButton) {\r\n this.searchButton.forEach((button) => {\r\n button.addEventListener(\"click\", (e) => {\r\n this.toggleSearch();\r\n });\r\n });\r\n }\r\n\r\n window.addEventListener(\r\n \"scroll\",\r\n () => {\r\n document.documentElement.style.setProperty(\"--scroll-y\", `${window.scrollY}px`);\r\n },\r\n { passive: true }\r\n );\r\n }\r\n }\r\n\r\n getMessageNumber() {\r\n if (this.messageCounter && this.message == true) {\r\n var myHeaders = new Headers();\r\n myHeaders.append(\"Content-Type\", \"application/json\");\r\n\r\n var requestOptions = {\r\n method: \"GET\",\r\n headers: myHeaders,\r\n redirect: \"follow\",\r\n };\r\n\r\n fetch(\"/api/memberdata/GetUnreadPost\", requestOptions)\r\n .then((response) => response.json())\r\n .then((result) => this.insertMessageNumber(result))\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n }\r\n\r\n insertMessageNumber(messageNumber) {\r\n this.messageCounter.forEach((messageContainer) => {\r\n messageContainer.innerHTML = messageNumber;\r\n if (Number(messageNumber) > 9) {\r\n messageContainer.classList.remove(\"h-3\");\r\n messageContainer.classList.add(\"p-1\");\r\n messageContainer.classList.add(\"-translate-y-1\");\r\n messageContainer.classList.remove(\"translate-y-1\");\r\n }\r\n });\r\n }\r\n\r\n toggleSearch() {\r\n let menuHeight = this.el.offsetHeight + \"px\";\r\n if (this.body.classList.contains(\"search\")) {\r\n let scrollY = this.body.style.top;\r\n this.body.classList.remove(\"search\");\r\n this.body.style.top = \"\";\r\n window.scrollTo(0, parseInt(scrollY || \"0\") * -1);\r\n this.searchArea.style.height = null;\r\n this.searchArea.classList.add(\"border-t-0\");\r\n this.searchArea.classList.remove(\"border-t\");\r\n this.searchArea.classList.add(\"hidden\");\r\n } else {\r\n let scrollY = document.documentElement.style.getPropertyValue(\"--scroll-y\");\r\n //console.log('scrollY: ', scrollY)\r\n this.body.classList.add(\"search\");\r\n this.searchArea.classList.remove(\"hidden\");\r\n this.body.style.top = `-${scrollY}`;\r\n this.searchArea.style.height = \"calc(100vh - \" + menuHeight + \")\";\r\n this.searchArea.classList.remove(\"border-t-0\");\r\n this.searchArea.classList.add(\"border-t\");\r\n this.searchInput.focus();\r\n }\r\n }\r\n\r\n setScrollDirection() {\r\n const scrollUp = \"scroll-up\";\r\n const scrollDown = \"scroll-down\";\r\n let lastScroll = 0;\r\n window.addEventListener(\"scroll\", () => {\r\n if (!this.body.classList.contains(\"search\")) {\r\n const currentScroll = window.pageYOffset;\r\n\r\n if (currentScroll == 0) {\r\n this.body.classList.remove(scrollDown);\r\n }\r\n if (currentScroll <= 0) {\r\n this.body.classList.remove(scrollUp);\r\n return;\r\n }\r\n\r\n if (currentScroll > lastScroll) {\r\n // down\r\n this.body.classList.remove(scrollUp);\r\n this.body.classList.add(scrollDown);\r\n } else if (this.body.classList.contains(scrollDown)) {\r\n // up\r\n this.body.classList.remove(scrollDown);\r\n this.body.classList.add(scrollUp);\r\n }\r\n\r\n lastScroll = currentScroll;\r\n }\r\n });\r\n }\r\n}\r\n","import * as ScrollMagic from 'ScrollMagic' \r\nimport { ScrollMagicPluginIndicator} from \"scrollmagic-plugins\";\r\nexport default class AnchorMenu {\r\n constructor(element) {\r\n this.el = element\r\n this.anchorPoints = document.querySelectorAll(\"a[name]\");\r\n this.activatePointModule = this.activatePointModule.bind(this);\r\n this.init()\r\n }\r\n \r\n init() { \r\n document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => {\r\n anchor.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n document.querySelector(this.getAttribute('href')).scrollIntoView({\r\n behavior: 'smooth'\r\n });\r\n });\r\n });\r\n\r\n if (this.anchorPoints){\r\n this.activatePointModule(this.anchorPoints) \r\n }\r\n var anchorcontroller = new ScrollMagic.Controller();\r\n //ScrollMagicPluginIndicator(ScrollMagic);\r\n var headerSceen = new ScrollMagic.Scene({\r\n triggerElement: this.el,\r\n triggerHook: 0, \r\n })\r\n .setPin(this.el)\r\n .setClassToggle(this.el,\"pin\") \r\n .addTo(anchorcontroller) \r\n // .addIndicators({\r\n // colorTrigger:'black'\r\n // })\r\n }\r\n\r\n activatePointModule(points){\r\n var pointcontroller = new ScrollMagic.Controller();\r\n points.forEach(point =>{\r\n let anchorLink = this.el.querySelector(`a[href^=\"#${point[\"id\"]}\"]`)\r\n let module = point.nextElementSibling;\r\n let moduleHeight = module.offsetHeight; \r\n var anchorPoint = new ScrollMagic.Scene({\r\n triggerElement:module,\r\n duration:moduleHeight\r\n })\r\n .setClassToggle(anchorLink,\"active\")\r\n .addTo(pointcontroller) \r\n \r\n })\r\n \r\n\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n","import { getUrlParams, pushUrlParams} from \"./service-url-params\";\r\n\r\nexport function typeAhead(query, typeaheadquery, container, searchcontainer){\r\n let fullQuery = `${typeaheadquery}?q=${query}`\r\n var myHeaders = new Headers();\r\n myHeaders.append(\"Cookie\", \"ASP.NET_SessionId=l2f0euhrzotgfqpkdmmk0qas\");\r\n\r\n var requestOptions = {\r\n method: 'GET',\r\n headers: myHeaders,\r\n redirect: 'follow'\r\n };\r\n fetch(fullQuery, requestOptions)\r\n .then(response => response.json())\r\n .then(result => { \r\n buildTypeAhead(result,container, searchcontainer)\r\n })\r\n .catch(error => console.log('error', error));\r\n}\r\n\r\nexport function buildTypeAhead(json,container,searchcontainer){\r\n let ul = container.querySelector(\"ul\");\r\n const result = json.map(Terms =>{\r\n return `
  • ${Terms.Term}
  • `\r\n }).join(\" \");\r\n\r\n if (ul && json.length > 0){\r\n container.classList.remove(\"h-0\");\r\n container.classList.add(\"h-auto\");\r\n ul.innerHTML = result;\r\n let suggeations = ul.querySelectorAll(\"li\");\r\n suggeations.forEach(suggestion =>{\r\n suggestion.addEventListener(\"click\", e =>{\r\n let params = getUrlParams();\r\n container.classList.add(\"h-0\");\r\n container.classList.remove(\"h-auto\");\r\n searchcontainer.value = suggestion.innerText;\r\n params.query = suggestion.innerText;\r\n pushUrlParams(params); \r\n searchcontainer.dispatchEvent(new KeyboardEvent('keypress', {'key': 'Enter'}));\r\n })\r\n })\r\n }\r\n}","export function getUrlParams() {\r\n const {search} = window.location\r\n if(!search.includes('?')) return {}\r\n let hashes = search.slice(search.indexOf('?') + 1).split('&')\r\n return hashes.reduce((params, hash) => {\r\n let [key, val] = hash.split('=')\r\n\r\n // Change Q to term for search\r\n if(key.toLowerCase() === \"q\"){\r\n key = \"Term\";\r\n }\r\n\r\n return Object.assign(params, {[key]: decodeURIComponent(val)})\r\n }, {})\r\n}\r\n\r\n\r\nexport function pushUrlParams(params) \r\n{\r\n if(params.Size){\r\n delete params.Size;\r\n }\r\n\r\n // Change Term to Q in url for google\r\n if(params.Term){\r\n params.Q = params.Term;\r\n delete params.Term;\r\n }\r\n \r\n const query = Object.keys(params).map(key => `${key}=${encodeURI(params[key])}`).join('&');\r\n const pathQuery = query.length > 0 ? `${window.location.pathname}?${query}` : `${window.location.pathname}`;\r\n window.history.pushState('', '', pathQuery);\r\n}\r\n\r\n","import { getUrlParams, pushUrlParams } from \"../../services/service-url-params\";\r\nimport { typeAhead } from \"../../services/service-typeAhead\";\r\n\r\nexport default class GlobalSearch {\r\n constructor(element) {\r\n this.typeAheadQuery = \"https://laka.ankiro.dk/Rest/global/TypeAhead.json\"\r\n this.typeAheadArray = [];\r\n\r\n this.el = element;\r\n this.searchInput = this.el.querySelector(\"[data-searchinput]\");\r\n this.seaarchButton = this.el.querySelector(\"[data-globalsearch]\");\r\n this.searchResultPage = this.el.dataset.resultpage;\r\n this.TypeAheadContainer = this.el.querySelector(\"[data-typeahead]\");\r\n\r\n this.enterSearchParam = this.enterSearchParam.bind(this);\r\n this.init()\r\n }\r\n\r\n init() {\r\n this.searchInput.addEventListener('keydown', e =>{\r\n if (e.keyCode === 13){\r\n if (this.searchInput.value.length >= 3){\r\n this.enterSearchParam();\r\n typeAhead(this.searchInput.value, this.typeAheadQuery, this.TypeAheadContainer, this.searchInput) \r\n }\r\n }\r\n this.searchInput.addEventListener('keyup', e =>{\r\n if (e.keyCode != 13 && this.searchInput.value.length >=3 ){\r\n typeAhead(this.searchInput.value, this.typeAheadQuery, this.TypeAheadContainer, this.searchInput) \r\n }else{\r\n this.TypeAheadContainer.classList.add(\"h-0\");\r\n this.TypeAheadContainer.classList.remove(\"h-auto\");\r\n }\r\n })\r\n })\r\n\r\n this.seaarchButton.addEventListener('click', e =>{\r\n if (this.searchInput.value.length >= 3){\r\n this.enterSearchParam();\r\n }\r\n })\r\n }\r\n\r\n enterSearchParam(){\r\n let query = this.searchInput.value; \r\n document.location = `${this.searchResultPage}?query=${query}`\r\n }\r\n}","export default class IframeTab {\r\n constructor(element) {\r\n this.el = element\r\n this.tabs = this.el.querySelectorAll(\"button\");\r\n this.frameContainer = this.el.querySelector(\"[data-framecontainer]\");\r\n \r\n this.loadFrame = this.loadFrame.bind(this);\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n if (this.tabs){\r\n this.tabs.forEach(tab => {\r\n tab.addEventListener('click', e =>{\r\n this.loadFrame(tab.dataset.url, tab.dataset.id, tab.dataset.path)\r\n })\r\n });\r\n }\r\n }\r\n\r\n loadFrame(url, id, path){\r\n let content = `\r\n \r\n \r\n `\r\n \r\n this.frameContainer.innerHTML=content;\r\n\r\n }\r\n}\r\n","export default class ServiceCode {\r\n constructor(element) {\r\n this.el = element\r\n this.password = this.el.querySelector('#service-password');\r\n this.verifypassword = this.el.querySelector('#verify-service-password');\r\n this.submitbutton = this.el.querySelector('#btn-service-code');\r\n this.errornomatch = this.el.querySelector('#error-no-match');\r\n this.errornoinput = this.el.querySelector('#error-no-servicecode');\r\n this.errornoinput = this.el.querySelector('#error-no-servicecode');\r\n\r\n this.matchPassword = this.matchPassword.bind(this);\r\n this.checkEmptyPassword = this.checkEmptyPassword.bind(this);\r\n this.init()\r\n }\r\n \r\n init() {\r\n this.submitbutton.addEventListener('click', e =>{\r\n this.checkEmptyPassword();\r\n })\r\n this.verifypassword.addEventListener('blur', e =>{\r\n this.checkEmptyPassword();\r\n })\r\n }\r\n\r\n checkEmptyPassword(){\r\n if (this.password.value == '' && this.verifypassword.value == '') {\r\n this.errornoinput.classList.remove(\"hidden\");\r\n }\r\n else {\r\n this.errornoinput.classList.add(\"hidden\");\r\n this.matchPassword(); \r\n }\r\n }\r\n\r\n matchPassword(){\r\n if (this.password.value != this.verifypassword.value) {\r\n this.errornomatch.classList.remove(\"hidden\");\r\n }\r\n else {\r\n this.errornomatch.classList.add(\"hidden\");\r\n this.verifypassword.class;\r\n }\r\n }\r\n\r\n }\r\n ","export default class RichText {\r\n constructor(element) {\r\n this.el = element;\r\n this.tables = this.el.querySelectorAll(\"table\");\r\n this.checkOverflow = this.checkOverflow.bind(this);\r\n this.init();\r\n }\r\n\r\n init() {\r\n let tablearray = [...this.tables];\r\n if (tablearray != null) {\r\n tablearray.forEach((table) => {\r\n let tablecontainer = document.createElement(\"div\");\r\n tablecontainer.style.width = \"100%\";\r\n tablecontainer.style.overflowX = \"scroll\";\r\n tablecontainer.style.position = \"relative\";\r\n table.parentNode.insertBefore(tablecontainer, table);\r\n tablecontainer.appendChild(table);\r\n this.checkOverflow(table, tablecontainer);\r\n });\r\n }\r\n }\r\n checkOverflow(table, tablecontainer) {\r\n const tableWidth = table.scrollWidth;\r\n const containerWidth = tablecontainer.offsetWidth;\r\n if (tableWidth > containerWidth) {\r\n tablecontainer.insertAdjacentHTML(\"afterbegin\", '
    ');\r\n tablecontainer.addEventListener(\"click\", (e) => {\r\n tablecontainer.firstChild.classList.add(\"hidden\");\r\n });\r\n tablecontainer.addEventListener(\"touchstart\", (e) => {\r\n tablecontainer.firstChild.classList.add(\"hidden\");\r\n });\r\n }\r\n }\r\n}\r\n","export default class MailchimpSignup {\r\n constructor(element) {\r\n this.el = element\r\n this.init()\r\n }\r\n\r\n init() {\r\n const client = require(\"@mailchimp/mailchimp_marketing\");\r\n\r\n client.setConfig({\r\n apiKey: \"7eb9fc9d34068e154f62525b22275ba2-us7\",\r\n server: \"us7\",\r\n });\r\n\r\n const run = async () => {\r\n const response = await client.lists.getAllLists();\r\n console.log(response);\r\n };\r\n\r\n run();\r\n }\r\n}\r\n","export default class GoogleMap {\r\n constructor(element) {\r\n this.el = element\r\n this.street = this.el.dataset.street;\r\n this.city = this.el.dataset.city;\r\n this.init()\r\n }\r\n\r\n init() {\r\n let address = `${this.street}, ${this.city}`\r\n let googleframe = ``\r\n this.el.innerHTML = googleframe;\r\n }\r\n}\r\n","import { formatDate } from \"../../services/service-date\";\r\n\r\nexport default class Ical {\r\n constructor(element) {\r\n this.el = element\r\n this.startDate = this.el.dataset.start;\r\n this.endDate = this.el.dataset.end;\r\n this.summary = this.el.dataset.summary;\r\n this.description = this.el.dataset.description;\r\n this.street = this.el.dataset.street;\r\n this.zipcode = this.el.dataset.zipcode;\r\n this.city = this.el.dataset.city;\r\n this.generateIcsFile = this.generateIcsFile.bind(this);\r\n this.convertDateFormat = this.convertDateFormat.bind(this);\r\n \r\n this.init()\r\n }\r\n \r\n init() {\r\n this.el.addEventListener('click', e =>{\r\n this.generateIcsFile(); \r\n })\r\n }\r\n\r\n convertDateFormat(dateTime) {\r\n let fullDate = dateTime.split(\" \").join(\"T\");\r\n let year = fullDate.substring(6, 10);\r\n let month = fullDate.substring(3, 5);\r\n let day = fullDate.substring(0, 2);\r\n let time = fullDate.substring(10, 19)\r\n time = time.split(\".\").join(\"\");\r\n let formattedDate = encodeURIComponent(year + month + day + time + \"00\");\r\n return formattedDate;\r\n }\r\n\r\n generateIcsFile() {\r\n let icsFile =\r\n \"BEGIN:VCALENDAR\\n\" +\r\n \"CALSCALE:GREGORIAN\\n\" +\r\n \"METHOD:PUBLISH\\n\" +\r\n \"PRODID:-//Test Cal//EN\\n\" +\r\n \"VERSION:2.0\\n\" +\r\n \"BEGIN:VEVENT\\n\" +\r\n \"UID:test-1\\n\" +\r\n \"LOCATION:\" + this.street + \", \" + this.zipcode + this.city +\r\n \"\\n\" +\r\n \"DTSTART;VALUE=DATE:\" +\r\n this.convertDateFormat(this.startDate) +\r\n \"\\n\" +\r\n \"DTEND;VALUE=DATE:\" +\r\n this.convertDateFormat(this.endDate) +\r\n \"\\n\" +\r\n \"SUMMARY:\" +\r\n this.summary +\r\n \"\\n\" +\r\n \"DESCRIPTION:\" +\r\n this.description +\r\n \"\\n\" +\r\n \"END:VEVENT\\n\" +\r\n \"END:VCALENDAR\";\r\n \r\n this.downloadIcsFile(\"calendarevent\" + '.ics', icsFile);\r\n }\r\n\r\n downloadIcsFile(filename, fileBody) {\r\n let element = document.createElement('a');\r\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileBody));\r\n element.setAttribute('download', filename);\r\n element.setAttribute('target', \"_blank\");\r\n element.style.display = 'none';\r\n document.body.appendChild(element);\r\n element.click(); \r\n } \r\n }\r\n","export const getCookie = key => {\r\n const cookies = document.cookie\r\n if(!cookies) return null\r\n const cookieArray = cookies.split(';')\r\n const value = cookieArray\r\n .filter(cookie => {\r\n while(cookie.charAt(0) === ' ') cookie = cookie.substring(1)\r\n return cookie.split('=')[0] === key\r\n })\r\n .map(cookie => {\r\n while(cookie.charAt(0) === ' ') cookie = cookie.substring(1)\r\n return cookie.split('=')[1]\r\n })[0]\r\n\r\n if(value) {\r\n return decodeURIComponent(value)\r\n } else {\r\n return null\r\n }\r\n}\r\n\r\nexport const setCookie = (key, value, exdays = 365) => {\r\n const cookieValueString = value ? encodeURIComponent(value) : ''\r\n const d = new Date()\r\n d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000))\r\n const expires = \"expires=\" + d.toUTCString()\r\n document.cookie = `${key}=${cookieValueString};${expires};path=/;SameSite=Lax`\r\n}\r\n","import { setCookie } from \"../../services/service-cookies\";\r\nimport { getCookie } from \"../../services/service-cookies\";\r\n\r\nexport default class GlobalAlert {\r\n constructor(element) {\r\n this.el = element\r\n this.button = this.el.querySelector(\"[data-alert]\");\r\n this.init()\r\n }\r\n \r\n init() {\r\n let showAlert = getCookie(\"showAlert\");\r\n\r\n if (!showAlert) {\r\n setCookie(\"showAlert\", \"true\", 1)\r\n this.el.classList.remove(\"hidden\");\r\n }\r\n else {\r\n if (showAlert == \"true\") { \r\n this.el.classList.remove(\"hidden\");\r\n }\r\n } \r\n\r\n this.button.addEventListener('click', e => {\r\n this.el.classList.add(\"hidden\"); \r\n setCookie(\"showAlert\", \"false\", 1)\r\n }) \r\n }\r\n}\r\n \r\n ","\r\nexport default class PriceSaveCalculator {\r\n constructor(element) {\r\n this.el = element\r\n this.lakaMonth = this.el.dataset.price\r\n this.aKasse = this.el.querySelector(\"#akasse\");\r\n this.yearOfBirth = this.el.querySelector(\"#yearofbirth\");\r\n this.workload = this.el.querySelector(\"#workload\");\r\n this.submit = this.el.querySelector(\"button\");\r\n this.yearResult = this.el.querySelector(\"[data-yearresult]\");\r\n this.totalResult = this.el.querySelector(\"[data-totalResult]\"); \r\n this.generateAkasseList = this.generateAkasseList.bind(this);\r\n this.generateYearList = this.generateYearList.bind(this);\r\n this.generateResult = this.generateResult.bind(this);\r\n this.akassedata = this.el.querySelector(\"#akasser\");\r\n this.date = new Date();\r\n this.subtractYears = this.subtractYears.bind(this);\r\n this.getYearsTillRetirement = this.getYearsTillRetirement.bind(this);\r\n this.isActiveAkasse = false;\r\n this.isActiveYear = false;\r\n this.init()\r\n }\r\n \r\n init() {\r\n const newDate = this.subtractYears(this.date, 18)\r\n //this.generateAkasseList();\r\n this.generateYearList(newDate.getFullYear())\r\n\r\n this.aKasse.addEventListener('change', e=>{\r\n if (this.aKasse.value != \"\"){\r\n this.isActiveAkasse = true;\r\n if (this.isActiveYear){\r\n this.submit.disabled = false;\r\n }\r\n }else{\r\n this.isActiveAkasse = false;\r\n this.submit.disabled = true;\r\n }\r\n })\r\n\r\n this.yearOfBirth.addEventListener('change', e =>{\r\n if (this.yearOfBirth.value != \"\"){\r\n this.isActiveYear = true;\r\n if (this.isActiveAkasse){\r\n this.submit.disabled = false;\r\n }\r\n }else{\r\n this.isActiveYear = false;\r\n this.submit.disabled = true;\r\n }\r\n })\r\n\r\n this.submit.addEventListener(\"click\", e =>{\r\n this.generateResult(newDate.getFullYear());\r\n })\r\n }\r\n\r\n subtractYears(date, years){\r\n const dateCopy = new Date(date);\r\n dateCopy.setFullYear(date.getFullYear() - years);\r\n return dateCopy;\r\n }\r\n\r\n generateYearList(year){\r\n let years = `` \r\n for (var i = 1954; i <= year; i++){\r\n years = years + `<`\r\n }\r\n this.yearOfBirth.innerHTML = years;\r\n }\r\n\r\n generateAkasseList(){\r\n var json = JSON.parse(this.akassedata.textContent); \r\n const akasser = json.map((akasse, index) =>{ \r\n return `\r\n ${index === 0?`\r\n \r\n \r\n `:`\r\n \r\n `}\r\n `\r\n }).join(\"\");\r\n\r\n this.aKasse.innerHTML = akasser;\r\n }\r\n\r\n getYearsTillRetirement(choosenYear) {\r\n let retirementAge;\r\n\r\n if (choosenYear >= 1954 && choosenYear < 1955) {\r\n retirementAge = 66;\r\n }\r\n if (choosenYear >= 1955 && choosenYear < 1963) {\r\n retirementAge = 67;\r\n }\r\n if (choosenYear >= 1963 && choosenYear < 1967) {\r\n retirementAge = 68;\r\n }\r\n if (choosenYear >= 1967 && choosenYear < 1971) {\r\n retirementAge = 69;\r\n }\r\n if (choosenYear >= 1971 && choosenYear < 1975) {\r\n retirementAge = 70;\r\n }\r\n if (choosenYear >= 1975 && choosenYear < 1979) {\r\n retirementAge = 71;\r\n }\r\n if (choosenYear >= 1979 && choosenYear < 1987) {\r\n retirementAge = 72;\r\n }\r\n if (choosenYear >= 1987 && choosenYear < 1996) {\r\n retirementAge = 73;\r\n }\r\n if (choosenYear >= 1996) {\r\n retirementAge = 74;\r\n }\r\n\r\n let age = this.date.getFullYear() - choosenYear;\r\n let yearsTillRetirement = retirementAge - age; \r\n\r\n if (yearsTillRetirement < 0) {\r\n yearsTillRetirement = 0\r\n }\r\n\r\n return yearsTillRetirement;\r\n }\r\n\r\n generateResult(){\r\n let choosenAkasse = this.aKasse.value;\r\n let choosenYear = this.yearOfBirth.value;\r\n let lakaYear = Number(this.lakaMonth) * 12\r\n let yearlyCost = Number(choosenAkasse) * 12;\r\n let yearlySavings = yearlyCost - lakaYear;\r\n \r\n const yearsTillRetirement = this.getYearsTillRetirement(choosenYear)\r\n \r\n let totalSavings = yearlySavings * yearsTillRetirement;\r\n \r\n let yearResult = new Intl.NumberFormat('da-DK',{style: 'currency', currency: 'DKK'}).format(yearlySavings);;\r\n let totalSavingsResult = new Intl.NumberFormat('da-DK',{style: 'currency', currency: 'DKK'}).format(totalSavings);\r\n\r\n let test = new Intl.NumberFormat('da-DK',{style: 'currency', currency: 'DKK'}).format(yearlySavings);\r\n console.log('test: ', test)\r\n\r\n this.yearResult.innerText = yearlySavings >= 1 ? `${yearResult}` : `Ingen besparelse`\r\n if (yearlySavings >= 1 && yearsTillRetirement == 0){\r\n this.totalResult.innerText = `${yearResult}`\r\n }else{\r\n this.totalResult.innerText = totalSavings >= 1 ? `${totalSavingsResult}` : `Ingen besparelse`\r\n }\r\n\r\n }\r\n}\r\n","export function richTextModule(item)\r\n{ \r\n const richTextModule = `\r\n
    \r\n ${item.properties.richText.markup}\r\n
    \r\n `;\r\n return richTextModule;\r\n}\r\n","export function infoBoxModule(item) {\r\n \r\n let infoBg = \"\";\r\n //write a case statement based on item.content.properties.title\r\n switch (item.properties.background.label) {\r\n case \"green-60\":\r\n infoBg = \"bg-green-60\";\r\n break;\r\n case \"blue-20\":\r\n infoBg = \"bg-blue-20\";\r\n break;\r\n case \"pink-70\":\r\n infoBg = \"bg-pink-70\";\r\n break \r\n case \"orange-40\":\r\n infoBg = \"bg-orange-40\";\r\n break;\r\n default:\r\n infoBg = \"bg-pink-70\";\r\n }\r\n \r\n\r\n const infoBoxModule = `\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n ${item.properties.title != \"\" ? `

    ${item.properties.title}

    ` : \"\"}\r\n ${item.properties.content != \"\" ? `${item.properties.content.markup}` : \"\"}\r\n
    \r\n
    \r\n `;\r\n return infoBoxModule;\r\n}","import { accordionItem } from \"./accordionItem\"\r\nexport function accordionModule(item) {\r\n // console.log('accordion item: ', item)\r\n\r\n\r\n const accordionModule = ` \r\n
    \r\n ${item.properties.title != \"\" ? `

    ${item.properties.title}

    ` : \"\"}\r\n
    \r\n ${\r\n //map each item in item.content.properties.accordionList to an accordion item\r\n item.properties.accordionList.items.map((accordionitem, index) => {\r\n return accordionItem(accordionitem); \r\n }).join(\"\")\r\n } \r\n
    \r\n
    \r\n`\r\n return accordionModule;\r\n\r\n}","export function accordionItem(item) {\r\n const accordionItem = `\r\n
    \r\n Tryk på mellemrumstasten for at akrivere dropdown\r\n \r\n \r\n

    ${item.content.properties.title}

    \r\n
    \r\n
    \r\n
    \r\n ${item.content.properties.description.markup}\r\n
    \r\n
    \r\n
    \r\n
    \r\n `;\r\n return accordionItem;\r\n}\r\n","export function quoteModule(item) {\r\n const quoteModule = `\r\n
    \r\n
    \r\n \r\n
    \r\n

    ${item.properties.quote}

    \r\n ${item.properties.author != \"\" ? `

    ${item.properties.author}

    ` : \"\"} \r\n
    \r\n
    \r\n
    \r\n `;\r\n return quoteModule;\r\n}\r\n","export function imageModule(item){\r\n //set a variable to the crop in item.properties.image.crops with the alias \"MediumVideo\"\r\n const imageCrop = item.properties.image[0].crops.find(crop => crop.alias === \"VideoMedium\") \r\n \r\n const imageModule = `\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    `\r\n return imageModule;\r\n}","import { richTextModule } from \"../guidePage/richTextModule\";\r\nimport { infoBoxModule } from \"../guidePage/infoBoxModule\";\r\nimport { accordionModule } from \"../guidePage/accordionModule\";\r\nimport { quoteModule } from \"../guidePage/quoteModule.js\";\r\nimport { imageModule } from \"../guidePage/imageModule.js\";\r\n\r\nexport default class QuestionnaireModule {\r\n constructor(element) {\r\n this.el = element;\r\n //add this.answers as an array to the class and set it to an empty array\r\n this.answers = [];\r\n this.previousId;\r\n this.questionnaireContainer = this.el.querySelector(\".questionnaire-container\");\r\n this.startItem = this.el.dataset.startitem;\r\n this.questionnaireId = this.el.dataset.questionnaireid;\r\n this.GetQuestion = this.GetQuestion.bind(this);\r\n this.GenerateQuestion = this.GenerateQuestion.bind(this);\r\n this.GetResult = this.GetResult.bind(this);\r\n this.GenerateResult = this.GenerateResult.bind(this);\r\n this.UpdateAnswerArray = this.UpdateAnswerArray.bind(this);\r\n this.init();\r\n }\r\n init() {\r\n let startButton = this.el.querySelector(\"button\");\r\n if (startButton && this.questionnaireId) {\r\n //add event listener to start button\r\n startButton.addEventListener(\"click\", () => {\r\n this.GetQuestion(this.startItem);\r\n });\r\n }\r\n }\r\n\r\n GetQuestion(id) {\r\n const requestUrl = `/api/questionnaire/GetQuestion?id=${id}`;\r\n fetch(requestUrl)\r\n .then((response) => response.json())\r\n .then((result) => this.GenerateQuestion(result))\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n GenerateQuestion(json) {\r\n const qusetionHtml = `\r\n
    \r\n

    ${json.question}

    \r\n
    \r\n

    ${json.description}

    \r\n
    \r\n ${\r\n //find last item in this.answers. if item id is the same as json.id, set this.previousId to the answer to previous item id else set this.previousId last item in this.answers\r\n (this.answers.length > 0 ? (this.answers[this.answers.length - 1].id == json.id && this.answers.length > 1 ? (this.previousId = this.answers[this.answers.length - 2].id) : (this.previousId = this.answers[this.answers.length - 1].id)) : (this.previousId = this.startItem),\r\n json.id != this.startItem\r\n ? `\r\n `\r\n : ``)\r\n } \r\n
    \r\n
    \r\n
      \r\n ${\r\n //map the answers in json.answers and return them as radiobuttons with the answer as label and nextID as value\r\n json.answers\r\n .map((answer, key) => {\r\n return `\r\n
    • \r\n item.id == json.id && item.answer == answer.nextId) ? `checked` : ``}>\r\n \r\n
    • \r\n `;\r\n })\r\n .join(\"\")\r\n }\r\n
    \r\n
    \r\n `;\r\n this.questionnaireContainer.addEventListener(\r\n \"transitionend\",\r\n () => {\r\n this.questionnaireContainer.innerHTML = \"\";\r\n this.questionnaireContainer.insertAdjacentHTML(\"beforeend\", qusetionHtml);\r\n\r\n this.questionnaireContainer.classList.remove(\"fade-out\");\r\n\r\n //find the radiobuttons and add eventlistener to them and call GetQuestion with the value of the radiobutton\r\n let radioButtons = this.questionnaireContainer.querySelectorAll(\"input[type=radio]\");\r\n radioButtons.forEach((radioButton) => {\r\n radioButton.addEventListener(\"change\", () => {\r\n this.UpdateAnswerArray(json.id, radioButton.value);\r\n if (radioButton.dataset.isresult == \"true\") {\r\n this.GetResult(radioButton.dataset.key);\r\n } else {\r\n this.GetQuestion(radioButton.value);\r\n }\r\n });\r\n });\r\n\r\n //find the back button and add eventlistener to it and call GetQuestion with the value of the back button\r\n let backButton = this.questionnaireContainer.querySelector(\"button[data-backid]\");\r\n if (backButton) {\r\n backButton.addEventListener(\"click\", () => {\r\n const backButtonId = backButton.dataset.backid;\r\n // Find the index of the item in this.answers with the matching ID\r\n const index = this.answers.findIndex((item) => item.id === backButtonId);\r\n this.answers.splice(index, 1);\r\n // Call GetQuestion with the value of the back button and the ID of the current question\r\n this.GetQuestion(backButtonId);\r\n });\r\n }\r\n },\r\n { once: true }\r\n );\r\n\r\n this.questionnaireContainer.classList.add(\"fade-out\");\r\n }\r\n\r\n GetResult(key) {\r\n const requestUrl = `/umbraco/delivery/api/v1/content/item/${key}`;\r\n const requestOptions = { headers: { \"Api-Key\": \"sesamsesam\" } };\r\n\r\n fetch(requestUrl, requestOptions)\r\n .then((response) => response.json())\r\n .then((result) => {\r\n console.log(\"RESULT --->\", result);\r\n this.GenerateResult(result);\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n GenerateResult(json) {\r\n let resultHtml = `\r\n
    \r\n
    Dit resultat
    \r\n
    ${json.properties.result}
    \r\n
    ${json.properties.resultDesiption.markup}
    \r\n
    \r\n ${\r\n json.properties?.resultBlock\r\n ? `\r\n ${\r\n // Get the blocklist components\r\n json.properties?.resultBlock?.items\r\n .map((contentItem) => {\r\n return this.generateGuidePageContent(contentItem);\r\n })\r\n .join(\"\")\r\n } \r\n `\r\n : ``\r\n }\r\n
    \r\n
    \r\n
    \r\n ${\r\n json.properties?.image\r\n ? `\r\n ${json.properties.image?.map((image) => {\r\n // Get the image\r\n return `\r\n
    \r\n ${image.name}\r\n
    \r\n `;\r\n })} \r\n `\r\n : ``\r\n }\r\n
    \r\n `;\r\n\r\n this.questionnaireContainer.classList.add(\"fade-out\");\r\n setTimeout(() => {\r\n this.questionnaireContainer.innerHTML = \"\";\r\n this.questionnaireContainer.classList.remove(\"fade-out\");\r\n this.questionnaireContainer.insertAdjacentHTML(\"beforeend\", resultHtml);\r\n }, 500);\r\n }\r\n\r\n generateGuidePageContent(json) {\r\n //create a function which returns the correct markup based on the content type\r\n let contentType = json.content.contentType;\r\n let content = \"\";\r\n switch (contentType) {\r\n case \"richTextModule\":\r\n content = richTextModule(json.content);\r\n break;\r\n case \"infoBoxModule\":\r\n content = infoBoxModule(json.content);\r\n break;\r\n case \"accordionModule\":\r\n content = accordionModule(json.content);\r\n break;\r\n case \"imageModule\":\r\n content = imageModule(json.content);\r\n break;\r\n case \"quoteModule\":\r\n content = quoteModule(json.content);\r\n break;\r\n default:\r\n return \"\";\r\n }\r\n return content;\r\n }\r\n\r\n initContentElements() {\r\n let contentElements = this.guideContainer.querySelectorAll(\"[data-component]\");\r\n if (contentElements) {\r\n contentElements.forEach((item) => {\r\n switch (item.dataset.component) {\r\n case \"rich-text\":\r\n new RichText(item);\r\n break;\r\n case \"accordion\":\r\n new Accordion(item);\r\n default:\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n\r\n UpdateAnswerArray(id, answer) {\r\n //if id exists in this.answers, then update the answer else add the id and answer to this.answers\r\n if (this.answers.some((item) => item.id == id)) {\r\n this.answers.find((item) => item.id == id).answer = answer;\r\n } else {\r\n this.answers.push({ id: id, answer: answer });\r\n }\r\n }\r\n}\r\n","export const isMobile = () => {\r\n return window.matchMedia(\"(max-width: 767px)\").matches\r\n}\r\nexport const isDesktop = () => {\r\n return window.matchMedia(\"(min-width: 1024px)\").matches\r\n}\r\n\r\nexport const getViewPortWidth = () => {\r\n return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)\r\n}\r\n\r\nexport const getViewPortHeight = () => {\r\n return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)\r\n}\r\n","export function guideTitle(pageTitle, stepTitle, duration) {\r\n const guideTitle = `\r\n

    ${stepTitle}

    \r\n
    ${duration} min
    \r\n\r\n `;\r\n return guideTitle;\r\n}\r\n","export function button(item, type, lastbutton) {\r\n const button = `${item.title}\r\n \r\n \r\n `;\r\n return button;\r\n}\r\n","export function guideStepCheck(actionLinkText, step, state) {\r\n const guideStepCheck = `\r\n
    \r\n \r\n
    \r\n `;\r\n\r\n return guideStepCheck;\r\n}\r\n","import { button } from \"./button\";\r\nimport { guideStepCheck } from \"./guideStepCheck\";\r\nexport function guideStepCompleation(json, currentStep) {\r\n let isCompleted = currentStep.isCompleted;\r\n let hideLink = json.properties.hideActionLinkAfterStep;\r\n\r\n const guideStepCompleation = `\r\n ${json.properties.actionLink && json.properties.actionLink.length > 0 ? (!isCompleted || (isCompleted && !hideLink) ? button(json.properties.actionLink[0], \"actionlink\") : ``) : json.properties.actionLinkText != \"\" ? guideStepCheck(json.properties.actionLinkText, currentStep) : ``} \r\n ${json.properties.actionLink && json.properties.actionLink.length > 0 && json.properties.requiredActionButton && json.properties.actionLinkText != \"\" ? guideStepCheck(json.properties.actionLinkText, currentStep, isCompleted ? `` : `hidden`) : ``} \r\n `;\r\n return guideStepCompleation;\r\n}\r\n","export function setStepAsCompleated(stepJson, json, guideContainer) {\r\n // find item in stepJson with contentKey === json.id and set isCompleted to true\r\n stepJson.filter((item) => item.contentKey === json.id)[0].isCompleted = true;\r\n //find span in item in stepButtons with [data-currentstep]\r\n let currentStepSpan = guideContainer.querySelector(`[data-currentstep] span`);\r\n currentStepSpan.classList.add(\"bg-blue\");\r\n currentStepSpan.classList.add(\"text-white\");\r\n return setStepAsCompleated;\r\n}\r\n","export function insertInfoTextAfterCompleation(item, text, position) {\r\n let infoTextAfter = `

    ${text}

    `;\r\n item.insertAdjacentHTML(position, infoTextAfter);\r\n\r\n return insertInfoTextAfterCompleation;\r\n}\r\n","import { isDesktop } from \"../../services/service-utils.js\";\r\nimport RichText from \"../rich-text/rich-text.js\";\r\nimport Accordion from \"../accordion/accordion.js\";\r\nimport { richTextModule } from \"./richTextModule.js\";\r\nimport { infoBoxModule } from \"./infoBoxModule.js\";\r\nimport { accordionModule } from \"./accordionModule.js\";\r\nimport { guideTitle } from \"./guideTitle.js\";\r\nimport { receiptQuiz } from \"./receiptQuiz.js\";\r\nimport { imageModule } from \"./imageModule.js\";\r\nimport { quoteModule } from \"./quoteModule.js\";\r\nimport { button } from \"./button.js\";\r\nimport { checkForCompleated } from \"./checkForCompleated.js\";\r\nimport { receiptQuizFunction } from \"./receiptQuizFunction.js\";\r\nimport { guideStepCompleation } from \"./guideStepCompleation.js\";\r\nimport { setStepAsCompleated } from \"./SetStepAsCompleated.js\";\r\nimport { insertInfoTextAfterCompleation } from \"./insertInfoTextAfterCompleation.js\";\r\n\r\nexport default class GuidePage {\r\n constructor(element) {\r\n this.el = element;\r\n this.GuideID = this.el.dataset.guideid;\r\n this.guideContainer = this.el.querySelector(\".guide-container\");\r\n this.pagetitle = this.el.dataset.pagetitle;\r\n this.stepJson = {};\r\n this.stepList = ``;\r\n this.precentCompleated = 0;\r\n this.userId = this.el.dataset.uid;\r\n\r\n this.fetchStartPage = this.fetchStartPage.bind(this);\r\n this.generateStartPage = this.generateStartPage.bind(this);\r\n this.fetchChildren = this.fetchChildren.bind(this);\r\n this.generateStepList = this.generateStepList.bind(this);\r\n this.generateGuidePage = this.generateGuidePage.bind(this);\r\n this.generateGuidePageContent = this.generateGuidePageContent.bind(this);\r\n this.initContentElements = this.initContentElements.bind(this);\r\n this.generateStepButtons = this.generateStepButtons.bind(this);\r\n this.stepCompleated = this.stepCompleated.bind(this);\r\n\r\n this.init();\r\n }\r\n init() {\r\n if (this.GuideID) {\r\n this.fetchChildren(this.GuideID, \"startpage\");\r\n }\r\n }\r\n\r\n fetchStartPage(guideid, pageType) {\r\n var myHeaders = new Headers();\r\n myHeaders.append(\"Api-Key\", \"sesamsesam\");\r\n\r\n var requestOptions = {\r\n method: \"GET\",\r\n headers: myHeaders,\r\n redirect: \"follow\",\r\n };\r\n\r\n fetch(`/umbraco/delivery/api/v1/content/item/${guideid}`, requestOptions)\r\n .then((response) => response.json())\r\n .then((result) => {\r\n switch (pageType) {\r\n case \"startpage\":\r\n this.generateStartPage(result);\r\n break;\r\n default:\r\n //find the parent of this.el and add the class section-margin\r\n if (!isDesktop()) {\r\n this.el.parentElement.classList.add(\"section-margin\");\r\n }\r\n this.generateGuidePage(result);\r\n break;\r\n }\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n generateStartPage(json) {\r\n var html = `\r\n
    \r\n
    \r\n

    ${this.pagetitle}

    \r\n

    ${json.properties.title}

    \r\n ${json.properties.description.markup}\r\n
    \r\n
    \r\n ${this.generateStepList(this.stepJson)}\r\n
    \r\n
    \r\n `;\r\n this.guideContainer.insertAdjacentHTML(\"beforeend\", html);\r\n let startpageSteps = this.guideContainer.querySelectorAll(\".guide-container button\");\r\n if (startpageSteps) {\r\n startpageSteps.forEach((item) => {\r\n item.addEventListener(\"click\", (e) => {\r\n this.fetchStartPage(item.dataset.stepkey, \"guidepage\");\r\n });\r\n });\r\n }\r\n }\r\n\r\n fetchChildren(guideid, step) {\r\n var myHeaders = new Headers();\r\n myHeaders.append(\"Api-Key\", \"sesamsesam\");\r\n\r\n var requestOptions = {\r\n method: \"GET\",\r\n headers: myHeaders,\r\n redirect: \"follow\",\r\n };\r\n\r\n fetch(`/api/guides/${guideid}/steps-for-user/${this.userId}`, requestOptions)\r\n .then((response) => response.json())\r\n .then((result) => {\r\n this.precentCompleated = result.percentageDone;\r\n this.stepJson = result.steps;\r\n switch (step) {\r\n case \"startpage\":\r\n this.fetchStartPage(this.GuideID, \"startpage\");\r\n break;\r\n default:\r\n this.fetchStartPage(this.GuideID, \"startpage\");\r\n break;\r\n }\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n generateStepList(json) {\r\n const steps = json\r\n .map((item, index) => {\r\n return ``;\r\n })\r\n .join(\"\");\r\n return steps;\r\n }\r\n\r\n generateStepButtons(json, currentStep) {\r\n const steps = json\r\n .map((item, index) => {\r\n return ``;\r\n })\r\n .join(\"\");\r\n return steps;\r\n }\r\n\r\n generateGuidePage(json, isReceipt) {\r\n let pageTitle = this.pagetitle;\r\n let stepTitle = json.properties.title;\r\n let duration = json.properties.duration;\r\n let grid = json.properties.content.items;\r\n let gridLength = grid[0].areas.length;\r\n const currentStep = this.stepJson.filter((item) => item.contentKey === json.id)[0];\r\n const guidePage = `\r\n
    \r\n ${this.generateStepButtons(this.stepJson, json.id)}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    10 && this.precentCompleated < 90 ? `-translate-x-1/2` : ``} ${this.precentCompleated >= 90 ? `-translate-x-full` : ``}\" style=\"left:${this.precentCompleated}%\">${this.precentCompleated}%
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    ${pageTitle}

    \r\n ${\r\n //inster guideTitle if gridLength === 1\r\n gridLength === 1 && !isReceipt ? guideTitle(pageTitle, stepTitle, duration) : ``\r\n }\r\n ${\r\n //if receipt, show receipt text and button\r\n isReceipt\r\n ? `\r\n

    ${json.properties.receiptTitle}

    \r\n
    ${json.properties.receiptDescription.markup}
    \r\n
    \r\n ${button(json.properties.receiptButton[0], \"actionbutton\", true)}\r\n
    \r\n `\r\n : ``\r\n }\r\n
    \r\n ${\r\n //if not receipt, show grid\r\n !isReceipt\r\n ? `\r\n \r\n
    \r\n ${\r\n //loop through outer rows\r\n grid\r\n .map((item, firstindex) => {\r\n //loop through columns\r\n return item.areas\r\n .map((area, index) => {\r\n return `\r\n
    \r\n ${\r\n //if grid.areas[0].length is 2 and this is the first item in the area.index then call guideTitle with json.properties.title and json.properties.duration\r\n grid[0].areas.length != 1 && index === 0 && firstindex === 0 ? guideTitle(this.pagetitle, json.properties.title, json.properties.duration) : ``\r\n }\r\n ${\r\n //get the blocklist components\r\n area.items\r\n .map((contentItem) => {\r\n return this.generateGuidePageContent(contentItem);\r\n })\r\n .join(\"\")\r\n }\r\n ${\r\n //if guide step first column in last row and columnSpan is 6 add link and/or checkmark\r\n !currentStep.isReceipt && firstindex + 1 === grid.length && area.columnSpan === 6 && index === 0 && isDesktop() ? guideStepCompleation(json, currentStep) : ``\r\n } \r\n
    `;\r\n })\r\n .join(\"\");\r\n })\r\n .join(\"\")\r\n }\r\n
    \r\n\r\n ${\r\n //if guidestep and last row is 12 then add button and checkmark\r\n (!currentStep.isReceipt && grid[grid.length - 1].areas.length === 1 && isDesktop()) || (!isDesktop() && !currentStep.isReceipt)\r\n ? ` \r\n
    \r\n ${guideStepCompleation(json, currentStep)}\r\n
    \r\n `\r\n : ``\r\n }\r\n
    \r\n ${currentStep.isReceipt ? `
    ${receiptQuiz(json.properties.quiz.items, this.stepJson)}
    ` : ``}\r\n `\r\n : ``\r\n }\r\n ${isReceipt ? `
    ` : ``}\r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n `;\r\n //fade out and remove content from this.guideContainer\r\n this.guideContainer.classList.add(\"fade-out\");\r\n setTimeout(() => {\r\n this.guideContainer.innerHTML = \"\";\r\n this.guideContainer.insertAdjacentHTML(\"beforeend\", guidePage);\r\n this.initContentElements();\r\n //find height of data-stepbuttons and set .outer min-height to this height\r\n let stepButtonsContainer = this.guideContainer.querySelector(\"[data-stepbuttons]\");\r\n let outer = this.guideContainer.querySelector(\".outer\");\r\n if (stepButtonsContainer && outer) {\r\n let stepButtonsHeight = stepButtonsContainer.offsetHeight;\r\n outer.style.minHeight = `${stepButtonsHeight}px`;\r\n }\r\n //find quiz and add eventlisteners\r\n let quiz = this.guideContainer.querySelector(\".guide-quiz-outer\");\r\n if (quiz) {\r\n receiptQuizFunction(quiz);\r\n //find last quiz-slide\r\n let lastQuizSlide = quiz.querySelector(\".quiz-slide:last-of-type\");\r\n //add eventlistener to last quiz-slide radio buttons\r\n let lastQuizSlideRadioButtons = lastQuizSlide.querySelectorAll(\"input[type='radio']\");\r\n if (lastQuizSlideRadioButtons && !checkForCompleated(this.stepJson)) {\r\n lastQuizSlideRadioButtons.forEach((item) => {\r\n item.addEventListener(\"change\", (e) => {\r\n if (item.checked && item.value === \"true\") {\r\n this.generateGuidePage(json, true);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n //scroll page to top\r\n window.scrollTo(0, 0);\r\n //fade in content\r\n this.guideContainer.classList.remove(\"fade-out\");\r\n //add eventlisteners to step buttons\r\n let stepButtons = this.guideContainer.querySelectorAll(\"[data-stepkey]\");\r\n if (stepButtons) {\r\n stepButtons.forEach((item) => {\r\n item.addEventListener(\"click\", (e) => {\r\n if (item.dataset.isreceipt === \"true\") {\r\n this.fetchStartPage(item.dataset.stepkey, \"receiptpage\");\r\n } else {\r\n this.fetchStartPage(item.dataset.stepkey, \"guidepage\");\r\n }\r\n });\r\n });\r\n }\r\n let actionLink = this.guideContainer.querySelector(\"[data-type='actionbutton']\");\r\n let stepCheck = this.guideContainer.querySelector(\"[data-type='stepcheckbox']\");\r\n\r\n if (actionLink) {\r\n actionLink.addEventListener(\"click\", (e) => {\r\n if (json.properties.requiredActionButton) {\r\n stepCheck.classList.remove(\"hidden\");\r\n } else {\r\n this.stepCompleated(currentStep.contentKey, this.userId, this.GuideID);\r\n setStepAsCompleated(this.stepJson, json, this.guideContainer);\r\n }\r\n\r\n if (json.properties.hideActionLinkAfterStep) {\r\n actionLink.classList.remove(\"md:flex\");\r\n actionLink.classList.add(\"hidden\");\r\n }\r\n if (json.properties.infoTextAfterStep) {\r\n insertInfoTextAfterCompleation(actionLink, json.properties.infoTextAfterStep, \"afterend\");\r\n }\r\n });\r\n }\r\n\r\n if (stepCheck) {\r\n //let stepCheckbox be checkbox in stepCheck\r\n let stepCheckbox = stepCheck.querySelector(\"input\");\r\n stepCheckbox.addEventListener(\"change\", (e) => {\r\n if (stepCheckbox.checked) {\r\n this.stepCompleated(currentStep.contentKey, this.userId, this.GuideID);\r\n //set stepCheckBox to disabled\r\n stepCheckbox.disabled = true;\r\n setStepAsCompleated(this.stepJson, json, this.guideContainer);\r\n }\r\n });\r\n if (currentStep.isCompleted && json.properties.hideActionLinkAfterStep) {\r\n insertInfoTextAfterCompleation(stepCheck, json.properties.infoTextAfterStep, \"beforebegin\");\r\n }\r\n }\r\n }, 500);\r\n }\r\n\r\n stepCompleated(stepKey, userId, guideId) {\r\n var myHeaders = new Headers();\r\n myHeaders.append(\"Content-Type\", \"application/json\");\r\n\r\n var raw = JSON.stringify({\r\n IsCompleted: true,\r\n });\r\n\r\n var requestOptions = {\r\n method: \"POST\",\r\n headers: myHeaders,\r\n body: raw,\r\n redirect: \"follow\",\r\n };\r\n\r\n fetch(`/api/guides/${guideId}/steps/${stepKey}/update-step-for-user/${userId}`, requestOptions)\r\n .then((response) => response.text())\r\n .then((result) => {\r\n this.precentCompleated = JSON.parse(result).percentageDone;\r\n //find the item with data-progressbar and set width to this.precentCompleated\r\n let progressBar = this.guideContainer.querySelector(\"[data-progressbar]\");\r\n progressBar.style.width = `${this.precentCompleated}%`;\r\n //find the item with data-progresspercent and set innerHTML to this.precentCompleated + % and left position to this.precentCompleated\r\n let progressPercent = this.guideContainer.querySelector(\"[data-progresspercent]\");\r\n progressPercent.innerHTML = `${this.precentCompleated}%`;\r\n progressPercent.style.left = `${this.precentCompleated}%`;\r\n //find this item in this.stepJson\r\n let step = this.stepJson.filter((item) => item.contentKey === stepKey)[0];\r\n //call fetchChildren with nextStep.contentKey if nextStep.isReceipt === false\r\n if (!step.isReceipt) {\r\n this.fetchStartPage(step.nextStep, \"guidepage\");\r\n }\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n generateGuidePageContent(json) {\r\n //create a function which returns the correct markup based on the content type\r\n let contentType = json.content.contentType;\r\n let content = \"\";\r\n switch (contentType) {\r\n case \"richTextModule\":\r\n content = richTextModule(json.content);\r\n break;\r\n case \"infoBoxModule\":\r\n content = infoBoxModule(json.content);\r\n break;\r\n case \"accordionModule\":\r\n content = accordionModule(json.content);\r\n break;\r\n case \"imageModule\":\r\n content = imageModule(json.content);\r\n break;\r\n case \"quoteModule\":\r\n content = quoteModule(json.content);\r\n break;\r\n default:\r\n return \"\";\r\n }\r\n return content;\r\n }\r\n\r\n initContentElements() {\r\n let contentElements = this.guideContainer.querySelectorAll(\"[data-component]\");\r\n if (contentElements) {\r\n contentElements.forEach((item) => {\r\n switch (item.dataset.component) {\r\n case \"rich-text\":\r\n new RichText(item);\r\n break;\r\n case \"accordion\":\r\n new Accordion(item);\r\n default:\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","export function receiptQuiz(items, steps) {\r\n let allPreviousStepsCompleted = true;\r\n //find each step in this.stepJson that is not a receipt and check if it is completed\r\n steps.forEach((item) => {\r\n if (!item.isReceipt) {\r\n if (!item.isCompleted) {\r\n allPreviousStepsCompleted = false;\r\n }\r\n }\r\n });\r\n\r\n let answerlist = \"\";\r\n let receiptQuiz = items\r\n .map((item, index) => {\r\n return `\r\n
    \r\n
    \r\n
    ${item.content.properties.title}
    \r\n
    ${index + 1} / ${items.length}
    \r\n
    \r\n
      \r\n ${(answerlist = item.content.properties.answers.items\r\n .map((answer, answerIndex) => {\r\n return `\r\n
    • \r\n \r\n \r\n
    • \r\n `;\r\n })\r\n .join(\"\"))}\r\n
    \r\n
    \r\n

    Svaret er forkert, prøv igen

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n `;\r\n })\r\n .join(\"\");\r\n\r\n receiptQuiz = `
    \r\n
    \r\n ${receiptQuiz}\r\n
    \r\n
    `;\r\n\r\n return receiptQuiz;\r\n}\r\n","import { isDesktop } from \"../../services/service-utils\";\r\nexport function receiptQuizFunction(Quiz, json) {\r\n let quizQuestions = Quiz.querySelectorAll(\"input[type=radio]\");\r\n if (quizQuestions) {\r\n //add an eventlistener to each question if the user clicks on it and the answer is wrong then show the error message\r\n quizQuestions.forEach((question) => {\r\n question.addEventListener(\"click\", (e) => {\r\n if (e.target.value == \"false\") {\r\n e.target.parentElement.parentElement.parentElement.parentElement.querySelector(\"[data-false]\").classList.remove(\"invisible\");\r\n } else {\r\n e.target.parentElement.parentElement.parentElement.parentElement.querySelector(\"[data-false]\").classList.add(\"invisible\");\r\n //find the ancestor element with class quiz-slide\r\n let ancestor = e.target.closest(\".quiz-slide\");\r\n let quizInner = ancestor.parentElement;\r\n\r\n // if ancestor is not the last element in the quiz, translateX the guide-quiz-inner to the next question in quide-quiz-outer\r\n if (ancestor.nextElementSibling) {\r\n //if desktop\r\n if (ancestor.previousElementSibling && isDesktop()) {\r\n let slidePosition = ancestor.dataset.index === \"1\" ? ancestor.offsetLeft - 80 : ancestor.offsetLeft;\r\n quizInner.style.transform = `translateX(calc(-${slidePosition}px))`;\r\n }\r\n //if mobile\r\n if (!isDesktop()) {\r\n let slidePosition = ancestor.dataset.index === \"0\" ? ancestor.nextElementSibling.offsetLeft - 20 : ancestor.nextElementSibling.offsetLeft;\r\n quizInner.style.transform = `translateX(calc(-${slidePosition}px))`;\r\n }\r\n\r\n //remove the class slide-active from the current question and add it to the next question\r\n ancestor.classList.remove(\"slide-active\");\r\n ancestor.nextElementSibling.classList.add(\"slide-active\");\r\n }\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","export function checkForCompleated(json) {\r\n //find each item in json and check if it is compleated if all are compleated then return true else return false\r\n let checkForCompleated = true;\r\n json.forEach((item) => {\r\n if (!item.isCompleted) {\r\n checkForCompleated = false;\r\n }\r\n });\r\n return checkForCompleated;\r\n}\r\n","export default class guideProgress {\r\n constructor(element) {\r\n this.el = element\r\n this.getProgress = this.getProgress.bind(this)\r\n this.setProgress = this.setProgress.bind(this)\r\n this.input = this.el.querySelector('input')\r\n this.circle = this.el.querySelector('circle')\r\n this.showNumber = this.el.querySelector('.show-number')\r\n this.userId = this.el.dataset.userid\r\n this.init()\r\n }\r\n\r\n init() {\r\n let radius = this.circle.r.baseVal.value;\r\n let circumference = radius * 2 * Math.PI;\r\n this.circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n this.circle.style.strokeDashoffset = `${circumference}`;\r\n this.getProgress(circumference);\r\n }\r\n\r\n getProgress(circumference) {\r\n\r\n fetch(`/api/guides/user-status/${this.userId}`)\r\n .then(response => response.json())\r\n .then(data => {\r\n if (data.hasUnfinishedGuides) {\r\n this.el.classList.remove('hidden');\r\n this.setProgress(data.unfinishedGuides[data.unfinishedGuides.length - 1].percentageDone, circumference);\r\n } else {\r\n this.el.classList.add('hidden');\r\n }\r\n })\r\n .catch(error => console.log('error', error));\r\n }\r\n\r\n setProgress(percent, circumference) {\r\n percent === 100 ? this.el.classList.add('hidden') : this.el.classList.remove('hidden');\r\n const offset = circumference - percent / 100 * circumference;\r\n this.circle.style.strokeDashoffset = offset;\r\n this.showNumber.innerHTML = percent + \"%\"\r\n }\r\n}\r\n","export function validatePhoneNumber(phoneNumber) {\r\n const phoneRegex = /^((\\(?\\+45\\)?)?)(\\s?\\d{2}\\s?\\d{2}\\s?\\d{2}\\s?\\d{2})$/;\r\n return phoneRegex.test(phoneNumber);\r\n}\r\n\r\nexport function validateTextString(name, { minLength = 2, maxLength = 50 }) {\r\n const nameRegex = new RegExp(`^[a-zA-ZæøåÆØÅ ]{${minLength},${maxLength}}$`);\r\n return nameRegex.test(name);\r\n}\r\n\r\nexport function validateWhitespace(str) {\r\n const whiteSpaceRegex = /\\S/;\r\n return whiteSpaceRegex.test(str);\r\n}\r\n\r\nexport function removeExtraWhitespace(str) {\r\n // Replace multiple consecutive whitespace characters with a single space\r\n const normalizedText = str.replace(/\\s+/g, \" \");\r\n\r\n // Remove leading and trailing whitespace\r\n const trimmedText = normalizedText.trim();\r\n\r\n return trimmedText;\r\n}\r\n\r\nexport function removeWhitespace(str) {\r\n // Remove whitespace characters\r\n const normalizedText = str.replace(/\\s+/g, \"\");\r\n\r\n // Remove leading and trailing whitespace\r\n const trimmedText = normalizedText.trim();\r\n\r\n return trimmedText;\r\n}\r\n","import { validateTextString, validatePhoneNumber, validateWhitespace, removeExtraWhitespace, removeWhitespace } from \"../../services/service-forms.js\";\r\nimport { simulateDelayedResponse } from \"../../services/service-some-api.js\";\r\n\r\nexport default class CallMeUp {\r\n constructor(element) {\r\n this.el = element;\r\n this.form = this.el.querySelector(\"form\");\r\n this.submitButton = this.form.querySelector(\"[type='submit']\");\r\n this.iconButton = this.submitButton.querySelector(\"svg\");\r\n this.nameInput = this.form.querySelector(\"[name='name']\");\r\n this.phoneInput = this.form.querySelector(\"[name='phone-number']\");\r\n this.consent = this.form.querySelector(\"[name='consent']\");\r\n this.allInputs = this.form.querySelectorAll(\"input\");\r\n this.receipt = this.el.querySelector(\".receipt\") || null;\r\n this.description = this.el.querySelector(\".description\") || null;\r\n this.responseErrorEl = this.el.querySelector(\".response-error\");\r\n this.spinner = this.el.querySelector(\".spinner\") || null;\r\n this.maxLength = this.nameInput.getAttribute(\"max-length\");\r\n this.sendForm = this.sendForm.bind(this);\r\n this.displaySpinner = this.displaySpinner.bind(this);\r\n this.hideSpinner = this.hideSpinner.bind(this);\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.allInputs.forEach((input) => {\r\n input.addEventListener(\"input\", () => {\r\n if (this.validateName(this.nameInput.value) && validatePhoneNumber(removeWhitespace(this.phoneInput.value)) && this.consent.checked) {\r\n this.submitButton.disabled = false;\r\n this.iconButton.classList.add(\"group-hover:fill-white\");\r\n this.iconButton.classList.add(\"dot-arrow-animation\")\r\n this.submitButton.addEventListener(\"click\", this.sendForm);\r\n } else {\r\n this.submitButton.disabled = true;\r\n this.iconButton.classList.remove(\"group-hover:fill-white\");\r\n this.iconButton.classList.remove(\"dot-arrow-animation\")\r\n this.submitButton.removeEventListener(\"click\", this.sendForm);\r\n }\r\n });\r\n });\r\n\r\n this.nameInput.addEventListener(\"blur\", () => {\r\n if (!this.validateName(this.nameInput.value)) {\r\n this.nameInput.nextElementSibling.classList.remove(\"hidden\");\r\n }\r\n });\r\n this.nameInput.addEventListener(\"input\", () => {\r\n if (this.validateName(this.nameInput.value)) {\r\n this.nameInput.nextElementSibling.classList.add(\"hidden\");\r\n }\r\n });\r\n this.phoneInput.addEventListener(\"blur\", () => {\r\n if (!validatePhoneNumber(removeWhitespace(this.phoneInput.value))) {\r\n this.phoneInput.nextElementSibling.classList.remove(\"hidden\");\r\n }\r\n });\r\n this.phoneInput.addEventListener(\"input\", () => {\r\n if (validatePhoneNumber(removeWhitespace(this.phoneInput.value))) {\r\n this.phoneInput.nextElementSibling.classList.add(\"hidden\");\r\n }\r\n });\r\n }\r\n\r\n validateName(name) {\r\n if (!validateTextString(name, { maxLength: this.maxLength }) || !validateWhitespace(name)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n sendForm(e) {\r\n e.preventDefault();\r\n // Get form values\r\n const name = removeExtraWhitespace(this.nameInput.value);\r\n const phoneNumber = removeWhitespace(this.phoneInput.value);\r\n const consent = this.consent.checked;\r\n\r\n if (validatePhoneNumber(phoneNumber) && this.validateName(name) && consent) {\r\n\r\n this.displaySpinner();\r\n\r\n const url = \"\"; //TODO: Add url\r\n const data = {\r\n name: name,\r\n phoneNumber: phoneNumber,\r\n consent: consent,\r\n };\r\n const requestOptions = {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(data),\r\n };\r\n fetch(url, requestOptions) // To simulate a response change to -> simulateDelayedResponse({ message: 'test' }, 2000, true)\r\n .then((response) => {\r\n this.hideSpinner();\r\n this.form.reset();\r\n console.log(\"Form submitted\", response);\r\n if (this.receipt) {\r\n if (this.description) {\r\n this.description.classList.add(\"hidden\");\r\n }\r\n this.form.classList.add(\"hidden\");\r\n this.receipt.classList.remove(\"hidden\");\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(\"Request failed\", error);\r\n this.hideSpinner();\r\n this.responseErrorEl.classList.remove(\"hidden\");\r\n });\r\n }\r\n }\r\n\r\n displaySpinner() {\r\n if (this.spinner) {\r\n this.submitButton.style.visibility = \"hidden\";\r\n this.spinner.style.visibility = \"visible\";\r\n }\r\n }\r\n\r\n hideSpinner() {\r\n if (this.spinner) {\r\n this.submitButton.style.visibility = \"visible\";\r\n this.spinner.style.visibility = \"hidden\";\r\n }\r\n }\r\n}\r\n","export default class CandenoLogin {\r\n constructor(element) {\r\n this.el = element;\r\n this.buttontext = this.el.dataset.buttontext;\r\n this.getCandenoLogin = this.getCandenoLogin.bind(this);\r\n this.loginToCandeno = this.loginToCandeno.bind(this);\r\n this.buttontype = this.el.dataset.buttontype;\r\n this.bgcolor = this.el.dataset.bgcolor;\r\n this.svgcolor = this.el.dataset.svgcolor;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.getCandenoLogin();\r\n }\r\n\r\n getCandenoLogin() {\r\n const requestOptions = {\r\n method: \"GET\",\r\n redirect: \"follow\",\r\n };\r\n\r\n fetch(\"/api/memberdata/GetCandenoToken\", requestOptions)\r\n .then((response) => response.text())\r\n .then((result) => this.loginToCandeno(result))\r\n .catch((error) => console.error(error));\r\n }\r\n\r\n loginToCandeno(result) {\r\n let resultObject = JSON.parse(result);\r\n let buttonstyle = this.buttontype === \"cta\" ? \"btn-primary\" : this.bgcolor ? this.bgcolor : \"bg-primary\";\r\n let svgstyle = this.svgcolor ? this.svgcolor : \"fill-white\";\r\n let topMargin = this.buttontype === \"arrowLink\" ? \"mt-8 mb-16\" : \"mt-0\";\r\n const formButton = `\r\n
    \r\n \r\n \r\n \r\n
    \r\n `;\r\n\r\n this.el.innerHTML = formButton;\r\n }\r\n}\r\n","import \"regenerator-runtime\";\r\nimport \"./index.css\";\r\nimport { EventBus, EventTypes } from \"./consts/const-event-types\";\r\n\r\n/*\r\nTo add new components, import them here and add them to the 'components'-array below.\r\nAdd an appropriate selectorName for use in DOM (fx:
    ):\r\n*/\r\nimport App from \"./components/app\";\r\nimport ExampleComponent from \"./components/example-component/example-component\";\r\nimport UserItem from \"./components/user-item/user-item\";\r\nimport MenuDropdown from \"./components/menu-dropdown/menu-dropdown\";\r\nimport MenuMain from \"./components/menu-dropdown/menu-main\";\r\nimport Accordion from \"./components/accordion/accordion\";\r\nimport MediaPlayer from \"./components/media-player/media-player\";\r\nimport Header from \"./components/header/header\";\r\nimport AnchorMenu from \"./components/anchor-menu/anchor-menu\";\r\nimport GlobalSearch from \"./components/search/global-search\";\r\nimport IframeTab from \"./components/iframe-tab/iframe-tab\";\r\nimport ServiceCode from \"./components/service-code/service-code\";\r\nimport RichText from \"./components/rich-text/rich-text\";\r\nimport MailchimpSignup from \"./components/mailchimp-signup/mailchimp-signup\";\r\nimport GoogleMap from \"./components/google-map/google-map\";\r\nimport Ical from \"./components/ical/ical\";\r\nimport GlobalAlert from \"./components/global-alert/global-alert\";\r\nimport PriceSaveCalculator from \"./components/pricesave-calculator/pricesave-calculator\";\r\nimport QuestionnaireModule from \"./components/questionnaire/questionnaire\";\r\nimport GuidePage from \"./components/guidePage/guidePage\";\r\nimport GuideProgress from \"./components/guide-reminder/guide-progress\";\r\nimport CallMeUp from \"./components/call-me-up/call-me-up\";\r\nimport CandenoLogin from \"./components/candeno-login/candeno-login\";\r\n\r\n//Import lazysizes as early as possible.\r\nimport lazySizes from \"lazysizes\";\r\nimport \"lazysizes/plugins/unveilhooks/ls.unveilhooks\";\r\nimport \"lazysizes/plugins/bgset/ls.bgset\";\r\nimport \"lazysizes/plugins/respimg/ls.respimg\";\r\nimport \"lazysizes/plugins/parent-fit/ls.parent-fit\";\r\n\r\n//Set lazysizes configuration.\r\nlazySizes.cfg.lazyClass = \"lazyload\";\r\nlazySizes.cfg.loadedClass = \"loaded\";\r\nlazySizes.cfg.customMedia = {\r\n \"--small\": \"(max-width: 640px)\",\r\n \"--medium\": \"(max-width: 1024px)\",\r\n \"--large\": \"(min-width:1440px)\",\r\n};\r\n\r\nconst components = [\r\n { Class: App, selectorName: \"app\" },\r\n { Class: ExampleComponent, selectorName: \"example-component\" },\r\n { Class: UserItem, selectorName: \"user-item\" },\r\n { Class: MenuDropdown, selectorName: \"menu-dropdown\" },\r\n { Class: MenuMain, selectorName: \"menu-main\" },\r\n { Class: Accordion, selectorName: \"accordion\" },\r\n { Class: MediaPlayer, selectorName: \"media-player\" },\r\n { Class: Header, selectorName: \"header\" },\r\n { Class: AnchorMenu, selectorName: \"anchor-menu\" },\r\n { Class: GlobalSearch, selectorName: \"global-search\" },\r\n { Class: IframeTab, selectorName: \"iframe-tab\" },\r\n { Class: ServiceCode, selectorName: \"service-code\" },\r\n { Class: RichText, selectorName: \"rich-text\" },\r\n { Class: MailchimpSignup, selectorName: \"mailchimp-signup\" },\r\n { Class: GoogleMap, selectorName: \"google-map\" },\r\n { Class: Ical, selectorName: \"ical\" },\r\n { Class: GlobalAlert, selectorName: \"global-alert\" },\r\n { Class: PriceSaveCalculator, selectorName: \"pricesave-calculator\" },\r\n { Class: QuestionnaireModule, selectorName: \"quesionnaire-module\" },\r\n { Class: GuidePage, selectorName: \"guidePage\" },\r\n { Class: GuideProgress, selectorName: \"guide-progress\" },\r\n { Class: CallMeUp, selectorName: \"call-me-up-form\" },\r\n { Class: CandenoLogin, selectorName: \"candeno-login\" },\r\n];\r\n\r\n/*\r\n * ComponentInstantiator traverses the DOM-tree and looks for [data-component='] attributes.\r\n */\r\nclass ComponentInstantiator {\r\n constructor() {\r\n this.createComponents();\r\n this.dispatchReady();\r\n return this;\r\n }\r\n\r\n createComponents() {\r\n this.componentsInstantiated = {};\r\n\r\n components.map((component) => {\r\n const nodes = [];\r\n // select all DOM-nodes with the data-component attribute:\r\n const nodeItems = [...document.querySelectorAll(\"[data-component='\" + component.selectorName + \"']\")];\r\n\r\n nodeItems.map((nodeItem) => {\r\n // instantiate component with nodeItem as param:\r\n nodes.push(new component.Class(nodeItem));\r\n });\r\n\r\n // add to componentsList object:\r\n if (nodes.length) this.componentsInstantiated[component.selectorName] = nodes;\r\n });\r\n }\r\n\r\n dispatchReady() {\r\n const event = new CustomEvent(EventTypes.ALL_COMPONENTS_READY);\r\n EventBus.dispatchEvent(event);\r\n }\r\n\r\n getComponents(selectorName) {\r\n return selectorName ? this.componentsInstantiated[selectorName] : this.componentsInstantiated;\r\n }\r\n}\r\n\r\n//SERVICEWORKER FOR PWA\r\n\r\nif (\"serviceWorker\" in navigator) {\r\n //console.log(\"get serviceworker\");\r\n window.addEventListener(\"load\", function () {\r\n navigator.serviceWorker\r\n .register(\"/serviceWorker.js\")\r\n .then((res) => {})\r\n .catch((err) => console.log(\"service worker not registered\", err));\r\n });\r\n}\r\n\r\n/* Make your App accessible via window.App */\r\nwindow.App = new ComponentInstantiator();\r\n\r\n/* Access components list */\r\n// console.log('components on this page', window.App.getComponents())\r\n","\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n for (var key in Emitter.prototype) {\r\n obj[key] = Emitter.prototype[key];\r\n }\r\n return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n .push(fn);\r\n return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n function on() {\r\n this.off(event, on);\r\n fn.apply(this, arguments);\r\n }\r\n\r\n on.fn = fn;\r\n this.on(event, on);\r\n return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n\r\n // all\r\n if (0 == arguments.length) {\r\n this._callbacks = {};\r\n return this;\r\n }\r\n\r\n // specific event\r\n var callbacks = this._callbacks['$' + event];\r\n if (!callbacks) return this;\r\n\r\n // remove all handlers\r\n if (1 == arguments.length) {\r\n delete this._callbacks['$' + event];\r\n return this;\r\n }\r\n\r\n // remove specific handler\r\n var cb;\r\n for (var i = 0; i < callbacks.length; i++) {\r\n cb = callbacks[i];\r\n if (cb === fn || cb.fn === fn) {\r\n callbacks.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n // Remove event specific arrays for event types that no\r\n // one is subscribed for to avoid memory leak.\r\n if (callbacks.length === 0) {\r\n delete this._callbacks['$' + event];\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n this._callbacks = this._callbacks || {};\r\n\r\n var args = new Array(arguments.length - 1)\r\n , callbacks = this._callbacks['$' + event];\r\n\r\n for (var i = 1; i < arguments.length; i++) {\r\n args[i - 1] = arguments[i];\r\n }\r\n\r\n if (callbacks) {\r\n callbacks = callbacks.slice(0);\r\n for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n callbacks[i].apply(this, args);\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n this._callbacks = this._callbacks || {};\r\n return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n return !! this.listeners(event).length;\r\n};\r\n","(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(typeof window != 'undefined' ?\n window : {}, \n/**\n * import(\"./types/global\")\n * @typedef { import(\"./types/lazysizes-config\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth = parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning = true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n","(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t'use strict';\n\tif(!window.addEventListener){return;}\n\n\tvar lazySizesCfg = lazySizes.cfg;\n\tvar regWhite = /\\s+/g;\n\tvar regSplitSet = /\\s*\\|\\s+|\\s+\\|\\s*/g;\n\tvar regSource = /^(.+?)(?:\\s+\\[\\s*(.+?)\\s*\\])(?:\\s+\\[\\s*(.+?)\\s*\\])?$/;\n\tvar regType = /^\\s*\\(*\\s*type\\s*:\\s*(.+?)\\s*\\)*\\s*$/;\n\tvar regBgUrlEscape = /\\(|\\)|'/;\n\tvar allowedBackgroundSize = {contain: 1, cover: 1};\n\tvar proxyWidth = function(elem){\n\t\tvar width = lazySizes.gW(elem, elem.parentNode);\n\n\t\tif(!elem._lazysizesWidth || width > elem._lazysizesWidth){\n\t\t\telem._lazysizesWidth = width;\n\t\t}\n\t\treturn elem._lazysizesWidth;\n\t};\n\tvar getBgSize = function(elem){\n\t\tvar bgSize;\n\n\t\tbgSize = (getComputedStyle(elem) || {getPropertyValue: function(){}}).getPropertyValue('background-size');\n\n\t\tif(!allowedBackgroundSize[bgSize] && allowedBackgroundSize[elem.style.backgroundSize]){\n\t\t\tbgSize = elem.style.backgroundSize;\n\t\t}\n\n\t\treturn bgSize;\n\t};\n\tvar setTypeOrMedia = function(source, match){\n\t\tif(match){\n\t\t\tvar typeMatch = match.match(regType);\n\t\t\tif(typeMatch && typeMatch[1]){\n\t\t\t\tsource.setAttribute('type', typeMatch[1]);\n\t\t\t} else {\n\t\t\t\tsource.setAttribute('media', lazySizesCfg.customMedia[match] || match);\n\t\t\t}\n\t\t}\n\t};\n\tvar createPicture = function(sets, elem, img){\n\t\tvar picture = document.createElement('picture');\n\t\tvar sizes = elem.getAttribute(lazySizesCfg.sizesAttr);\n\t\tvar ratio = elem.getAttribute('data-ratio');\n\t\tvar optimumx = elem.getAttribute('data-optimumx');\n\n\t\tif(elem._lazybgset && elem._lazybgset.parentNode == elem){\n\t\t\telem.removeChild(elem._lazybgset);\n\t\t}\n\n\t\tObject.defineProperty(img, '_lazybgset', {\n\t\t\tvalue: elem,\n\t\t\twritable: true\n\t\t});\n\t\tObject.defineProperty(elem, '_lazybgset', {\n\t\t\tvalue: picture,\n\t\t\twritable: true\n\t\t});\n\n\t\tsets = sets.replace(regWhite, ' ').split(regSplitSet);\n\n\t\tpicture.style.display = 'none';\n\t\timg.className = lazySizesCfg.lazyClass;\n\n\t\tif(sets.length == 1 && !sizes){\n\t\t\tsizes = 'auto';\n\t\t}\n\n\t\tsets.forEach(function(set){\n\t\t\tvar match;\n\t\t\tvar source = document.createElement('source');\n\n\t\t\tif(sizes && sizes != 'auto'){\n\t\t\t\tsource.setAttribute('sizes', sizes);\n\t\t\t}\n\n\t\t\tif((match = set.match(regSource))){\n\t\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, match[1]);\n\n\t\t\t\tsetTypeOrMedia(source, match[2]);\n\t\t\t\tsetTypeOrMedia(source, match[3]);\n\t\t\t} else {\n\t\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, set);\n\t\t\t}\n\n\t\t\tpicture.appendChild(source);\n\t\t});\n\n\t\tif(sizes){\n\t\t\timg.setAttribute(lazySizesCfg.sizesAttr, sizes);\n\t\t\telem.removeAttribute(lazySizesCfg.sizesAttr);\n\t\t\telem.removeAttribute('sizes');\n\t\t}\n\t\tif(optimumx){\n\t\t\timg.setAttribute('data-optimumx', optimumx);\n\t\t}\n\t\tif(ratio) {\n\t\t\timg.setAttribute('data-ratio', ratio);\n\t\t}\n\n\t\tpicture.appendChild(img);\n\n\t\telem.appendChild(picture);\n\t};\n\n\tvar proxyLoad = function(e){\n\t\tif(!e.target._lazybgset){return;}\n\n\t\tvar image = e.target;\n\t\tvar elem = image._lazybgset;\n\t\tvar bg = image.currentSrc || image.src;\n\n\n\t\tif(bg){\n\t\t\tvar useSrc = regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg;\n\t\t\tvar event = lazySizes.fire(elem, 'bgsetproxy', {\n\t\t\t\tsrc: bg,\n\t\t\t\tuseSrc: useSrc,\n\t\t\t\tfullSrc: null,\n\t\t\t});\n\n\t\t\tif(!event.defaultPrevented){\n\t\t\t\telem.style.backgroundImage = event.detail.fullSrc || 'url(' + event.detail.useSrc + ')';\n\t\t\t}\n\t\t}\n\n\t\tif(image._lazybgsetLoading){\n\t\t\tlazySizes.fire(elem, '_lazyloaded', {}, false, true);\n\t\t\tdelete image._lazybgsetLoading;\n\t\t}\n\t};\n\n\taddEventListener('lazybeforeunveil', function(e){\n\t\tvar set, image, elem;\n\n\t\tif(e.defaultPrevented || !(set = e.target.getAttribute('data-bgset'))){return;}\n\n\t\telem = e.target;\n\t\timage = document.createElement('img');\n\n\t\timage.alt = '';\n\n\t\timage._lazybgsetLoading = true;\n\t\te.detail.firesLoad = true;\n\n\t\tcreatePicture(set, elem, image);\n\n\t\tsetTimeout(function(){\n\t\t\tlazySizes.loader.unveil(image);\n\n\t\t\tlazySizes.rAF(function(){\n\t\t\t\tlazySizes.fire(image, '_lazyloaded', {}, true, true);\n\t\t\t\tif(image.complete) {\n\t\t\t\t\tproxyLoad({target: image});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t});\n\n\tdocument.addEventListener('load', proxyLoad, true);\n\n\twindow.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.detail.instance != lazySizes){return;}\n\t\tif(e.target._lazybgset && e.detail.dataAttr){\n\t\t\tvar elem = e.target._lazybgset;\n\t\t\tvar bgSize = getBgSize(elem);\n\n\t\t\tif(allowedBackgroundSize[bgSize]){\n\t\t\t\te.target._lazysizesParentFit = bgSize;\n\n\t\t\t\tlazySizes.rAF(function(){\n\t\t\t\t\te.target.setAttribute('data-parent-fit', bgSize);\n\t\t\t\t\tif(e.target._lazysizesParentFit){\n\t\t\t\t\t\tdelete e.target._lazysizesParentFit;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}, true);\n\n\tdocument.documentElement.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.defaultPrevented || !e.target._lazybgset || e.detail.instance != lazySizes){return;}\n\t\te.detail.width = proxyWidth(e.target._lazybgset);\n\t});\n}));\n","(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t'use strict';\n\n\tif(!window.addEventListener){return;}\n\n\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\tvar regCssFit = /parent-fit[\"']*\\s*:\\s*[\"']*(contain|cover|width)/;\n\tvar regCssObject = /parent-container[\"']*\\s*:\\s*[\"']*(.+?)(?=(\\s|$|,|'|\"|;))/;\n\tvar regPicture = /^picture$/i;\n\tvar cfg = lazySizes.cfg;\n\n\tvar getCSS = function (elem){\n\t\treturn (getComputedStyle(elem, null) || {});\n\t};\n\n\tvar parentFit = {\n\n\t\tgetParent: function(element, parentSel){\n\t\t\tvar parent = element;\n\t\t\tvar parentNode = element.parentNode;\n\n\t\t\tif((!parentSel || parentSel == 'prev') && parentNode && regPicture.test(parentNode.nodeName || '')){\n\t\t\t\tparentNode = parentNode.parentNode;\n\t\t\t}\n\n\t\t\tif(parentSel != 'self'){\n\t\t\t\tif(parentSel == 'prev'){\n\t\t\t\t\tparent = element.previousElementSibling;\n\t\t\t\t} else if(parentSel && (parentNode.closest || window.jQuery)){\n\t\t\t\t\tparent = (parentNode.closest ?\n\t\t\t\t\t\t\tparentNode.closest(parentSel) :\n\t\t\t\t\t\t\tjQuery(parentNode).closest(parentSel)[0]) ||\n\t\t\t\t\t\tparentNode\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tparent = parentNode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn parent;\n\t\t},\n\n\t\tgetFit: function(element){\n\t\t\tvar tmpMatch, parentObj;\n\t\t\tvar css = getCSS(element);\n\t\t\tvar content = css.content || css.fontFamily;\n\t\t\tvar obj = {\n\t\t\t\tfit: element._lazysizesParentFit || element.getAttribute('data-parent-fit')\n\t\t\t};\n\n\t\t\tif(!obj.fit && content && (tmpMatch = content.match(regCssFit))){\n\t\t\t\tobj.fit = tmpMatch[1];\n\t\t\t}\n\n\t\t\tif(obj.fit){\n\t\t\t\tparentObj = element._lazysizesParentContainer || element.getAttribute('data-parent-container');\n\n\t\t\t\tif(!parentObj && content && (tmpMatch = content.match(regCssObject))){\n\t\t\t\t\tparentObj = tmpMatch[1];\n\t\t\t\t}\n\n\t\t\t\tobj.parent = parentFit.getParent(element, parentObj);\n\n\n\t\t\t} else {\n\t\t\t\tobj.fit = css.objectFit;\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t},\n\n\t\tgetImageRatio: function(element){\n\t\t\tvar i, srcset, media, ratio, match, width, height;\n\t\t\tvar parent = element.parentNode;\n\t\t\tvar elements = parent && regPicture.test(parent.nodeName || '') ?\n\t\t\t\t\tparent.querySelectorAll('source, img') :\n\t\t\t\t\t[element]\n\t\t\t\t;\n\n\t\t\tfor(i = 0; i < elements.length; i++){\n\t\t\t\telement = elements[i];\n\t\t\t\tsrcset = element.getAttribute(cfg.srcsetAttr) || element.getAttribute('srcset') || element.getAttribute('data-pfsrcset') || element.getAttribute('data-risrcset') || '';\n\t\t\t\tmedia = element._lsMedia || element.getAttribute('media');\n\t\t\t\tmedia = cfg.customMedia[element.getAttribute('data-media') || media] || media;\n\n\t\t\t\tif(srcset && (!media || (window.matchMedia && matchMedia(media) || {}).matches )){\n\t\t\t\t\tratio = parseFloat(element.getAttribute('data-aspectratio'));\n\n\t\t\t\t\tif (!ratio) {\n\t\t\t\t\t\tmatch = srcset.match(regDescriptors);\n\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\t\t\t\twidth = match[1];\n\t\t\t\t\t\t\t\theight = match[3];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidth = match[3];\n\t\t\t\t\t\t\t\theight = match[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidth = element.getAttribute('width');\n\t\t\t\t\t\t\theight = element.getAttribute('height');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tratio = width / height;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ratio;\n\t\t},\n\n\t\tcalculateSize: function(element, width){\n\t\t\tvar displayRatio, height, imageRatio, retWidth;\n\t\t\tvar fitObj = this.getFit(element);\n\t\t\tvar fit = fitObj.fit;\n\t\t\tvar fitElem = fitObj.parent;\n\n\t\t\tif(fit != 'width' && ((fit != 'contain' && fit != 'cover') || !(imageRatio = this.getImageRatio(element)))){\n\t\t\t\treturn width;\n\t\t\t}\n\n\t\t\tif(fitElem){\n\t\t\t\twidth = fitElem.clientWidth;\n\t\t\t} else {\n\t\t\t\tfitElem = element;\n\t\t\t}\n\n\t\t\tretWidth = width;\n\n\t\t\tif(fit == 'width'){\n\t\t\t\tretWidth = width;\n\t\t\t} else {\n\t\t\t\theight = fitElem.clientHeight;\n\n\t\t\t\tif((displayRatio = width / height) && ((fit == 'cover' && displayRatio < imageRatio) || (fit == 'contain' && displayRatio > imageRatio))){\n\t\t\t\t\tretWidth = width * (imageRatio / displayRatio);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn retWidth;\n\t\t}\n\t};\n\n\tlazySizes.parentFit = parentFit;\n\n\tdocument.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.defaultPrevented || e.detail.instance != lazySizes){return;}\n\n\t\tvar element = e.target;\n\t\te.detail.width = parentFit.calculateSize(element, e.detail.width);\n\t});\n}));\n","(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar polyfill;\n\tvar lazySizesCfg = lazySizes.cfg;\n\tvar img = document.createElement('img');\n\tvar supportSrcset = ('sizes' in img) && ('srcset' in img);\n\tvar regHDesc = /\\s+\\d+h/g;\n\tvar fixEdgeHDescriptor = (function(){\n\t\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\t\tvar forEach = Array.prototype.forEach;\n\n\t\treturn function(){\n\t\t\tvar img = document.createElement('img');\n\t\t\tvar removeHDescriptors = function(source){\n\t\t\t\tvar ratio, match;\n\t\t\t\tvar srcset = source.getAttribute(lazySizesCfg.srcsetAttr);\n\t\t\t\tif(srcset){\n\t\t\t\t\tif((match = srcset.match(regDescriptors))){\n\t\t\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\t\t\tratio = match[1] / match[3];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tratio = match[3] / match[1];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(ratio){\n\t\t\t\t\t\t\tsource.setAttribute('data-aspectratio', ratio);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, srcset.replace(regHDesc, ''));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tvar handler = function(e){\n\t\t\t\tif(e.detail.instance != lazySizes){return;}\n\t\t\t\tvar picture = e.target.parentNode;\n\n\t\t\t\tif(picture && picture.nodeName == 'PICTURE'){\n\t\t\t\t\tforEach.call(picture.getElementsByTagName('source'), removeHDescriptors);\n\t\t\t\t}\n\t\t\t\tremoveHDescriptors(e.target);\n\t\t\t};\n\n\t\t\tvar test = function(){\n\t\t\t\tif(!!img.currentSrc){\n\t\t\t\t\tdocument.removeEventListener('lazybeforeunveil', handler);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.addEventListener('lazybeforeunveil', handler);\n\n\t\t\timg.onload = test;\n\t\t\timg.onerror = test;\n\n\t\t\timg.srcset = 'data:,a 1w 1h';\n\n\t\t\tif(img.complete){\n\t\t\t\ttest();\n\t\t\t}\n\t\t};\n\t})();\n\n\tif(!lazySizesCfg.supportsType){\n\t\tlazySizesCfg.supportsType = function(type/*, elem*/){\n\t\t\treturn !type;\n\t\t};\n\t}\n\n\tif (window.HTMLPictureElement && supportSrcset) {\n\t\tif(!lazySizes.hasHDescriptorFix && document.msElementsFromPoint){\n\t\t\tlazySizes.hasHDescriptorFix = true;\n\t\t\tfixEdgeHDescriptor();\n\t\t}\n\t\treturn;\n\t}\n\n\tif(window.picturefill || lazySizesCfg.pf){return;}\n\n\tlazySizesCfg.pf = function(options){\n\t\tvar i, len;\n\t\tif(window.picturefill){return;}\n\t\tfor(i = 0, len = options.elements.length; i < len; i++){\n\t\t\tpolyfill(options.elements[i]);\n\t\t}\n\t};\n\n\t// partial polyfill\n\tpolyfill = (function(){\n\t\tvar ascendingSort = function( a, b ) {\n\t\t\treturn a.w - b.w;\n\t\t};\n\t\tvar regPxLength = /^\\s*\\d+\\.*\\d*px\\s*$/;\n\t\tvar reduceCandidate = function (srces) {\n\t\t\tvar lowerCandidate, bonusFactor;\n\t\t\tvar len = srces.length;\n\t\t\tvar candidate = srces[len -1];\n\t\t\tvar i = 0;\n\n\t\t\tfor(i; i < len;i++){\n\t\t\t\tcandidate = srces[i];\n\t\t\t\tcandidate.d = candidate.w / srces.w;\n\n\t\t\t\tif(candidate.d >= srces.d){\n\t\t\t\t\tif(!candidate.cached && (lowerCandidate = srces[i - 1]) &&\n\t\t\t\t\t\tlowerCandidate.d > srces.d - (0.13 * Math.pow(srces.d, 2.2))){\n\n\t\t\t\t\t\tbonusFactor = Math.pow(lowerCandidate.d - 0.6, 1.6);\n\n\t\t\t\t\t\tif(lowerCandidate.cached) {\n\t\t\t\t\t\t\tlowerCandidate.d += 0.15 * bonusFactor;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(lowerCandidate.d + ((candidate.d - srces.d) * bonusFactor) > srces.d){\n\t\t\t\t\t\t\tcandidate = lowerCandidate;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn candidate;\n\t\t};\n\n\t\tvar parseWsrcset = (function(){\n\t\t\tvar candidates;\n\t\t\tvar regWCandidates = /(([^,\\s].[^\\s]+)\\s+(\\d+)w)/g;\n\t\t\tvar regMultiple = /\\s/;\n\t\t\tvar addCandidate = function(match, candidate, url, wDescriptor){\n\t\t\t\tcandidates.push({\n\t\t\t\t\tc: candidate,\n\t\t\t\t\tu: url,\n\t\t\t\t\tw: wDescriptor * 1\n\t\t\t\t});\n\t\t\t};\n\n\t\t\treturn function(input){\n\t\t\t\tcandidates = [];\n\t\t\t\tinput = input.trim();\n\t\t\t\tinput\n\t\t\t\t\t.replace(regHDesc, '')\n\t\t\t\t\t.replace(regWCandidates, addCandidate)\n\t\t\t\t;\n\n\t\t\t\tif(!candidates.length && input && !regMultiple.test(input)){\n\t\t\t\t\tcandidates.push({\n\t\t\t\t\t\tc: input,\n\t\t\t\t\t\tu: input,\n\t\t\t\t\t\tw: 99\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn candidates;\n\t\t\t};\n\t\t})();\n\n\t\tvar runMatchMedia = function(){\n\t\t\tif(runMatchMedia.init){return;}\n\n\t\t\trunMatchMedia.init = true;\n\t\t\taddEventListener('resize', (function(){\n\t\t\t\tvar timer;\n\t\t\t\tvar matchMediaElems = document.getElementsByClassName('lazymatchmedia');\n\t\t\t\tvar run = function(){\n\t\t\t\t\tvar i, len;\n\t\t\t\t\tfor(i = 0, len = matchMediaElems.length; i < len; i++){\n\t\t\t\t\t\tpolyfill(matchMediaElems[i]);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn function(){\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = setTimeout(run, 66);\n\t\t\t\t};\n\t\t\t})());\n\t\t};\n\n\t\tvar createSrcset = function(elem, isImage){\n\t\t\tvar parsedSet;\n\t\t\tvar srcSet = elem.getAttribute('srcset') || elem.getAttribute(lazySizesCfg.srcsetAttr);\n\n\t\t\tif(!srcSet && isImage){\n\t\t\t\tsrcSet = !elem._lazypolyfill ?\n\t\t\t\t\t(elem.getAttribute(lazySizesCfg.srcAttr) || elem.getAttribute('src')) :\n\t\t\t\t\telem._lazypolyfill._set\n\t\t\t\t;\n\t\t\t}\n\n\t\t\tif(!elem._lazypolyfill || elem._lazypolyfill._set != srcSet){\n\n\t\t\t\tparsedSet = parseWsrcset( srcSet || '' );\n\t\t\t\tif(isImage && elem.parentNode){\n\t\t\t\t\tparsedSet.isPicture = elem.parentNode.nodeName.toUpperCase() == 'PICTURE';\n\n\t\t\t\t\tif(parsedSet.isPicture){\n\t\t\t\t\t\tif(window.matchMedia){\n\t\t\t\t\t\t\tlazySizes.aC(elem, 'lazymatchmedia');\n\t\t\t\t\t\t\trunMatchMedia();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparsedSet._set = srcSet;\n\t\t\t\tObject.defineProperty(elem, '_lazypolyfill', {\n\t\t\t\t\tvalue: parsedSet,\n\t\t\t\t\twritable: true\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tvar getX = function(elem){\n\t\t\tvar dpr = window.devicePixelRatio || 1;\n\t\t\tvar optimum = lazySizes.getX && lazySizes.getX(elem);\n\t\t\treturn Math.min(optimum || dpr, 2.5, dpr);\n\t\t};\n\n\t\tvar matchesMedia = function(media){\n\t\t\tif(window.matchMedia){\n\t\t\t\tmatchesMedia = function(media){\n\t\t\t\t\treturn !media || (matchMedia(media) || {}).matches;\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn !media;\n\t\t\t}\n\n\t\t\treturn matchesMedia(media);\n\t\t};\n\n\t\tvar getCandidate = function(elem){\n\t\t\tvar sources, i, len, media, source, srces, src, width;\n\n\t\t\tsource = elem;\n\t\t\tcreateSrcset(source, true);\n\t\t\tsrces = source._lazypolyfill;\n\n\t\t\tif(srces.isPicture){\n\t\t\t\tfor(i = 0, sources = elem.parentNode.getElementsByTagName('source'), len = sources.length; i < len; i++){\n\t\t\t\t\tif( lazySizesCfg.supportsType(sources[i].getAttribute('type'), elem) && matchesMedia( sources[i].getAttribute('media')) ){\n\t\t\t\t\t\tsource = sources[i];\n\t\t\t\t\t\tcreateSrcset(source);\n\t\t\t\t\t\tsrces = source._lazypolyfill;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(srces.length > 1){\n\t\t\t\twidth = source.getAttribute('sizes') || '';\n\t\t\t\twidth = regPxLength.test(width) && parseInt(width, 10) || lazySizes.gW(elem, elem.parentNode);\n\t\t\t\tsrces.d = getX(elem);\n\t\t\t\tif(!srces.src || !srces.w || srces.w < width){\n\t\t\t\t\tsrces.w = width;\n\t\t\t\t\tsrc = reduceCandidate(srces.sort(ascendingSort));\n\t\t\t\t\tsrces.src = src;\n\t\t\t\t} else {\n\t\t\t\t\tsrc = srces.src;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsrc = srces[0];\n\t\t\t}\n\n\t\t\treturn src;\n\t\t};\n\n\t\tvar p = function(elem){\n\t\t\tif(supportSrcset && elem.parentNode && elem.parentNode.nodeName.toUpperCase() != 'PICTURE'){return;}\n\t\t\tvar candidate = getCandidate(elem);\n\n\t\t\tif(candidate && candidate.u && elem._lazypolyfill.cur != candidate.u){\n\t\t\t\telem._lazypolyfill.cur = candidate.u;\n\t\t\t\tcandidate.cached = true;\n\t\t\t\telem.setAttribute(lazySizesCfg.srcAttr, candidate.u);\n\t\t\t\telem.setAttribute('src', candidate.u);\n\t\t\t}\n\t\t};\n\n\t\tp.parse = parseWsrcset;\n\n\t\treturn p;\n\t})();\n\n\tif(lazySizesCfg.loadedClass && lazySizesCfg.loadingClass){\n\t\t(function(){\n\t\t\tvar sels = [];\n\t\t\t['img[sizes$=\"px\"][srcset].', 'picture > img:not([srcset]).'].forEach(function(sel){\n\t\t\t\tsels.push(sel + lazySizesCfg.loadedClass);\n\t\t\t\tsels.push(sel + lazySizesCfg.loadingClass);\n\t\t\t});\n\t\t\tlazySizesCfg.pf({\n\t\t\t\telements: document.querySelectorAll(sels.join(', '))\n\t\t\t});\n\t\t})();\n\n\t}\n}));\n","/*\nThis plugin extends lazySizes to lazyLoad:\nbackground images, videos/posters and scripts\n\nBackground-Image:\nFor background images, use data-bg attribute:\n
    \n\n Video:\n For video/audio use data-poster and preload=\"none\":\n \n\n For video that plays automatically if in view:\n \n\n\n Scripts:\n For scripts use data-script:\n
    \n\n\n Script modules using require:\n For modules using require use data-require:\n
    \n*/\n\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar bgLoad, regBgUrlEscape;\n\tvar uniqueUrls = {};\n\n\tif(document.addEventListener){\n\t\tregBgUrlEscape = /\\(|\\)|\\s|'/;\n\n\t\tbgLoad = function (url, cb){\n\t\t\tvar img = document.createElement('img');\n\t\t\timg.onload = function(){\n\t\t\t\timg.onload = null;\n\t\t\t\timg.onerror = null;\n\t\t\t\timg = null;\n\t\t\t\tcb();\n\t\t\t};\n\t\t\timg.onerror = img.onload;\n\n\t\t\timg.src = url;\n\n\t\t\tif(img && img.complete && img.onload){\n\t\t\t\timg.onload();\n\t\t\t}\n\t\t};\n\n\t\taddEventListener('lazybeforeunveil', function(e){\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\t\tvar tmp, load, bg, poster;\n\t\t\tif(!e.defaultPrevented) {\n\n\t\t\t\tvar target = e.target;\n\n\t\t\t\tif(target.preload == 'none'){\n\t\t\t\t\ttarget.preload = target.getAttribute('data-preload') || 'auto';\n\t\t\t\t}\n\n\t\t\t\tif (target.getAttribute('data-autoplay') != null) {\n\t\t\t\t\tif (target.getAttribute('data-expand') && !target.autoplay) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttarget.play();\n\t\t\t\t\t\t} catch (er) {}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\ttarget.setAttribute('data-expand', '-10');\n\t\t\t\t\t\t\tlazySizes.aC(target, lazySizes.cfg.lazyClass);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttmp = target.getAttribute('data-link');\n\t\t\t\tif(tmp){\n\t\t\t\t\taddStyleScript(tmp, true);\n\t\t\t\t}\n\n\t\t\t\t// handle data-script\n\t\t\t\ttmp = target.getAttribute('data-script');\n\t\t\t\tif(tmp){\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\t\t\t\t\taddStyleScript(tmp, null, load);\n\t\t\t\t}\n\n\t\t\t\t// handle data-require\n\t\t\t\ttmp = target.getAttribute('data-require');\n\t\t\t\tif(tmp){\n\t\t\t\t\tif(lazySizes.cfg.requireJs){\n\t\t\t\t\t\tlazySizes.cfg.requireJs([tmp]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddStyleScript(tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// handle data-bg\n\t\t\t\tbg = target.getAttribute('data-bg');\n\t\t\t\tif (bg) {\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\ttarget.style.backgroundImage = 'url(' + (regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg ) + ')';\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\n\t\t\t\t\tbgLoad(bg, load);\n\t\t\t\t}\n\n\t\t\t\t// handle data-poster\n\t\t\t\tposter = target.getAttribute('data-poster');\n\t\t\t\tif(poster){\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\ttarget.poster = poster;\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\n\t\t\t\t\tbgLoad(poster, load);\n\n\t\t\t\t}\n\t\t\t}\n\t\t}, false);\n\n\t}\n\n\tfunction addStyleScript(src, style, cb){\n\t\tif(uniqueUrls[src]){\n\t\t\treturn;\n\t\t}\n\t\tvar elem = document.createElement(style ? 'link' : 'script');\n\t\tvar insertElem = document.getElementsByTagName('script')[0];\n\n\t\tif(style){\n\t\t\telem.rel = 'stylesheet';\n\t\t\telem.href = src;\n\t\t} else {\n\t\t\telem.onload = function(){\n\t\t\t\telem.onerror = null;\n\t\t\t\telem.onload = null;\n\t\t\t\tcb();\n\t\t\t};\n\t\t\telem.onerror = elem.onload;\n\n\t\t\telem.src = src;\n\t\t}\n\t\tuniqueUrls[src] = true;\n\t\tuniqueUrls[elem.src || elem.href] = true;\n\t\tinsertElem.parentNode.insertBefore(elem, insertElem);\n\t}\n}));\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (Array.isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return Object.keys(obj).map(function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (Array.isArray(obj[k])) {\n return obj[k].map(function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).filter(Boolean).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","function Agent() {\n this._defaults = [];\n}\n\n[\"use\", \"on\", \"once\", \"set\", \"query\", \"type\", \"accept\", \"auth\", \"withCredentials\", \"sortQuery\", \"retry\", \"ok\", \"redirects\",\n \"timeout\", \"buffer\", \"serialize\", \"parse\", \"ca\", \"key\", \"pfx\", \"cert\"].forEach(function(fn) {\n /** Default setting for all requests from this agent */\n Agent.prototype[fn] = function(/*varargs*/) {\n this._defaults.push({fn:fn, arguments:arguments});\n return this;\n }\n});\n\nAgent.prototype._setDefaults = function(req) {\n this._defaults.forEach(function(def) {\n req[def.fn].apply(req, def.arguments);\n });\n};\n\nmodule.exports = Agent;\n","/**\n * Root reference for iframes.\n */\n\nvar root;\nif (typeof window !== 'undefined') { // Browser window\n root = window;\n} else if (typeof self !== 'undefined') { // Web Worker\n root = self;\n} else { // Other environments\n console.warn(\"Using browser-only version of superagent in non-browser environment\");\n root = this;\n}\n\nvar Emitter = require('component-emitter');\nvar RequestBase = require('./request-base');\nvar isObject = require('./is-object');\nvar ResponseBase = require('./response-base');\nvar Agent = require('./agent-base');\n\n/**\n * Noop.\n */\n\nfunction noop(){};\n\n/**\n * Expose `request`.\n */\n\nvar request = exports = module.exports = function(method, url) {\n // callback\n if ('function' == typeof url) {\n return new exports.Request('GET', method).end(url);\n }\n\n // url first\n if (1 == arguments.length) {\n return new exports.Request('GET', method);\n }\n\n return new exports.Request(method, url);\n}\n\nexports.Request = Request;\n\n/**\n * Determine XHR.\n */\n\nrequest.getXHR = function () {\n if (root.XMLHttpRequest\n && (!root.location || 'file:' != root.location.protocol\n || !root.ActiveXObject)) {\n return new XMLHttpRequest;\n } else {\n try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}\n }\n throw Error(\"Browser-only version of superagent could not find XHR\");\n};\n\n/**\n * Removes leading and trailing whitespace, added to support IE.\n *\n * @param {String} s\n * @return {String}\n * @api private\n */\n\nvar trim = ''.trim\n ? function(s) { return s.trim(); }\n : function(s) { return s.replace(/(^\\s*|\\s*$)/g, ''); };\n\n/**\n * Serialize the given `obj`.\n *\n * @param {Object} obj\n * @return {String}\n * @api private\n */\n\nfunction serialize(obj) {\n if (!isObject(obj)) return obj;\n var pairs = [];\n for (var key in obj) {\n pushEncodedKeyValuePair(pairs, key, obj[key]);\n }\n return pairs.join('&');\n}\n\n/**\n * Helps 'serialize' with serializing arrays.\n * Mutates the pairs array.\n *\n * @param {Array} pairs\n * @param {String} key\n * @param {Mixed} val\n */\n\nfunction pushEncodedKeyValuePair(pairs, key, val) {\n if (val != null) {\n if (Array.isArray(val)) {\n val.forEach(function(v) {\n pushEncodedKeyValuePair(pairs, key, v);\n });\n } else if (isObject(val)) {\n for(var subkey in val) {\n pushEncodedKeyValuePair(pairs, key + '[' + subkey + ']', val[subkey]);\n }\n } else {\n pairs.push(encodeURIComponent(key)\n + '=' + encodeURIComponent(val));\n }\n } else if (val === null) {\n pairs.push(encodeURIComponent(key));\n }\n}\n\n/**\n * Expose serialization method.\n */\n\nrequest.serializeObject = serialize;\n\n/**\n * Parse the given x-www-form-urlencoded `str`.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseString(str) {\n var obj = {};\n var pairs = str.split('&');\n var pair;\n var pos;\n\n for (var i = 0, len = pairs.length; i < len; ++i) {\n pair = pairs[i];\n pos = pair.indexOf('=');\n if (pos == -1) {\n obj[decodeURIComponent(pair)] = '';\n } else {\n obj[decodeURIComponent(pair.slice(0, pos))] =\n decodeURIComponent(pair.slice(pos + 1));\n }\n }\n\n return obj;\n}\n\n/**\n * Expose parser.\n */\n\nrequest.parseString = parseString;\n\n/**\n * Default MIME type map.\n *\n * superagent.types.xml = 'application/xml';\n *\n */\n\nrequest.types = {\n html: 'text/html',\n json: 'application/json',\n xml: 'text/xml',\n urlencoded: 'application/x-www-form-urlencoded',\n 'form': 'application/x-www-form-urlencoded',\n 'form-data': 'application/x-www-form-urlencoded'\n};\n\n/**\n * Default serialization map.\n *\n * superagent.serialize['application/xml'] = function(obj){\n * return 'generated xml here';\n * };\n *\n */\n\nrequest.serialize = {\n 'application/x-www-form-urlencoded': serialize,\n 'application/json': JSON.stringify,\n};\n\n/**\n * Default parsers.\n *\n * superagent.parse['application/xml'] = function(str){\n * return { object parsed from str };\n * };\n *\n */\n\nrequest.parse = {\n 'application/x-www-form-urlencoded': parseString,\n 'application/json': JSON.parse,\n};\n\n/**\n * Parse the given header `str` into\n * an object containing the mapped fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseHeader(str) {\n var lines = str.split(/\\r?\\n/);\n var fields = {};\n var index;\n var line;\n var field;\n var val;\n\n for (var i = 0, len = lines.length; i < len; ++i) {\n line = lines[i];\n index = line.indexOf(':');\n if (index === -1) { // could be empty line, just skip it\n continue;\n }\n field = line.slice(0, index).toLowerCase();\n val = trim(line.slice(index + 1));\n fields[field] = val;\n }\n\n return fields;\n}\n\n/**\n * Check if `mime` is json or has +json structured syntax suffix.\n *\n * @param {String} mime\n * @return {Boolean}\n * @api private\n */\n\nfunction isJSON(mime) {\n return /[\\/+]json\\b/.test(mime);\n}\n\n/**\n * Initialize a new `Response` with the given `xhr`.\n *\n * - set flags (.ok, .error, etc)\n * - parse header\n *\n * Examples:\n *\n * Aliasing `superagent` as `request` is nice:\n *\n * request = superagent;\n *\n * We can use the promise-like API, or pass callbacks:\n *\n * request.get('/').end(function(res){});\n * request.get('/', function(res){});\n *\n * Sending data can be chained:\n *\n * request\n * .post('/user')\n * .send({ name: 'tj' })\n * .end(function(res){});\n *\n * Or passed to `.send()`:\n *\n * request\n * .post('/user')\n * .send({ name: 'tj' }, function(res){});\n *\n * Or passed to `.post()`:\n *\n * request\n * .post('/user', { name: 'tj' })\n * .end(function(res){});\n *\n * Or further reduced to a single call for simple cases:\n *\n * request\n * .post('/user', { name: 'tj' }, function(res){});\n *\n * @param {XMLHTTPRequest} xhr\n * @param {Object} options\n * @api private\n */\n\nfunction Response(req) {\n this.req = req;\n this.xhr = this.req.xhr;\n // responseText is accessible only if responseType is '' or 'text' and on older browsers\n this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')\n ? this.xhr.responseText\n : null;\n this.statusText = this.req.xhr.statusText;\n var status = this.xhr.status;\n // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n if (status === 1223) {\n status = 204;\n }\n this._setStatusProperties(status);\n this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());\n // getAllResponseHeaders sometimes falsely returns \"\" for CORS requests, but\n // getResponseHeader still works. so we get content-type even if getting\n // other headers fails.\n this.header['content-type'] = this.xhr.getResponseHeader('content-type');\n this._setHeaderProperties(this.header);\n\n if (null === this.text && req._responseType) {\n this.body = this.xhr.response;\n } else {\n this.body = this.req.method != 'HEAD'\n ? this._parseBody(this.text ? this.text : this.xhr.response)\n : null;\n }\n}\n\nResponseBase(Response.prototype);\n\n/**\n * Parse the given body `str`.\n *\n * Used for auto-parsing of bodies. Parsers\n * are defined on the `superagent.parse` object.\n *\n * @param {String} str\n * @return {Mixed}\n * @api private\n */\n\nResponse.prototype._parseBody = function(str) {\n var parse = request.parse[this.type];\n if (this.req._parser) {\n return this.req._parser(this, str);\n }\n if (!parse && isJSON(this.type)) {\n parse = request.parse['application/json'];\n }\n return parse && str && (str.length || str instanceof Object)\n ? parse(str)\n : null;\n};\n\n/**\n * Return an `Error` representative of this response.\n *\n * @return {Error}\n * @api public\n */\n\nResponse.prototype.toError = function(){\n var req = this.req;\n var method = req.method;\n var url = req.url;\n\n var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';\n var err = new Error(msg);\n err.status = this.status;\n err.method = method;\n err.url = url;\n\n return err;\n};\n\n/**\n * Expose `Response`.\n */\n\nrequest.Response = Response;\n\n/**\n * Initialize a new `Request` with the given `method` and `url`.\n *\n * @param {String} method\n * @param {String} url\n * @api public\n */\n\nfunction Request(method, url) {\n var self = this;\n this._query = this._query || [];\n this.method = method;\n this.url = url;\n this.header = {}; // preserves header name case\n this._header = {}; // coerces header names to lowercase\n this.on('end', function(){\n var err = null;\n var res = null;\n\n try {\n res = new Response(self);\n } catch(e) {\n err = new Error('Parser is unable to parse the response');\n err.parse = true;\n err.original = e;\n // issue #675: return the raw response if the response parsing fails\n if (self.xhr) {\n // ie9 doesn't have 'response' property\n err.rawResponse = typeof self.xhr.responseType == 'undefined' ? self.xhr.responseText : self.xhr.response;\n // issue #876: return the http status code if the response parsing fails\n err.status = self.xhr.status ? self.xhr.status : null;\n err.statusCode = err.status; // backwards-compat only\n } else {\n err.rawResponse = null;\n err.status = null;\n }\n\n return self.callback(err);\n }\n\n self.emit('response', res);\n\n var new_err;\n try {\n if (!self._isResponseOK(res)) {\n new_err = new Error(res.statusText || 'Unsuccessful HTTP response');\n }\n } catch(custom_err) {\n new_err = custom_err; // ok() callback can throw\n }\n\n // #1000 don't catch errors from the callback to avoid double calling it\n if (new_err) {\n new_err.original = err;\n new_err.response = res;\n new_err.status = res.status;\n self.callback(new_err, res);\n } else {\n self.callback(null, res);\n }\n });\n}\n\n/**\n * Mixin `Emitter` and `RequestBase`.\n */\n\nEmitter(Request.prototype);\nRequestBase(Request.prototype);\n\n/**\n * Set Content-Type to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n * superagent.types.xml = 'application/xml';\n *\n * request.post('/')\n * .type('xml')\n * .send(xmlstring)\n * .end(callback);\n *\n * request.post('/')\n * .type('application/xml')\n * .send(xmlstring)\n * .end(callback);\n *\n * @param {String} type\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.type = function(type){\n this.set('Content-Type', request.types[type] || type);\n return this;\n};\n\n/**\n * Set Accept to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n * superagent.types.json = 'application/json';\n *\n * request.get('/agent')\n * .accept('json')\n * .end(callback);\n *\n * request.get('/agent')\n * .accept('application/json')\n * .end(callback);\n *\n * @param {String} accept\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.accept = function(type){\n this.set('Accept', request.types[type] || type);\n return this;\n};\n\n/**\n * Set Authorization field value with `user` and `pass`.\n *\n * @param {String} user\n * @param {String} [pass] optional in case of using 'bearer' as type\n * @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic')\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.auth = function(user, pass, options){\n if (1 === arguments.length) pass = '';\n if (typeof pass === 'object' && pass !== null) { // pass is optional and can be replaced with options\n options = pass;\n pass = '';\n }\n if (!options) {\n options = {\n type: 'function' === typeof btoa ? 'basic' : 'auto',\n };\n }\n\n var encoder = function(string) {\n if ('function' === typeof btoa) {\n return btoa(string);\n }\n throw new Error('Cannot use basic auth, btoa is not a function');\n };\n\n return this._auth(user, pass, options, encoder);\n};\n\n/**\n * Add query-string `val`.\n *\n * Examples:\n *\n * request.get('/shoes')\n * .query('size=10')\n * .query({ color: 'blue' })\n *\n * @param {Object|String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.query = function(val){\n if ('string' != typeof val) val = serialize(val);\n if (val) this._query.push(val);\n return this;\n};\n\n/**\n * Queue the given `file` as an attachment to the specified `field`,\n * with optional `options` (or filename).\n *\n * ``` js\n * request.post('/upload')\n * .attach('content', new Blob(['hey!'], { type: \"text/html\"}))\n * .end(callback);\n * ```\n *\n * @param {String} field\n * @param {Blob|File} file\n * @param {String|Object} options\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.attach = function(field, file, options){\n if (file) {\n if (this._data) {\n throw Error(\"superagent can't mix .send() and .attach()\");\n }\n\n this._getFormData().append(field, file, options || file.name);\n }\n return this;\n};\n\nRequest.prototype._getFormData = function(){\n if (!this._formData) {\n this._formData = new root.FormData();\n }\n return this._formData;\n};\n\n/**\n * Invoke the callback with `err` and `res`\n * and handle arity check.\n *\n * @param {Error} err\n * @param {Response} res\n * @api private\n */\n\nRequest.prototype.callback = function(err, res){\n if (this._shouldRetry(err, res)) {\n return this._retry();\n }\n\n var fn = this._callback;\n this.clearTimeout();\n\n if (err) {\n if (this._maxRetries) err.retries = this._retries - 1;\n this.emit('error', err);\n }\n\n fn(err, res);\n};\n\n/**\n * Invoke callback with x-domain error.\n *\n * @api private\n */\n\nRequest.prototype.crossDomainError = function(){\n var err = new Error('Request has been terminated\\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');\n err.crossDomain = true;\n\n err.status = this.status;\n err.method = this.method;\n err.url = this.url;\n\n this.callback(err);\n};\n\n// This only warns, because the request is still likely to work\nRequest.prototype.buffer = Request.prototype.ca = Request.prototype.agent = function(){\n console.warn(\"This is not supported in browser version of superagent\");\n return this;\n};\n\n// This throws, because it can't send/receive data as expected\nRequest.prototype.pipe = Request.prototype.write = function(){\n throw Error(\"Streaming is not supported in browser version of superagent\");\n};\n\n/**\n * Check if `obj` is a host object,\n * we don't want to serialize these :)\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\nRequest.prototype._isHost = function _isHost(obj) {\n // Native objects stringify to [object File], [object Blob], [object FormData], etc.\n return obj && 'object' === typeof obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]';\n}\n\n/**\n * Initiate request, invoking callback `fn(res)`\n * with an instanceof `Response`.\n *\n * @param {Function} fn\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.end = function(fn){\n if (this._endCalled) {\n console.warn(\"Warning: .end() was called twice. This is not supported in superagent\");\n }\n this._endCalled = true;\n\n // store callback\n this._callback = fn || noop;\n\n // querystring\n this._finalizeQueryString();\n\n return this._end();\n};\n\nRequest.prototype._end = function() {\n var self = this;\n var xhr = (this.xhr = request.getXHR());\n var data = this._formData || this._data;\n\n this._setTimeouts();\n\n // state change\n xhr.onreadystatechange = function(){\n var readyState = xhr.readyState;\n if (readyState >= 2 && self._responseTimeoutTimer) {\n clearTimeout(self._responseTimeoutTimer);\n }\n if (4 != readyState) {\n return;\n }\n\n // In IE9, reads to any property (e.g. status) off of an aborted XHR will\n // result in the error \"Could not complete the operation due to error c00c023f\"\n var status;\n try { status = xhr.status } catch(e) { status = 0; }\n\n if (!status) {\n if (self.timedout || self._aborted) return;\n return self.crossDomainError();\n }\n self.emit('end');\n };\n\n // progress\n var handleProgress = function(direction, e) {\n if (e.total > 0) {\n e.percent = e.loaded / e.total * 100;\n }\n e.direction = direction;\n self.emit('progress', e);\n };\n if (this.hasListeners('progress')) {\n try {\n xhr.onprogress = handleProgress.bind(null, 'download');\n if (xhr.upload) {\n xhr.upload.onprogress = handleProgress.bind(null, 'upload');\n }\n } catch(e) {\n // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.\n // Reported here:\n // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context\n }\n }\n\n // initiate request\n try {\n if (this.username && this.password) {\n xhr.open(this.method, this.url, true, this.username, this.password);\n } else {\n xhr.open(this.method, this.url, true);\n }\n } catch (err) {\n // see #1149\n return this.callback(err);\n }\n\n // CORS\n if (this._withCredentials) xhr.withCredentials = true;\n\n // body\n if (!this._formData && 'GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !this._isHost(data)) {\n // serialize stuff\n var contentType = this._header['content-type'];\n var serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];\n if (!serialize && isJSON(contentType)) {\n serialize = request.serialize['application/json'];\n }\n if (serialize) data = serialize(data);\n }\n\n // set header fields\n for (var field in this.header) {\n if (null == this.header[field]) continue;\n\n if (this.header.hasOwnProperty(field))\n xhr.setRequestHeader(field, this.header[field]);\n }\n\n if (this._responseType) {\n xhr.responseType = this._responseType;\n }\n\n // send stuff\n this.emit('request', this);\n\n // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)\n // We need null here if data is undefined\n xhr.send(typeof data !== 'undefined' ? data : null);\n return this;\n};\n\nrequest.agent = function() {\n return new Agent();\n};\n\n[\"GET\", \"POST\", \"OPTIONS\", \"PATCH\", \"PUT\", \"DELETE\"].forEach(function(method) {\n Agent.prototype[method.toLowerCase()] = function(url, fn) {\n var req = new request.Request(method, url);\n this._setDefaults(req);\n if (fn) {\n req.end(fn);\n }\n return req;\n };\n});\n\nAgent.prototype.del = Agent.prototype['delete'];\n\n/**\n * GET `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.get = function(url, data, fn) {\n var req = request('GET', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.query(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * HEAD `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.head = function(url, data, fn) {\n var req = request('HEAD', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.query(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * OPTIONS query to `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.options = function(url, data, fn) {\n var req = request('OPTIONS', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * DELETE `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nfunction del(url, data, fn) {\n var req = request('DELETE', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n}\n\nrequest['del'] = del;\nrequest['delete'] = del;\n\n/**\n * PATCH `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.patch = function(url, data, fn) {\n var req = request('PATCH', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * POST `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.post = function(url, data, fn) {\n var req = request('POST', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * PUT `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.put = function(url, data, fn) {\n var req = request('PUT', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n","'use strict';\n\n/**\n * Check if `obj` is an object.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(obj) {\n return null !== obj && 'object' === typeof obj;\n}\n\nmodule.exports = isObject;\n","'use strict';\n\n/**\n * Module of mixed-in functions shared between node and client code\n */\nvar isObject = require('./is-object');\n\n/**\n * Expose `RequestBase`.\n */\n\nmodule.exports = RequestBase;\n\n/**\n * Initialize a new `RequestBase`.\n *\n * @api public\n */\n\nfunction RequestBase(obj) {\n if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the prototype properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in RequestBase.prototype) {\n obj[key] = RequestBase.prototype[key];\n }\n return obj;\n}\n\n/**\n * Clear previous timeout.\n *\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.clearTimeout = function _clearTimeout(){\n clearTimeout(this._timer);\n clearTimeout(this._responseTimeoutTimer);\n delete this._timer;\n delete this._responseTimeoutTimer;\n return this;\n};\n\n/**\n * Override default response body parser\n *\n * This function will be called to convert incoming data into request.body\n *\n * @param {Function}\n * @api public\n */\n\nRequestBase.prototype.parse = function parse(fn){\n this._parser = fn;\n return this;\n};\n\n/**\n * Set format of binary response body.\n * In browser valid formats are 'blob' and 'arraybuffer',\n * which return Blob and ArrayBuffer, respectively.\n *\n * In Node all values result in Buffer.\n *\n * Examples:\n *\n * req.get('/')\n * .responseType('blob')\n * .end(callback);\n *\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.responseType = function(val){\n this._responseType = val;\n return this;\n};\n\n/**\n * Override default request body serializer\n *\n * This function will be called to convert data set via .send or .attach into payload to send\n *\n * @param {Function}\n * @api public\n */\n\nRequestBase.prototype.serialize = function serialize(fn){\n this._serializer = fn;\n return this;\n};\n\n/**\n * Set timeouts.\n *\n * - response timeout is time between sending request and receiving the first byte of the response. Includes DNS and connection time.\n * - deadline is the time from start of the request to receiving response body in full. If the deadline is too short large files may not load at all on slow connections.\n *\n * Value of 0 or false means no timeout.\n *\n * @param {Number|Object} ms or {response, deadline}\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.timeout = function timeout(options){\n if (!options || 'object' !== typeof options) {\n this._timeout = options;\n this._responseTimeout = 0;\n return this;\n }\n\n for(var option in options) {\n switch(option) {\n case 'deadline':\n this._timeout = options.deadline;\n break;\n case 'response':\n this._responseTimeout = options.response;\n break;\n default:\n console.warn(\"Unknown timeout option\", option);\n }\n }\n return this;\n};\n\n/**\n * Set number of retry attempts on error.\n *\n * Failed requests will be retried 'count' times if timeout or err.code >= 500.\n *\n * @param {Number} count\n * @param {Function} [fn]\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.retry = function retry(count, fn){\n // Default to 1 if no count passed or true\n if (arguments.length === 0 || count === true) count = 1;\n if (count <= 0) count = 0;\n this._maxRetries = count;\n this._retries = 0;\n this._retryCallback = fn;\n return this;\n};\n\nvar ERROR_CODES = [\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'EADDRINFO',\n 'ESOCKETTIMEDOUT'\n];\n\n/**\n * Determine if a request should be retried.\n * (Borrowed from segmentio/superagent-retry)\n *\n * @param {Error} err\n * @param {Response} [res]\n * @returns {Boolean}\n */\nRequestBase.prototype._shouldRetry = function(err, res) {\n if (!this._maxRetries || this._retries++ >= this._maxRetries) {\n return false;\n }\n if (this._retryCallback) {\n try {\n var override = this._retryCallback(err, res);\n if (override === true) return true;\n if (override === false) return false;\n // undefined falls back to defaults\n } catch(e) {\n console.error(e);\n }\n }\n if (res && res.status && res.status >= 500 && res.status != 501) return true;\n if (err) {\n if (err.code && ~ERROR_CODES.indexOf(err.code)) return true;\n // Superagent timeout\n if (err.timeout && err.code == 'ECONNABORTED') return true;\n if (err.crossDomain) return true;\n }\n return false;\n};\n\n/**\n * Retry request\n *\n * @return {Request} for chaining\n * @api private\n */\n\nRequestBase.prototype._retry = function() {\n\n this.clearTimeout();\n\n // node\n if (this.req) {\n this.req = null;\n this.req = this.request();\n }\n\n this._aborted = false;\n this.timedout = false;\n\n return this._end();\n};\n\n/**\n * Promise support\n *\n * @param {Function} resolve\n * @param {Function} [reject]\n * @return {Request}\n */\n\nRequestBase.prototype.then = function then(resolve, reject) {\n if (!this._fullfilledPromise) {\n var self = this;\n if (this._endCalled) {\n console.warn(\"Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises\");\n }\n this._fullfilledPromise = new Promise(function(innerResolve, innerReject) {\n self.end(function(err, res) {\n if (err) innerReject(err);\n else innerResolve(res);\n });\n });\n }\n return this._fullfilledPromise.then(resolve, reject);\n};\n\nRequestBase.prototype.catch = function(cb) {\n return this.then(undefined, cb);\n};\n\n/**\n * Allow for extension\n */\n\nRequestBase.prototype.use = function use(fn) {\n fn(this);\n return this;\n};\n\nRequestBase.prototype.ok = function(cb) {\n if ('function' !== typeof cb) throw Error(\"Callback required\");\n this._okCallback = cb;\n return this;\n};\n\nRequestBase.prototype._isResponseOK = function(res) {\n if (!res) {\n return false;\n }\n\n if (this._okCallback) {\n return this._okCallback(res);\n }\n\n return res.status >= 200 && res.status < 300;\n};\n\n/**\n * Get request header `field`.\n * Case-insensitive.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nRequestBase.prototype.get = function(field){\n return this._header[field.toLowerCase()];\n};\n\n/**\n * Get case-insensitive header `field` value.\n * This is a deprecated internal API. Use `.get(field)` instead.\n *\n * (getHeader is no longer used internally by the superagent code base)\n *\n * @param {String} field\n * @return {String}\n * @api private\n * @deprecated\n */\n\nRequestBase.prototype.getHeader = RequestBase.prototype.get;\n\n/**\n * Set header `field` to `val`, or multiple fields with one object.\n * Case-insensitive.\n *\n * Examples:\n *\n * req.get('/')\n * .set('Accept', 'application/json')\n * .set('X-API-Key', 'foobar')\n * .end(callback);\n *\n * req.get('/')\n * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })\n * .end(callback);\n *\n * @param {String|Object} field\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.set = function(field, val){\n if (isObject(field)) {\n for (var key in field) {\n this.set(key, field[key]);\n }\n return this;\n }\n this._header[field.toLowerCase()] = val;\n this.header[field] = val;\n return this;\n};\n\n/**\n * Remove header `field`.\n * Case-insensitive.\n *\n * Example:\n *\n * req.get('/')\n * .unset('User-Agent')\n * .end(callback);\n *\n * @param {String} field\n */\nRequestBase.prototype.unset = function(field){\n delete this._header[field.toLowerCase()];\n delete this.header[field];\n return this;\n};\n\n/**\n * Write the field `name` and `val`, or multiple fields with one object\n * for \"multipart/form-data\" request bodies.\n *\n * ``` js\n * request.post('/upload')\n * .field('foo', 'bar')\n * .end(callback);\n *\n * request.post('/upload')\n * .field({ foo: 'bar', baz: 'qux' })\n * .end(callback);\n * ```\n *\n * @param {String|Object} name\n * @param {String|Blob|File|Buffer|fs.ReadStream} val\n * @return {Request} for chaining\n * @api public\n */\nRequestBase.prototype.field = function(name, val) {\n // name should be either a string or an object.\n if (null === name || undefined === name) {\n throw new Error('.field(name, val) name can not be empty');\n }\n\n if (this._data) {\n console.error(\".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()\");\n }\n\n if (isObject(name)) {\n for (var key in name) {\n this.field(key, name[key]);\n }\n return this;\n }\n\n if (Array.isArray(val)) {\n for (var i in val) {\n this.field(name, val[i]);\n }\n return this;\n }\n\n // val should be defined now\n if (null === val || undefined === val) {\n throw new Error('.field(name, val) val can not be empty');\n }\n if ('boolean' === typeof val) {\n val = '' + val;\n }\n this._getFormData().append(name, val);\n return this;\n};\n\n/**\n * Abort the request, and clear potential timeout.\n *\n * @return {Request}\n * @api public\n */\nRequestBase.prototype.abort = function(){\n if (this._aborted) {\n return this;\n }\n this._aborted = true;\n this.xhr && this.xhr.abort(); // browser\n this.req && this.req.abort(); // node\n this.clearTimeout();\n this.emit('abort');\n return this;\n};\n\nRequestBase.prototype._auth = function(user, pass, options, base64Encoder) {\n switch (options.type) {\n case 'basic':\n this.set('Authorization', 'Basic ' + base64Encoder(user + ':' + pass));\n break;\n\n case 'auto':\n this.username = user;\n this.password = pass;\n break;\n\n case 'bearer': // usage would be .auth(accessToken, { type: 'bearer' })\n this.set('Authorization', 'Bearer ' + user);\n break;\n }\n return this;\n};\n\n/**\n * Enable transmission of cookies with x-domain requests.\n *\n * Note that for this to work the origin must not be\n * using \"Access-Control-Allow-Origin\" with a wildcard,\n * and also must set \"Access-Control-Allow-Credentials\"\n * to \"true\".\n *\n * @api public\n */\n\nRequestBase.prototype.withCredentials = function(on) {\n // This is browser-only functionality. Node side is no-op.\n if (on == undefined) on = true;\n this._withCredentials = on;\n return this;\n};\n\n/**\n * Set the max redirects to `n`. Does noting in browser XHR implementation.\n *\n * @param {Number} n\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.redirects = function(n){\n this._maxRedirects = n;\n return this;\n};\n\n/**\n * Maximum size of buffered response body, in bytes. Counts uncompressed size.\n * Default 200MB.\n *\n * @param {Number} n\n * @return {Request} for chaining\n */\nRequestBase.prototype.maxResponseSize = function(n){\n if ('number' !== typeof n) {\n throw TypeError(\"Invalid argument\");\n }\n this._maxResponseSize = n;\n return this;\n};\n\n/**\n * Convert to a plain javascript object (not JSON string) of scalar properties.\n * Note as this method is designed to return a useful non-this value,\n * it cannot be chained.\n *\n * @return {Object} describing method, url, and data of this request\n * @api public\n */\n\nRequestBase.prototype.toJSON = function() {\n return {\n method: this.method,\n url: this.url,\n data: this._data,\n headers: this._header,\n };\n};\n\n/**\n * Send `data` as the request body, defaulting the `.type()` to \"json\" when\n * an object is given.\n *\n * Examples:\n *\n * // manual json\n * request.post('/user')\n * .type('json')\n * .send('{\"name\":\"tj\"}')\n * .end(callback)\n *\n * // auto json\n * request.post('/user')\n * .send({ name: 'tj' })\n * .end(callback)\n *\n * // manual x-www-form-urlencoded\n * request.post('/user')\n * .type('form')\n * .send('name=tj')\n * .end(callback)\n *\n * // auto x-www-form-urlencoded\n * request.post('/user')\n * .type('form')\n * .send({ name: 'tj' })\n * .end(callback)\n *\n * // defaults to x-www-form-urlencoded\n * request.post('/user')\n * .send('name=tobi')\n * .send('species=ferret')\n * .end(callback)\n *\n * @param {String|Object} data\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.send = function(data){\n var isObj = isObject(data);\n var type = this._header['content-type'];\n\n if (this._formData) {\n console.error(\".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()\");\n }\n\n if (isObj && !this._data) {\n if (Array.isArray(data)) {\n this._data = [];\n } else if (!this._isHost(data)) {\n this._data = {};\n }\n } else if (data && this._data && this._isHost(this._data)) {\n throw Error(\"Can't merge these send calls\");\n }\n\n // merge\n if (isObj && isObject(this._data)) {\n for (var key in data) {\n this._data[key] = data[key];\n }\n } else if ('string' == typeof data) {\n // default to x-www-form-urlencoded\n if (!type) this.type('form');\n type = this._header['content-type'];\n if ('application/x-www-form-urlencoded' == type) {\n this._data = this._data\n ? this._data + '&' + data\n : data;\n } else {\n this._data = (this._data || '') + data;\n }\n } else {\n this._data = data;\n }\n\n if (!isObj || this._isHost(data)) {\n return this;\n }\n\n // default to json\n if (!type) this.type('json');\n return this;\n};\n\n/**\n * Sort `querystring` by the sort function\n *\n *\n * Examples:\n *\n * // default order\n * request.get('/user')\n * .query('name=Nick')\n * .query('search=Manny')\n * .sortQuery()\n * .end(callback)\n *\n * // customized sort function\n * request.get('/user')\n * .query('name=Nick')\n * .query('search=Manny')\n * .sortQuery(function(a, b){\n * return a.length - b.length;\n * })\n * .end(callback)\n *\n *\n * @param {Function} sort\n * @return {Request} for chaining\n * @api public\n */\n\nRequestBase.prototype.sortQuery = function(sort) {\n // _sort default to true but otherwise can be a function or boolean\n this._sort = typeof sort === 'undefined' ? true : sort;\n return this;\n};\n\n/**\n * Compose querystring to append to req.url\n *\n * @api private\n */\nRequestBase.prototype._finalizeQueryString = function(){\n var query = this._query.join('&');\n if (query) {\n this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') + query;\n }\n this._query.length = 0; // Makes the call idempotent\n\n if (this._sort) {\n var index = this.url.indexOf('?');\n if (index >= 0) {\n var queryArr = this.url.substring(index + 1).split('&');\n if ('function' === typeof this._sort) {\n queryArr.sort(this._sort);\n } else {\n queryArr.sort();\n }\n this.url = this.url.substring(0, index) + '?' + queryArr.join('&');\n }\n }\n};\n\n// For backwards compat only\nRequestBase.prototype._appendQueryString = function() {console.trace(\"Unsupported\");}\n\n/**\n * Invoke callback with timeout error.\n *\n * @api private\n */\n\nRequestBase.prototype._timeoutError = function(reason, timeout, errno){\n if (this._aborted) {\n return;\n }\n var err = new Error(reason + timeout + 'ms exceeded');\n err.timeout = timeout;\n err.code = 'ECONNABORTED';\n err.errno = errno;\n this.timedout = true;\n this.abort();\n this.callback(err);\n};\n\nRequestBase.prototype._setTimeouts = function() {\n var self = this;\n\n // deadline\n if (this._timeout && !this._timer) {\n this._timer = setTimeout(function(){\n self._timeoutError('Timeout of ', self._timeout, 'ETIME');\n }, this._timeout);\n }\n // response timeout\n if (this._responseTimeout && !this._responseTimeoutTimer) {\n this._responseTimeoutTimer = setTimeout(function(){\n self._timeoutError('Response timeout of ', self._responseTimeout, 'ETIMEDOUT');\n }, this._responseTimeout);\n }\n};\n","'use strict';\n\n/**\n * Module dependencies.\n */\n\nvar utils = require('./utils');\n\n/**\n * Expose `ResponseBase`.\n */\n\nmodule.exports = ResponseBase;\n\n/**\n * Initialize a new `ResponseBase`.\n *\n * @api public\n */\n\nfunction ResponseBase(obj) {\n if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the prototype properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in ResponseBase.prototype) {\n obj[key] = ResponseBase.prototype[key];\n }\n return obj;\n}\n\n/**\n * Get case-insensitive `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nResponseBase.prototype.get = function(field) {\n return this.header[field.toLowerCase()];\n};\n\n/**\n * Set header related properties:\n *\n * - `.type` the content type without params\n *\n * A response of \"Content-Type: text/plain; charset=utf-8\"\n * will provide you with a `.type` of \"text/plain\".\n *\n * @param {Object} header\n * @api private\n */\n\nResponseBase.prototype._setHeaderProperties = function(header){\n // TODO: moar!\n // TODO: make this a util\n\n // content-type\n var ct = header['content-type'] || '';\n this.type = utils.type(ct);\n\n // params\n var params = utils.params(ct);\n for (var key in params) this[key] = params[key];\n\n this.links = {};\n\n // links\n try {\n if (header.link) {\n this.links = utils.parseLinks(header.link);\n }\n } catch (err) {\n // ignore\n }\n};\n\n/**\n * Set flags such as `.ok` based on `status`.\n *\n * For example a 2xx response will give you a `.ok` of __true__\n * whereas 5xx will be __false__ and `.error` will be __true__. The\n * `.clientError` and `.serverError` are also available to be more\n * specific, and `.statusType` is the class of error ranging from 1..5\n * sometimes useful for mapping respond colors etc.\n *\n * \"sugar\" properties are also defined for common cases. Currently providing:\n *\n * - .noContent\n * - .badRequest\n * - .unauthorized\n * - .notAcceptable\n * - .notFound\n *\n * @param {Number} status\n * @api private\n */\n\nResponseBase.prototype._setStatusProperties = function(status){\n var type = status / 100 | 0;\n\n // status / class\n this.status = this.statusCode = status;\n this.statusType = type;\n\n // basics\n this.info = 1 == type;\n this.ok = 2 == type;\n this.redirect = 3 == type;\n this.clientError = 4 == type;\n this.serverError = 5 == type;\n this.error = (4 == type || 5 == type)\n ? this.toError()\n : false;\n\n // sugar\n this.accepted = 202 == status;\n this.noContent = 204 == status;\n this.badRequest = 400 == status;\n this.unauthorized = 401 == status;\n this.notAcceptable = 406 == status;\n this.forbidden = 403 == status;\n this.notFound = 404 == status;\n};\n","'use strict';\n\n/**\n * Return the mime type for the given `str`.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nexports.type = function(str){\n return str.split(/ *; */).shift();\n};\n\n/**\n * Return header field parameters.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nexports.params = function(str){\n return str.split(/ *; */).reduce(function(obj, str){\n var parts = str.split(/ *= */);\n var key = parts.shift();\n var val = parts.shift();\n\n if (key && val) obj[key] = val;\n return obj;\n }, {});\n};\n\n/**\n * Parse Link header fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nexports.parseLinks = function(str){\n return str.split(/ *, */).reduce(function(obj, str){\n var parts = str.split(/ *; */);\n var url = parts[0].slice(1, -1);\n var rel = parts[1].split(/ *= */)[1].slice(1, -1);\n obj[rel] = url;\n return obj;\n }, {});\n};\n\n/**\n * Strip content related fields from `header`.\n *\n * @param {Object} header\n * @return {Object} header\n * @api private\n */\n\nexports.cleanHeader = function(header, changesOrigin){\n delete header['content-type'];\n delete header['content-length'];\n delete header['transfer-encoding'];\n delete header['host'];\n // secuirty\n if (changesOrigin) {\n delete header['authorization'];\n delete header['cookie'];\n }\n return header;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// startup\n// Load entry module and return exports\n// This entry module doesn't tell about it's top-level declarations so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(5724);\n"],"names":["superagent","querystring","AccountExport","AccountExports","ActivityFeed","AuthorizedApps","Automations","BatchWebhooks","Batches","CampaignFolders","Campaigns","ConnectedSites","Conversations","CustomerJourneys","Ecommerce","FacebookAds","FileManager","LandingPages","Lists","Ping","Reporting","Reports","Root","SearchCampaigns","SearchMembers","Surveys","TemplateFolders","Templates","VerifiedDomains","exports","this","basePath","replace","config","apiKey","accessToken","server","defaultHeaders","timeout","cache","enableCookies","window","agent","accountExport","accountExports","activityFeed","authorizedApps","automations","batchWebhooks","batches","campaignFolders","campaigns","connectedSites","conversations","customerJourneys","ecommerce","facebookAds","fileManager","landingPages","lists","ping","reporting","reports","root","searchCampaigns","searchMembers","templateFolders","templates","verifiedDomains","prototype","setConfig","paramToString","param","undefined","Date","toJSON","toString","buildUrl","path","pathParams","match","url","_this","fullMatch","key","value","hasOwnProperty","encodeURIComponent","isJsonMime","contentType","Boolean","jsonPreferredMime","contentTypes","i","length","isFileParam","fs","err","ReadStream","Buffer","Blob","File","normalizeParams","params","newParams","Array","isArray","CollectionFormatEnum","CSV","SSV","TSV","PIPES","MULTI","buildCollectionParam","collectionFormat","map","join","Error","deserialize","response","returnType","status","data","body","Object","keys","text","convertToType","callApi","httpMethod","queryParams","headerParams","formParams","bodyParam","authNames","accepts","request","auth","set","toUpperCase","getTime","query","type","HeaderUtils","caseInsensitiveGet","header","send","stringify","_formParams","attach","field","accept","responseType","attachCookies","withCredentials","Promise","resolve","reject","end","error","saveCookies","parseDate","str","parseInt","parseFloat","String","constructFromObject","itemType","item","keyType","valueType","k","result","obj","instance","module","ApiClient","apiClient","getAccountExportsWithHttpInfo","exportId","opts","getAccountExports","then","response_and_data","listAccountExportsWithHttpInfo","listAccountExports","createAccountExportWithHttpInfo","postBody","createAccountExport","getChimpChatterWithHttpInfo","getChimpChatter","listWithHttpInfo","list","getWithHttpInfo","appId","get","archiveWithHttpInfo","workflowId","archive","deleteWorkflowEmailWithHttpInfo","workflowEmailId","deleteWorkflowEmail","listAllWorkflowEmailsWithHttpInfo","listAllWorkflowEmails","getWorkflowEmailWithHttpInfo","getWorkflowEmail","getWorkflowEmailSubscriberQueueWithHttpInfo","getWorkflowEmailSubscriberQueue","getWorkflowEmailSubscriberWithHttpInfo","subscriberHash","getWorkflowEmailSubscriber","listWorkflowEmailSubscribersRemovedWithHttpInfo","listWorkflowEmailSubscribersRemoved","getRemovedWorkflowEmailSubscriberWithHttpInfo","getRemovedWorkflowEmailSubscriber","updateWorkflowEmailWithHttpInfo","updateWorkflowEmail","createWithHttpInfo","create","pauseAllEmailsWithHttpInfo","pauseAllEmails","startAllEmailsWithHttpInfo","startAllEmails","pauseWorkflowEmailWithHttpInfo","pauseWorkflowEmail","startWorkflowEmailWithHttpInfo","startWorkflowEmail","addWorkflowEmailSubscriberWithHttpInfo","addWorkflowEmailSubscriber","removeWorkflowEmailSubscriberWithHttpInfo","removeWorkflowEmailSubscriber","removeWithHttpInfo","batchWebhookId","remove","updateWithHttpInfo","update","deleteRequestWithHttpInfo","batchId","deleteRequest","statusWithHttpInfo","startWithHttpInfo","start","folderId","campaignId","deleteFeedbackMessageWithHttpInfo","feedbackId","deleteFeedbackMessage","getContentWithHttpInfo","getContent","getFeedbackWithHttpInfo","getFeedback","getFeedbackMessageWithHttpInfo","getFeedbackMessage","getSendChecklistWithHttpInfo","getSendChecklist","updateFeedbackMessageWithHttpInfo","updateFeedbackMessage","cancelSendWithHttpInfo","cancelSend","createResendWithHttpInfo","createResend","pauseWithHttpInfo","pause","replicateWithHttpInfo","replicate","resumeWithHttpInfo","resume","scheduleWithHttpInfo","schedule","sendWithHttpInfo","sendTestEmailWithHttpInfo","sendTestEmail","unscheduleWithHttpInfo","unschedule","addFeedbackWithHttpInfo","addFeedback","setContentWithHttpInfo","setContent","connectedSiteId","verifyScriptInstallationWithHttpInfo","verifyScriptInstallation","conversationId","getConversationMessagesWithHttpInfo","getConversationMessages","getConversationMessageWithHttpInfo","messageId","getConversationMessage","triggerWithHttpInfo","journeyId","stepId","trigger","deleteStoreWithHttpInfo","storeId","deleteStore","deleteStoreCartWithHttpInfo","cartId","deleteStoreCart","deleteCartLineItemWithHttpInfo","lineId","deleteCartLineItem","deleteStoreCustomerWithHttpInfo","customerId","deleteStoreCustomer","deleteOrderWithHttpInfo","orderId","deleteOrder","deleteOrderLineItemWithHttpInfo","deleteOrderLineItem","deleteStoreProductWithHttpInfo","productId","deleteStoreProduct","deleteProductImageWithHttpInfo","imageId","deleteProductImage","deleteProductVariantWithHttpInfo","variantId","deleteProductVariant","deletePromoCodeWithHttpInfo","promoRuleId","promoCodeId","deletePromoCode","deletePromoRuleWithHttpInfo","deletePromoRule","ordersWithHttpInfo","orders","storesWithHttpInfo","stores","getStoreWithHttpInfo","getStore","getStoreCartsWithHttpInfo","getStoreCarts","getStoreCartWithHttpInfo","getStoreCart","getAllCartLineItemsWithHttpInfo","getAllCartLineItems","getCartLineItemWithHttpInfo","getCartLineItem","getAllStoreCustomersWithHttpInfo","getAllStoreCustomers","getStoreCustomerWithHttpInfo","getStoreCustomer","getStoreOrdersWithHttpInfo","getStoreOrders","getOrderWithHttpInfo","getOrder","getAllOrderLineItemsWithHttpInfo","getAllOrderLineItems","getOrderLineItemWithHttpInfo","getOrderLineItem","getAllStoreProductsWithHttpInfo","getAllStoreProducts","getStoreProductWithHttpInfo","getStoreProduct","getProductImagesWithHttpInfo","getProductImages","getProductImageWithHttpInfo","getProductImage","getProductVariantsWithHttpInfo","getProductVariants","getProductVariantWithHttpInfo","getProductVariant","getPromoCodesWithHttpInfo","getPromoCodes","getPromoCodeWithHttpInfo","getPromoCode","listPromoRulesWithHttpInfo","listPromoRules","getPromoRuleWithHttpInfo","getPromoRule","updateStoreWithHttpInfo","updateStore","updateStoreCartWithHttpInfo","updateStoreCart","updateCartLineItemWithHttpInfo","updateCartLineItem","updateStoreCustomerWithHttpInfo","updateStoreCustomer","updateOrderWithHttpInfo","updateOrder","updateOrderLineItemWithHttpInfo","updateOrderLineItem","updateStoreProductWithHttpInfo","updateStoreProduct","updateProductImageWithHttpInfo","updateProductImage","updateProductVariantWithHttpInfo","updateProductVariant","updatePromoCodeWithHttpInfo","updatePromoCode","updatePromoRuleWithHttpInfo","updatePromoRule","addStoreWithHttpInfo","addStore","addStoreCartWithHttpInfo","addStoreCart","addCartLineItemWithHttpInfo","addCartLineItem","addStoreCustomerWithHttpInfo","addStoreCustomer","addStoreOrderWithHttpInfo","addStoreOrder","addOrderLineItemWithHttpInfo","addOrderLineItem","addStoreProductWithHttpInfo","addStoreProduct","addProductImageWithHttpInfo","addProductImage","addProductVariantsWithHttpInfo","addProductVariants","addPromoCodeWithHttpInfo","addPromoCode","addPromoRulesWithHttpInfo","addPromoRules","setStoreCustomerWithHttpInfo","setStoreCustomer","addProductVariantWithHttpInfo","addProductVariant","getAdWithHttpInfo","outreachId","getAd","deleteFileWithHttpInfo","fileId","deleteFile","deleteFolderWithHttpInfo","deleteFolder","filesWithHttpInfo","files","getFileWithHttpInfo","getFile","listFoldersWithHttpInfo","listFolders","getFolderWithHttpInfo","getFolder","updateFileWithHttpInfo","updateFile","updateFolderWithHttpInfo","updateFolder","uploadWithHttpInfo","upload","createFolderWithHttpInfo","createFolder","deletePageWithHttpInfo","pageId","deletePage","getAllWithHttpInfo","getAll","getPageWithHttpInfo","getPage","getPageContentWithHttpInfo","getPageContent","updatePageWithHttpInfo","updatePage","publishPageWithHttpInfo","publishPage","unpublishPageWithHttpInfo","unpublishPage","deleteListWithHttpInfo","listId","deleteList","deleteInterestCategoryWithHttpInfo","interestCategoryId","deleteInterestCategory","deleteInterestCategoryInterestWithHttpInfo","interestId","deleteInterestCategoryInterest","deleteListMemberWithHttpInfo","deleteListMember","deleteListMemberNoteWithHttpInfo","noteId","deleteListMemberNote","deleteListMergeFieldWithHttpInfo","mergeId","deleteListMergeField","deleteSegmentWithHttpInfo","segmentId","deleteSegment","removeSegmentMemberWithHttpInfo","removeSegmentMember","deleteListWebhookWithHttpInfo","webhookId","deleteListWebhook","getListMemberTagsWithHttpInfo","getListMemberTags","getAllListsWithHttpInfo","getAllLists","getListWithHttpInfo","getList","getListAbuseReportsWithHttpInfo","getListAbuseReports","getListAbuseReportDetailsWithHttpInfo","reportId","getListAbuseReportDetails","getListRecentActivityWithHttpInfo","getListRecentActivity","getListClientsWithHttpInfo","getListClients","getListGrowthHistoryWithHttpInfo","getListGrowthHistory","getListGrowthHistoryByMonthWithHttpInfo","month","getListGrowthHistoryByMonth","getListInterestCategoriesWithHttpInfo","getListInterestCategories","getInterestCategoryWithHttpInfo","getInterestCategory","listInterestCategoryInterestsWithHttpInfo","listInterestCategoryInterests","getInterestCategoryInterestWithHttpInfo","getInterestCategoryInterest","getListLocationsWithHttpInfo","getListLocations","getListMembersInfoWithHttpInfo","getListMembersInfo","getListMemberWithHttpInfo","getListMember","getListMemberActivityWithHttpInfo","getListMemberActivity","getListMemberActivityFeedWithHttpInfo","getListMemberActivityFeed","getListMemberEventsWithHttpInfo","getListMemberEvents","getListMemberGoalsWithHttpInfo","getListMemberGoals","getListMemberNotesWithHttpInfo","getListMemberNotes","getListMemberNoteWithHttpInfo","getListMemberNote","getListMergeFieldsWithHttpInfo","getListMergeFields","getListMergeFieldWithHttpInfo","getListMergeField","getSegmentWithHttpInfo","getSegment","getSegmentMembersListWithHttpInfo","getSegmentMembersList","getListSignupFormsWithHttpInfo","getListSignupForms","getAllSurveysForListWithHttpInfo","getAllSurveysForList","getSurveyWithHttpInfo","surveyId","getSurvey","getListWebhooksWithHttpInfo","getListWebhooks","getListWebhookWithHttpInfo","getListWebhook","updateListWithHttpInfo","updateList","updateInterestCategoryWithHttpInfo","updateInterestCategory","updateInterestCategoryInterestWithHttpInfo","updateInterestCategoryInterest","updateListMemberWithHttpInfo","updateListMember","updateListMemberNoteWithHttpInfo","updateListMemberNote","updateListMergeFieldWithHttpInfo","updateListMergeField","updateSegmentWithHttpInfo","updateSegment","updateListWebhookWithHttpInfo","updateListWebhook","createListMemberEventWithHttpInfo","createListMemberEvent","updateListMemberTagsWithHttpInfo","updateListMemberTags","createListWithHttpInfo","createList","batchListMembersWithHttpInfo","batchListMembers","createListInterestCategoryWithHttpInfo","createListInterestCategory","createInterestCategoryInterestWithHttpInfo","createInterestCategoryInterest","addListMemberWithHttpInfo","addListMember","deleteListMemberPermanentWithHttpInfo","deleteListMemberPermanent","createListMemberNoteWithHttpInfo","createListMemberNote","addListMergeFieldWithHttpInfo","addListMergeField","createSegmentWithHttpInfo","createSegment","batchSegmentMembersWithHttpInfo","batchSegmentMembers","createSegmentMemberWithHttpInfo","createSegmentMember","updateListSignupFormWithHttpInfo","updateListSignupForm","createListWebhookWithHttpInfo","createListWebhook","listSegmentsWithHttpInfo","listSegments","setListMemberWithHttpInfo","setListMember","tagSearchWithHttpInfo","tagSearch","getFacebookAdsReportAllWithHttpInfo","getFacebookAdsReportAll","getFacebookAdReportWithHttpInfo","getFacebookAdReport","getFacebookAdProductActivityReportWithHttpInfo","getFacebookAdProductActivityReport","getLandingPageReportsAllWithHttpInfo","getLandingPageReportsAll","getLandingPageReportWithHttpInfo","getLandingPageReport","getSurveyReportsAllWithHttpInfo","getSurveyReportsAll","getSurveyReportWithHttpInfo","getSurveyReport","getSurveyQuestionReportsAllWithHttpInfo","getSurveyQuestionReportsAll","getSurveyQuestionReportWithHttpInfo","questionId","getSurveyQuestionReport","getSurveyQuestionAnswersWithHttpInfo","getSurveyQuestionAnswers","getSurveyResponsesAllWithHttpInfo","getSurveyResponsesAll","getSurveyResponseWithHttpInfo","responseId","getSurveyResponse","getAllCampaignReportsWithHttpInfo","getAllCampaignReports","getCampaignReportWithHttpInfo","getCampaignReport","getCampaignAbuseReportsWithHttpInfo","getCampaignAbuseReports","getCampaignAbuseReportWithHttpInfo","getCampaignAbuseReport","getCampaignAdviceWithHttpInfo","getCampaignAdvice","getCampaignClickDetailsWithHttpInfo","getCampaignClickDetails","getCampaignClickDetailsForLinkWithHttpInfo","linkId","getCampaignClickDetailsForLink","getSubscribersInfoWithHttpInfo","getSubscribersInfo","getSubscriberInfoWithHttpInfo","getSubscriberInfo","getDomainPerformanceForCampaignWithHttpInfo","getDomainPerformanceForCampaign","getEcommerceProductActivityForCampaignWithHttpInfo","getEcommerceProductActivityForCampaign","getEepurlActivityForCampaignWithHttpInfo","getEepurlActivityForCampaign","getEmailActivityForCampaignWithHttpInfo","getEmailActivityForCampaign","getEmailActivityForSubscriberWithHttpInfo","getEmailActivityForSubscriber","getLocationsForCampaignWithHttpInfo","getLocationsForCampaign","getCampaignOpenDetailsWithHttpInfo","getCampaignOpenDetails","getSubscriberInfoForOpenedCampaignWithHttpInfo","getSubscriberInfoForOpenedCampaign","getCampaignRecipientsWithHttpInfo","getCampaignRecipients","getCampaignRecipientWithHttpInfo","getCampaignRecipient","getSubReportsForCampaignWithHttpInfo","getSubReportsForCampaign","getUnsubscribedListForCampaignWithHttpInfo","getUnsubscribedListForCampaign","getUnsubscribedListMemberWithHttpInfo","getUnsubscribedListMember","getRootWithHttpInfo","getRoot","searchWithHttpInfo","search","publishSurveyWithHttpInfo","publishSurvey","unpublishSurveyWithHttpInfo","unpublishSurvey","deleteTemplateWithHttpInfo","templateId","deleteTemplate","getTemplateWithHttpInfo","getTemplate","getDefaultContentForTemplateWithHttpInfo","getDefaultContentForTemplate","updateTemplateWithHttpInfo","updateTemplate","createVerifiedDomainWithHttpInfo","createVerifiedDomain","deleteDomainWithHttpInfo","domainName","deleteDomain","getDomainWithHttpInfo","getDomain","getVerifiedDomainsAllWithHttpInfo","getVerifiedDomainsAll","submitDomainVerificationWithHttpInfo","submitDomainVerification","ScrollMagic","_util","log","version","addEventListener","PIN_SPACER_ATTRIBUTE","Controller","options","_updateTimeout","_refreshTimeout","NAMESPACE","SCROLL_DIRECTION_FORWARD","SCROLL_DIRECTION_REVERSE","SCROLL_DIRECTION_PAUSED","DEFAULT_OPTIONS","CONTROLLER_OPTIONS","defaults","_options","extend","_sceneObjects","_updateScenesOnNextCycle","_scrollPos","_scrollDirection","_isDocument","_viewPortSize","_enabled","construct","container","elements","document","contains","getViewportSize","onChange","ri","refreshInterval","Number","scheduleRefresh","setTimeout","refresh","getScrollPos","vertical","scrollTop","scrollLeft","height","width","setScrollPos","_setScrollPos","pos","scrollTo","updateScenes","scenesToUpdate","slice","oldScrollPos","deltaScroll","scrollPos","reverse","forEach","scene","index","loglevel","debounceUpdate","rAF","e","resizeEvent","Event","bubbles","cancelable","createEvent","initEvent","dispatchEvent","_log","output","splice","call","arguments","apply","sortScenes","ScenesArray","scenes","sort","a","b","scrollOffset","addScene","newScene","Scene","controller","addTo","indexOf","push","on","globalSceneOptions","removeScene","off","updateScene","immediately","scrollTarget","additionalParameter","Function","elem","parentNode","hasAttribute","containerOffset","offset","elementOffset","scrollPosMethod","info","about","values","size","scrollDirection","isDocument","newLoglevel","enabled","newState","destroy","resetScenes","clearTimeout","removeEventListener","cAF","addOption","name","defaultValue","extension","oldClass","$super","constructor","_durationUpdateMethod","_controller","SCENE_STATE_BEFORE","SCENE_STATE_DURING","SCENE_STATE_AFTER","SCENE_OPTIONS","_state","_progress","_scrollOffset","_triggerPos","optionName","addSceneOption","validateOption","_listeners","names","callback","trim","split","fullname","nameparts","eventname","namespace","listener","vars","listeners","what","updateTriggerElementPosition","updateScrollOffset","updateDuration","onContainerResize","tmpParent","reset","newProgress","duration","startPos","endPos","progress","_pin","updatePinState","doUpdate","oldState","reverseOrForward","eventVars","state","stateChanged","eventName","_pinOptions","triggerElement","triggerHook","suppressEvents","varname","changeOption","newval","reason","elementPos","telem","controllerInfo","changed","_validate","validate","val","perc","check","logMSG","unshift","message","oldval","newVal","shifts","triggerPosition","durationChanged","updatePinDimensions","removePin","forceUnpin","containerInfo","pinTarget","spacer","firstChild","newCSS","position","inFlow","top","left","change","css","pushFollowers","fixedPos","scrollDistance","Math","round","during","marginCollapse","isMarginCollapseType","relSize","autoFullWidth","updatePinInContainer","updateRelativePinSpacer","onMousewheelOverPin","preventDefault","wheelDelta","detail","setPin","element","settings","defaultSettings","spacerClass","pushFollowersActivelySet","parentDisplay","style","display","boundsParams","pinCSS","concat","sizeCSS","insertBefore","createElement","spacerCSS","boxSizing","mozBoxSizing","webkitBoxSizing","setAttribute","addClass","___origStyle","pinInlineCSS","appendChild","margin","bottom","right","margins","removeChild","_cssClasses","_cssClassElems","removeClassToggle","setClassToggle","classes","elems","toggle","removeClass","translate","max","min","validationCallback","target","currentTarget","timeStamp","timestamp","now","U","floatval","number","_getComputedStyle","currentStyle","getComputedStyle","_dimension","which","outer","includeMargin","_type","DomElement","charAt","substr","toLowerCase","dimension","marginTop","marginBottom","marginLeft","marginRight","_camelCase","g","lastTime","vendors","_requestAnimationFrame","requestAnimationFrame","_cancelAnimationFrame","cancelAnimationFrame","currTime","timeToCall","id","bind","loglevels","console","method","time","getHours","getMinutes","getSeconds","getMilliseconds","args","func","v","o","HTMLElement","SVGElement","nodeType","nodeName","_get","selector","arr","querySelectorAll","NodeList","ref","pageYOffset","pageXOffset","relativeToViewport","getBoundingClientRect","rect","classname","classList","add","className","RegExp","option","addIndicators","removeIndicators","setTween","removeTween","setVelocity","removeVelocity","EventBus","EventTypes","freeze","ALL_COMPONENTS_READY","MY_CUSTOM_EVENT","App","_classCallCheck","el","onAppReady","init","someElement","querySelector","event","eventData","ev","CustomEvent","ExampleComponent","UserItem","onClick","textContent","MenuDropdown","checkbox","svg","dropdown","setTabState","checked","passive","dropdownlinks","tabIndex","MenuMain","burger","menuSlider","burgerContainer","ariaExpanded","JSON","parse","Accordion","title","content","toggleAccordion","contentHeight","offsetHeight","MediaPlayer","videoID","dataset","videoid","videoPlayerContainer","videoPlay","videoImageOverlay","videoPlayer","hideImageOverlay","scrollCheck","onPlayerReady","onYouTubeIframeAPIReady","onPlayerStateChange","stopVideo","playVideo","pauseVideo","isMyScriptLoaded","loadScript","done","player","opacity","tag","src","firstScriptTag","getElementsByTagName","overlay","zIndex","_this2","YT","Player","videoId","host","events","thisIframe","scripts","Header","main","loginButtons","loginPopup","searchButton","searchArea","messageCounter","searchInput","setScrollDirection","toggleSearch","getMessageNumber","insertMessageNumber","isEmployee","employee","isImpersonating","isimpersonating","isAuth","button","isDisabled","removeAttribute","documentElement","setProperty","scrollY","myHeaders","Headers","append","fetch","headers","redirect","json","catch","messageNumber","messageContainer","innerHTML","menuHeight","getPropertyValue","focus","_this3","scrollUp","scrollDown","lastScroll","currentScroll","AnchorMenu","anchorPoints","activatePointModule","anchor","getAttribute","scrollIntoView","behavior","anchorcontroller","points","pointcontroller","point","anchorLink","nextElementSibling","moduleHeight","typeAhead","typeaheadquery","searchcontainer","fullQuery","ul","Terms","Term","suggestion","location","includes","reduce","hash","_hash$split2","_slicedToArray","assign","_defineProperty","decodeURIComponent","innerText","Size","Q","encodeURI","pathQuery","pathname","history","pushState","pushUrlParams","KeyboardEvent","buildTypeAhead","GlobalSearch","typeAheadQuery","typeAheadArray","seaarchButton","searchResultPage","resultpage","TypeAheadContainer","enterSearchParam","keyCode","IframeTab","tabs","frameContainer","loadFrame","tab","ServiceCode","password","verifypassword","submitbutton","errornomatch","errornoinput","matchPassword","checkEmptyPassword","class","RichText","tables","checkOverflow","tablearray","_toConsumableArray","table","tablecontainer","overflowX","scrollWidth","offsetWidth","insertAdjacentHTML","_regeneratorRuntime","t","r","n","defineProperty","Symbol","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","Context","makeInvokeMethod","tryCatch","arg","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","defineIteratorMethods","_invoke","AsyncIterator","invoke","_typeof","__await","callInvokeWithMethodAndArg","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","return","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","isNaN","displayName","isGeneratorFunction","mark","setPrototypeOf","__proto__","awrap","async","pop","prev","stop","rval","handle","complete","finish","delegateYield","asyncGeneratorStep","gen","_next","_throw","_defineProperties","props","descriptor","input","hint","prim","toPrimitive","res","_toPrimitive","MailchimpSignup","Constructor","protoProps","staticProps","client","require","run","fn","_ref","_callee","_context","self","GoogleMap","street","city","address","googleframe","Ical","startDate","endDate","summary","description","zipcode","generateIcsFile","convertDateFormat","dateTime","fullDate","year","substring","day","icsFile","downloadIcsFile","filename","fileBody","click","setCookie","exdays","cookieValueString","setTime","expires","toUTCString","cookie","GlobalAlert","showAlert","cookies","filter","getCookie","PriceSaveCalculator","lakaMonth","price","aKasse","yearOfBirth","workload","submit","yearResult","totalResult","generateAkasseList","generateYearList","generateResult","akassedata","date","subtractYears","getYearsTillRetirement","isActiveAkasse","isActiveYear","newDate","getFullYear","disabled","years","dateCopy","setFullYear","akasser","akasse","Name","choosenYear","retirementAge","yearsTillRetirement","choosenAkasse","lakaYear","yearlySavings","totalSavings","Intl","NumberFormat","currency","format","totalSavingsResult","test","richTextModule","properties","richText","markup","infoBoxModule","infoBg","background","label","accordionModule","accordionList","items","accordionitem","accordionItem","quoteModule","quote","author","imageModule","imageCrop","image","crops","find","crop","alias","coordinates","x1","y1","x2","y2","QuestionnaireModule","answers","previousId","questionnaireContainer","startItem","startitem","questionnaireId","questionnaireid","GetQuestion","GenerateQuestion","GetResult","GenerateResult","UpdateAnswerArray","startButton","requestUrl","qusetionHtml","question","answer","nextId","nextGuid","isNextResult","some","radioButton","isresult","backButton","backButtonId","backid","findIndex","once","_this4","_json$properties","_json$properties2","_json$properties2$res","_json$properties3","_json$properties$imag","_this5","resultHtml","resultDesiption","resultBlock","contentItem","generateGuidePageContent","contentElements","guideContainer","component","isDesktop","matchMedia","matches","guideTitle","pageTitle","stepTitle","lastbutton","route","guideStepCheck","actionLinkText","step","isCompleted","guideStepCompleation","currentStep","hideLink","hideActionLinkAfterStep","actionLink","requiredActionButton","setStepAsCompleated","stepJson","contentKey","currentStepSpan","insertInfoTextAfterCompleation","infoTextAfter","GuidePage","GuideID","guideid","pagetitle","stepList","precentCompleated","userId","uid","fetchStartPage","generateStartPage","fetchChildren","generateStepList","generateGuidePage","initContentElements","generateStepButtons","stepCompleated","pageType","requestOptions","parentElement","html","startpageSteps","stepkey","percentageDone","steps","isReceipt","stepNumber","titleName","grid","gridLength","areas","guidePage","receiptTitle","receiptDescription","receiptButton","firstindex","area","columnSpan","allPreviousStepsCompleted","receiptQuiz","answerIndex","isCorrect","questionAnswer","quiz","prevStep","nextStep","stepButtonsContainer","stepButtonsHeight","minHeight","quizQuestions","ancestor","closest","quizInner","previousElementSibling","slidePosition","offsetLeft","transform","lastQuizSlideRadioButtons","checkForCompleated","stepButtons","isreceipt","stepCheck","infoTextAfterStep","stepCheckbox","stepKey","guideId","IsCompleted","progressPercent","guideProgress","getProgress","setProgress","circle","showNumber","userid","circumference","baseVal","PI","strokeDasharray","strokeDashoffset","hasUnfinishedGuides","unfinishedGuides","percent","validatePhoneNumber","phoneNumber","removeWhitespace","CallMeUp","form","submitButton","iconButton","nameInput","phoneInput","consent","allInputs","receipt","responseErrorEl","spinner","maxLength","sendForm","displaySpinner","hideSpinner","validateName","_ref$minLength","minLength","_ref$maxLength","validateTextString","visibility","CandenoLogin","buttontext","getCandenoLogin","loginToCandeno","buttontype","bgcolor","svgcolor","resultObject","buttonstyle","svgstyle","topMargin","formButton","loginUrl","clientId","token","lazySizes","components","Class","selectorName","GuideProgress","ComponentInstantiator","createComponents","dispatchReady","componentsInstantiated","nodes","nodeItem","navigator","serviceWorker","register","Emitter","mixin","_callbacks","removeListener","removeAllListeners","cb","callbacks","emit","len","hasListeners","factory","lazysizes","lazySizesCfg","prop","lazySizesDefaults","lazyClass","loadedClass","loadingClass","preloadClass","errorClass","autosizesClass","fastLoadedClass","iframeLoadMode","srcAttr","srcsetAttr","sizesAttr","minSize","customMedia","expFactor","hFac","loadMode","loadHidden","ricTimeout","throttleDelay","lazySizesConfig","lazysizesConfig","getElementsByClassName","cfg","noSupport","docElem","supportPicture","HTMLPictureElement","_addEventListener","_getAttribute","requestIdleCallback","regPicture","loadEvents","regClassCache","hasClass","ele","cls","reg","addRemoveLoadEvents","dom","action","evt","triggerEvent","noBubbles","noCancelable","updatePolyfill","full","polyfill","picturefill","pf","reevaluate","getCSS","getWidth","parent","_lazysizesWidth","firstFns","secondFns","fns","runFns","running","waiting","shift","rafBatch","queue","hidden","_lsFlush","rAFIt","simple","that","throttle","gDelay","rICTimeout","idleCallback","isPriority","delay","debounce","wait","later","last","loader","regImg","regIframe","supportScroll","userAgent","shrinkExpand","currentExpand","isLoading","lowRuns","resetPreloading","isVisible","isBodyHidden","isNestedVisible","elemExpand","outerRect","visible","eLtop","eLbottom","eLleft","eLright","offsetParent","checkElements","eLlen","autoLoadElem","loadedSomething","elemNegativeExpand","elemExpandVal","beforeExpandVal","defaultExpand","preloadExpand","lazyloadElems","_lazyRace","prematureUnveil","unveilElement","expand","clientHeight","clientWidth","_defEx","eLvW","innerWidth","elvH","innerHeight","preloadElems","preloadAfterLoad","throttledCheckElements","switchLoadingClass","_lazyCache","rafSwitchLoadingClass","rafedSwitchLoadingClass","changeIframeSrc","contentWindow","handleSources","source","sourceSrcset","lazyUnveil","isAuto","sizes","isImg","srcset","isPicture","firesLoad","defaultPrevented","resetPreloadingTimer","isLoaded","naturalWidth","loading","autoSizer","updateElem","afterScroll","altLoadmodeScrollListner","onload","started","_","persisted","loadingElements","img","MutationObserver","observe","childList","subtree","attributes","setInterval","readyState","checkElems","unveil","_aLSL","sizeElement","sources","dataAttr","getSizeElement","debouncedUpdateElementsSizes","autosizesElems","uP","aC","rC","hC","fire","gW","regWhite","regSplitSet","regSource","regType","regBgUrlEscape","allowedBackgroundSize","contain","cover","setTypeOrMedia","typeMatch","proxyLoad","_lazybgset","bg","currentSrc","useSrc","fullSrc","backgroundImage","_lazybgsetLoading","alt","sets","picture","ratio","optimumx","createPicture","bgSize","backgroundSize","getBgSize","_lazysizesParentFit","regDescriptors","regCssFit","regCssObject","parentFit","getParent","parentSel","jQuery","getFit","tmpMatch","parentObj","fontFamily","fit","_lazysizesParentContainer","objectFit","getImageRatio","media","_lsMedia","calculateSize","displayRatio","imageRatio","retWidth","fitObj","fitElem","candidates","regWCandidates","regMultiple","addCandidate","ascendingSort","regPxLength","parseWsrcset","runMatchMedia","createSrcset","matchesMedia","getCandidate","sels","supportSrcset","regHDesc","fixEdgeHDescriptor","removeHDescriptors","handler","onerror","supportsType","hasHDescriptorFix","msElementsFromPoint","w","candidate","wDescriptor","timer","matchMediaElems","isImage","parsedSet","srcSet","_lazypolyfill","_set","srces","dpr","devicePixelRatio","optimum","getX","lowerCandidate","bonusFactor","cached","pow","reduceCandidate","cur","sel","bgLoad","uniqueUrls","addStyleScript","insertElem","rel","href","tmp","poster","preload","autoplay","play","er","requireJs","qs","sep","eq","regexp","maxKeys","kstr","vstr","x","idx","stringifyPrimitive","isFinite","ks","decode","encode","runtime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","toStringTagSymbol","innerFn","outerFn","tryLocsList","protoGenerator","generator","context","GenStateSuspendedStart","GenStateExecuting","GenStateCompleted","doneResult","delegateResult","ContinueSentinel","record","GenStateSuspendedYield","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","unwrapped","previousPromise","locs","entry","iterable","iteratorMethod","genFun","ctor","iter","object","skipTempReset","rootRecord","exception","loc","caught","hasCatch","hasFinally","finallyEntry","thrown","regeneratorRuntime","accidentalStrictMode","Agent","_defaults","_setDefaults","req","def","warn","RequestBase","isObject","ResponseBase","noop","Request","getXHR","XMLHttpRequest","protocol","ActiveXObject","serialize","pairs","pushEncodedKeyValuePair","subkey","parseString","pair","isJSON","mime","Response","xhr","responseText","statusText","_setStatusProperties","line","lines","fields","parseHeader","getAllResponseHeaders","getResponseHeader","_setHeaderProperties","_responseType","_parseBody","_query","_header","new_err","original","rawResponse","statusCode","_isResponseOK","custom_err","del","serializeObject","types","xml","urlencoded","_parser","toError","msg","user","pass","btoa","_auth","string","file","_data","_getFormData","_formData","FormData","_shouldRetry","_retry","_callback","_maxRetries","retries","_retries","crossDomainError","crossDomain","buffer","ca","pipe","write","_isHost","_endCalled","_finalizeQueryString","_end","_setTimeouts","onreadystatechange","_responseTimeoutTimer","timedout","_aborted","handleProgress","direction","total","loaded","onprogress","username","open","_withCredentials","_serializer","setRequestHeader","head","patch","post","put","_timer","_timeout","_responseTimeout","deadline","retry","count","_retryCallback","ERROR_CODES","override","code","_fullfilledPromise","innerResolve","innerReject","use","ok","_okCallback","getHeader","unset","abort","base64Encoder","redirects","_maxRedirects","maxResponseSize","_maxResponseSize","isObj","sortQuery","_sort","queryArr","_appendQueryString","trace","_timeoutError","errno","utils","ct","links","link","parseLinks","statusType","clientError","serverError","accepted","noContent","badRequest","unauthorized","notAcceptable","forbidden","notFound","parts","cleanHeader","changesOrigin","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition"],"sourceRoot":""}