From 09c423e95a233553b774b005d8f6e6bdb31fc8f1 Mon Sep 17 00:00:00 2001 From: 50/50 <80717571+50n50@users.noreply.github.com> Date: Sat, 11 Oct 2025 17:18:45 +0200 Subject: [PATCH] Upload --- 111477/111477.js | 229 + 111477/111477.json | 20 + 1movies/1movies.js | 286 + 1movies/1movies.json | 19 + 1tamilcrow/1tamilcrow.js | 225 + 1tamilcrow/1tamilcrow.json | 19 + LICENSE | 32 + README.md | 36 + aksv/aksv.js | 181 + aksv/aksv.json | 17 + anilibria/anilibria.js | 70 + anilibria/anilibria.json | 17 + anilibria/icon.png | Bin 0 -> 17556 bytes anilibria/iconalt.png | Bin 0 -> 78255 bytes anime-sama/anime-sama.js | 340 + anime-sama/anime-sama.json | 19 + anime3rb/anime3rb.js | 228 + anime3rb/anime3rb.json | 17 + anime3rb/iconalt.png | Bin 0 -> 48834 bytes anime4up/anime4up.js | 165 + anime4up/anime4up.json | 20 + animeav1/animeav1.js | 94 + animeav1/animeav1.json | 20 + animebalkan/animebalkan.js | 111 + animebalkan/animebalkan.json | 16 + animebalkan/iconalt.png | Bin 0 -> 112188 bytes animebum/animebum.js | 364 ++ animebum/animebum.json | 19 + animedefenders/animedefenders.js | 113 + animedefenders/animedefenders.json | 19 + animeepisodeseries/animeepisodeseries.js | 139 + animeepisodeseries/animeepisodeseries.json | 20 + animefhd/animefhd.js | 100 + animefhd/animefhd.json | 17 + animeheaven/animeheaven.js | 126 + animeheaven/animeheaven.json | 18 + animeheaven/iconalt.png | Bin 0 -> 104063 bytes animekai/dub/animekai.js | 307 + animekai/dub/animekai.json | 20 + animekai/hardsub/animekai.js | 307 + animekai/hardsub/animekai.json | 20 + animekhor/animekhor.js | 111 + animekhor/animekhor.json | 19 + animeland/animeland.js | 122 + animeland/animeland.json | 19 + animemeow/animemeow.js | 237 + animemeow/animemeow.json | 19 + animenana/animenana.js | 324 + animenana/animenana.json | 19 + animenix/animenix.js | 102 + animenix/animenix.json | 19 + animenosub/animenosub.js | 92 + animenosub/animenosub.json | 17 + animeq/animeq.js | 138 + animeq/animeq.json | 19 + animesaturn/animesaturn.js | 79 + animesaturn/animesaturn.json | 17 + animesdigital/animesdigital.js | 119 + animesdigital/animesdigital.json | 19 + animesdrive/animesdrive.js | 138 + animesdrive/animesdrive.json | 19 + animesonline/animesonline.js | 144 + animesonline/animesonline.json | 19 + animesrbija/animesrbija.js | 132 + animesrbija/animesrbija.json | 17 + animesrbija/iconalt.png | Bin 0 -> 104874 bytes animesroll/animesroll.js | 171 + animesroll/animesroll.json | 19 + animetoast/animetoast.js | 94 + animetoast/animetoast.json | 17 + animetoast/animetoast_v2.js | 956 +++ animeunity/animeunity.js | 122 + animeunity/animeuntiy.json | 17 + animeunity/iconalt.png | Bin 0 -> 69259 bytes animeworld/animeworld.js | 239 + animeworld/animeworld.json | 17 + animeworld/iconalt.png | Bin 0 -> 49652 bytes animexin/animexin.js | 133 + animexin/animexin.json | 19 + animeytx/animeytx.js | 315 + animeytx/animeytx.json | 19 + anitube/anitube.js | 108 + anitube/anitube.json | 19 + aniworld/AniWorldEngSub.json | 18 + aniworld/AniWorldGerDub.dev.json | 17 + aniworld/AniWorldGerDub.json | 18 + aniworld/AniWorldGerSub.json | 18 + aniworld/aniworld.png | Bin 0 -> 4383 bytes aniworld/icon.png | Bin 0 -> 38144 bytes aniworld/iconSub.png | Bin 0 -> 38380 bytes aniworld/iconSubEng.png | Bin 0 -> 40154 bytes aniworld/v1/AniWorldEngSub.js | 611 ++ aniworld/v1/AniWorldGerDub.js | 596 ++ aniworld/v1/AniWorldGerSub.js | 611 ++ aniworld/v2/AniWorldEngSub_v2.js | 993 +++ aniworld/v2/AniWorldGerDub_v2.js | 994 +++ aniworld/v2/AniWorldGerSub_v2.js | 993 +++ anoboye/anoboye.js | 86 + anoboye/anoboye.json | 19 + arablionz/arablionz.js | 229 + arablionz/arablionz.json | 18 + arabseed/arabseed.js | 156 + arabseed/arabseed.json | 18 + ashi/ashi.js | 719 +++ ashi/ashi.json | 19 + asia2tv/asia2tv.js | 269 + asia2tv/asia2tv.json | 19 + asialiveaction/asialiveaction.js | 295 + asialiveaction/asialiveaction.json | 19 + asset.png | Bin 0 -> 125110 bytes az-animex/az-animex.js | 312 + az-animex/az-animex.json | 19 + beatz-anime/beatz-anime.js | 103 + beatz-anime/beatz-anime.json | 20 + broken/videasy/videasy.js | 178 + broken/videasy/videasy.json | 19 + chireads/chireads.js | 254 + chireads/chireads.json | 19 + cinecalidad/cinecalidad.js | 247 + cinecalidad/cinecalidad.json | 19 + cksub/cksub.js | 105 + cksub/cksub.json | 19 + cloudy/cloudy.js | 214 + cloudy/cloudy.json | 19 + coflix/coflix.js | 325 + coflix/coflix.json | 19 + crimsonfansubs/crimsonfansubs.js | 116 + crimsonfansubs/crimsonfansubs.json | 19 + cuevana3/cuevana3.js | 346 ++ cuevana3/cuevana3.json | 19 + ddys/ddys.js | 82 + ddys/ddys.json | 17 + dev/dev.js | 77 + dev/dev.json | 17 + divxfilmeonline/divxfilmeonline.js | 246 + divxfilmeonline/divxfilmeonline.json | 19 + dmand5/dmand5.js | 116 + dmand5/dmand5.json | 19 + donghuastream/donghuastream.js | 117 + donghuastream/donghuastream.json | 19 + dora-video/dora-video.js | 90 + dora-video/dora-video.json | 17 + dorabash/dorabash.js | 1225 ++++ dorabash/dorabash.json | 19 + doramasyt/doramasyt.js | 307 + doramasyt/doramasyt.json | 19 + egydead (Fasel reuploader)/egydead.js | 238 + egydead (Fasel reuploader)/egydead.json | 18 + egydead/egydead.js | 273 + egydead/egydead.json | 18 + estrenosdoramas/estrenosdoramas.js | 102 + estrenosdoramas/estrenosdoramas.json | 19 + faselhd/faselhd.js | 160 + faselhd/faselhd.json | 18 + filmehd/filmehd.js | 289 + filmehd/filmehd.json | 19 + filmpalast/filmpalast.ico | Bin 0 -> 1150 bytes filmpalast/filmpalast.js | 287 + filmpalast/filmpalast.json | 19 + fireanime/FireAnimeGer.json | 17 + fireanime/FireAnimeGerDub.json | 17 + fireanime/dub.png | Bin 0 -> 30980 bytes fireanime/eng.png | Bin 0 -> 32867 bytes fireanime/fireanime.json | 17 + fireanime/sub.png | Bin 0 -> 31210 bytes fireanime/v1/FireAnimeGer.js | 130 + fireanime/v1/FireAnimeGerDub.js | 130 + fireanime/v1/fireanime.js | 130 + fireanime/v2/FireAnimeEngSub.js | 833 +++ fireanime/v2/FireAnimeGerDub.js | 834 +++ fireanime/v2/FireAnimeGerSub.js | 833 +++ flixlatam/flixlatam.js | 6574 ++++++++++++++++++++ flixlatam/flixlatam.json | 19 + franime/franime.js | 139 + franime/franime.json | 19 + funmovieslix/funmovieslix.js | 281 + funmovieslix/funmovieslix.json | 19 + gnulahd/gnulahd.js | 358 ++ gnulahd/gnulahd.json | 19 + gojowtf/gojowtf.js | 136 + gojowtf/gojowtf.json | 19 + gojowtf/gojowtf.png | Bin 0 -> 80882 bytes hdhub4u/hdhub4u.js | 158 + hdhub4u/hdhub4u.json | 19 + helioscans/helioscans.js | 232 + helioscans/helioscans.json | 19 + hianime/hianime.js | 115 + hianime/hianime.json | 18 + hianime/hianimetemp.js | 98 + hianime/hianimetemp.json | 18 + hianime/icon.png | Bin 0 -> 62544 bytes hianime/iconapp.png | Bin 0 -> 56218 bytes honadrama/honadrama.js | 124 + honadrama/honadrama.json | 18 + iyinghua/iyinghua.js | 82 + iyinghua/iyinghua.json | 18 + kaido/kaido.js | 149 + kaido/kaido.json | 19 + kawaiifu/kawaiifu.js | 169 + kawaiifu/kawaiifu.json | 19 + kawaiines/kawaiines.js | 82 + kawaiines/kawaiines.json | 19 + kimcartoon/kimcartoon.js | 115 + kimcartoon/kimcartoon.json | 17 + kissasian/kissasian.js | 222 + kissasian/kissasian.json | 19 + kisscartoon/kisscartoon.js | 121 + kisscartoon/kisscartoon.json | 20 + lmanime/lmanime.js | 115 + lmanime/lmanime.json | 19 + luciferdonghua/luciferdonghua.js | 125 + luciferdonghua/luciferdonghua.json | 19 + mavanimes/mavanimes.js | 225 + mavanimes/mavanimes.json | 19 + megakino/megakino.js | 112 + megakino/megakino.json | 19 + monoschinos2/monoschinos2.js | 333 + monoschinos2/monoschinos2.json | 19 + movi/movi.js | 102 + movi/movi.json | 19 + novelbin/novelbin.js | 198 + novelbin/novelbin.json | 19 + novelcool/novelcool.js | 160 + novelcool/novelcool.json | 18 + novelnext/novelnext.js | 219 + novelnext/novelnext.json | 19 + onlinemovieshindi/onlinemovieshindi.js | 95 + onlinemovieshindi/onlinemovieshindi.json | 17 + pelisplushd/pelisplushd.js | 6562 +++++++++++++++++++ pelisplushd/pelisplushd.json | 19 + poseidonhd2/poseidonhd2.js | 346 ++ poseidonhd2/poseidonhd2.json | 19 + prmovies/prmovies.js | 110 + prmovies/prmovies.json | 20 + readnovelfull/readnovelfull.js | 224 + readnovelfull/readnovelfull.json | 19 + readnovels/readnovels.js | 158 + readnovels/readnovels.json | 19 + s.to/sToEngDub.json | 18 + s.to/sToEngDub_v2.js | 996 +++ s.to/sToGerDub.json | 18 + s.to/sToGerDub_v2.js | 996 +++ s.to/sto.png | Bin 0 -> 51755 bytes s.to/stoalt.png | Bin 0 -> 89047 bytes shahidd4u/shahidd4u.js | 266 + shahidd4u/shahidd4u.json | 20 + soaperlive/soaperlive.js | 147 + soaperlive/soaperlive.json | 17 + sololatino/sololatino.js | 6553 +++++++++++++++++++ sololatino/sololatino.json | 19 + soundcloud/soundcloud.js | 92 + soundcloud/soundcloud.json | 16 + streamingunity/streamingunity.js | 231 + streamingunity/streamingunity.json | 17 + test/.gitkeep | 0 toonitalia/toonitalia.js | 206 + toonitalia/toonitalia.json | 20 + toontales/toontales.js | 79 + toontales/toontales.json | 20 + topstreamfilm/topstreamfilm.js | 274 + topstreamfilm/topstreamfilm.json | 20 + turkish123/turkish123.js | 109 + turkish123/turkish123.json | 17 + vegamovies/vegamovies.js | 142 + vegamovies/vegamovies.json | 19 + veranimes/veranimes.js | 334 + veranimes/veranimes.json | 19 + veziseriale/veziseriale.js | 293 + veziseriale/veziseriale.json | 19 + watchanimeworld/watchanimeworld.js | 152 + watchanimeworld/watchanimeworld.json | 19 + wikipedia/wikipedia-logo.png | Bin 0 -> 38692 bytes wikipedia/wikipedia.js | 121 + wikipedia/wikipedia.json | 17 + witanime/witanime.js | 322 + witanime/witanime.json | 20 + 276 files changed, 54396 insertions(+) create mode 100644 111477/111477.js create mode 100644 111477/111477.json create mode 100644 1movies/1movies.js create mode 100644 1movies/1movies.json create mode 100644 1tamilcrow/1tamilcrow.js create mode 100644 1tamilcrow/1tamilcrow.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 aksv/aksv.js create mode 100644 aksv/aksv.json create mode 100644 anilibria/anilibria.js create mode 100644 anilibria/anilibria.json create mode 100644 anilibria/icon.png create mode 100644 anilibria/iconalt.png create mode 100644 anime-sama/anime-sama.js create mode 100644 anime-sama/anime-sama.json create mode 100644 anime3rb/anime3rb.js create mode 100644 anime3rb/anime3rb.json create mode 100644 anime3rb/iconalt.png create mode 100644 anime4up/anime4up.js create mode 100644 anime4up/anime4up.json create mode 100644 animeav1/animeav1.js create mode 100644 animeav1/animeav1.json create mode 100644 animebalkan/animebalkan.js create mode 100644 animebalkan/animebalkan.json create mode 100644 animebalkan/iconalt.png create mode 100644 animebum/animebum.js create mode 100644 animebum/animebum.json create mode 100644 animedefenders/animedefenders.js create mode 100644 animedefenders/animedefenders.json create mode 100644 animeepisodeseries/animeepisodeseries.js create mode 100644 animeepisodeseries/animeepisodeseries.json create mode 100644 animefhd/animefhd.js create mode 100644 animefhd/animefhd.json create mode 100644 animeheaven/animeheaven.js create mode 100644 animeheaven/animeheaven.json create mode 100644 animeheaven/iconalt.png create mode 100644 animekai/dub/animekai.js create mode 100644 animekai/dub/animekai.json create mode 100644 animekai/hardsub/animekai.js create mode 100644 animekai/hardsub/animekai.json create mode 100644 animekhor/animekhor.js create mode 100644 animekhor/animekhor.json create mode 100644 animeland/animeland.js create mode 100644 animeland/animeland.json create mode 100644 animemeow/animemeow.js create mode 100644 animemeow/animemeow.json create mode 100644 animenana/animenana.js create mode 100644 animenana/animenana.json create mode 100644 animenix/animenix.js create mode 100644 animenix/animenix.json create mode 100644 animenosub/animenosub.js create mode 100644 animenosub/animenosub.json create mode 100644 animeq/animeq.js create mode 100644 animeq/animeq.json create mode 100644 animesaturn/animesaturn.js create mode 100644 animesaturn/animesaturn.json create mode 100644 animesdigital/animesdigital.js create mode 100644 animesdigital/animesdigital.json create mode 100644 animesdrive/animesdrive.js create mode 100644 animesdrive/animesdrive.json create mode 100644 animesonline/animesonline.js create mode 100644 animesonline/animesonline.json create mode 100644 animesrbija/animesrbija.js create mode 100644 animesrbija/animesrbija.json create mode 100644 animesrbija/iconalt.png create mode 100644 animesroll/animesroll.js create mode 100644 animesroll/animesroll.json create mode 100644 animetoast/animetoast.js create mode 100644 animetoast/animetoast.json create mode 100644 animetoast/animetoast_v2.js create mode 100644 animeunity/animeunity.js create mode 100644 animeunity/animeuntiy.json create mode 100644 animeunity/iconalt.png create mode 100644 animeworld/animeworld.js create mode 100644 animeworld/animeworld.json create mode 100644 animeworld/iconalt.png create mode 100644 animexin/animexin.js create mode 100644 animexin/animexin.json create mode 100644 animeytx/animeytx.js create mode 100644 animeytx/animeytx.json create mode 100644 anitube/anitube.js create mode 100644 anitube/anitube.json create mode 100644 aniworld/AniWorldEngSub.json create mode 100644 aniworld/AniWorldGerDub.dev.json create mode 100644 aniworld/AniWorldGerDub.json create mode 100644 aniworld/AniWorldGerSub.json create mode 100644 aniworld/aniworld.png create mode 100644 aniworld/icon.png create mode 100644 aniworld/iconSub.png create mode 100644 aniworld/iconSubEng.png create mode 100644 aniworld/v1/AniWorldEngSub.js create mode 100644 aniworld/v1/AniWorldGerDub.js create mode 100644 aniworld/v1/AniWorldGerSub.js create mode 100644 aniworld/v2/AniWorldEngSub_v2.js create mode 100644 aniworld/v2/AniWorldGerDub_v2.js create mode 100644 aniworld/v2/AniWorldGerSub_v2.js create mode 100644 anoboye/anoboye.js create mode 100644 anoboye/anoboye.json create mode 100644 arablionz/arablionz.js create mode 100644 arablionz/arablionz.json create mode 100644 arabseed/arabseed.js create mode 100644 arabseed/arabseed.json create mode 100644 ashi/ashi.js create mode 100644 ashi/ashi.json create mode 100644 asia2tv/asia2tv.js create mode 100644 asia2tv/asia2tv.json create mode 100644 asialiveaction/asialiveaction.js create mode 100644 asialiveaction/asialiveaction.json create mode 100644 asset.png create mode 100644 az-animex/az-animex.js create mode 100644 az-animex/az-animex.json create mode 100644 beatz-anime/beatz-anime.js create mode 100644 beatz-anime/beatz-anime.json create mode 100644 broken/videasy/videasy.js create mode 100644 broken/videasy/videasy.json create mode 100644 chireads/chireads.js create mode 100644 chireads/chireads.json create mode 100644 cinecalidad/cinecalidad.js create mode 100644 cinecalidad/cinecalidad.json create mode 100644 cksub/cksub.js create mode 100644 cksub/cksub.json create mode 100644 cloudy/cloudy.js create mode 100644 cloudy/cloudy.json create mode 100644 coflix/coflix.js create mode 100644 coflix/coflix.json create mode 100644 crimsonfansubs/crimsonfansubs.js create mode 100644 crimsonfansubs/crimsonfansubs.json create mode 100644 cuevana3/cuevana3.js create mode 100644 cuevana3/cuevana3.json create mode 100644 ddys/ddys.js create mode 100644 ddys/ddys.json create mode 100644 dev/dev.js create mode 100644 dev/dev.json create mode 100644 divxfilmeonline/divxfilmeonline.js create mode 100644 divxfilmeonline/divxfilmeonline.json create mode 100644 dmand5/dmand5.js create mode 100644 dmand5/dmand5.json create mode 100644 donghuastream/donghuastream.js create mode 100644 donghuastream/donghuastream.json create mode 100644 dora-video/dora-video.js create mode 100644 dora-video/dora-video.json create mode 100644 dorabash/dorabash.js create mode 100644 dorabash/dorabash.json create mode 100644 doramasyt/doramasyt.js create mode 100644 doramasyt/doramasyt.json create mode 100644 egydead (Fasel reuploader)/egydead.js create mode 100644 egydead (Fasel reuploader)/egydead.json create mode 100644 egydead/egydead.js create mode 100644 egydead/egydead.json create mode 100644 estrenosdoramas/estrenosdoramas.js create mode 100644 estrenosdoramas/estrenosdoramas.json create mode 100644 faselhd/faselhd.js create mode 100644 faselhd/faselhd.json create mode 100644 filmehd/filmehd.js create mode 100644 filmehd/filmehd.json create mode 100644 filmpalast/filmpalast.ico create mode 100644 filmpalast/filmpalast.js create mode 100644 filmpalast/filmpalast.json create mode 100644 fireanime/FireAnimeGer.json create mode 100644 fireanime/FireAnimeGerDub.json create mode 100644 fireanime/dub.png create mode 100644 fireanime/eng.png create mode 100644 fireanime/fireanime.json create mode 100644 fireanime/sub.png create mode 100644 fireanime/v1/FireAnimeGer.js create mode 100644 fireanime/v1/FireAnimeGerDub.js create mode 100644 fireanime/v1/fireanime.js create mode 100644 fireanime/v2/FireAnimeEngSub.js create mode 100644 fireanime/v2/FireAnimeGerDub.js create mode 100644 fireanime/v2/FireAnimeGerSub.js create mode 100644 flixlatam/flixlatam.js create mode 100644 flixlatam/flixlatam.json create mode 100644 franime/franime.js create mode 100644 franime/franime.json create mode 100644 funmovieslix/funmovieslix.js create mode 100644 funmovieslix/funmovieslix.json create mode 100644 gnulahd/gnulahd.js create mode 100644 gnulahd/gnulahd.json create mode 100644 gojowtf/gojowtf.js create mode 100644 gojowtf/gojowtf.json create mode 100644 gojowtf/gojowtf.png create mode 100644 hdhub4u/hdhub4u.js create mode 100644 hdhub4u/hdhub4u.json create mode 100644 helioscans/helioscans.js create mode 100644 helioscans/helioscans.json create mode 100644 hianime/hianime.js create mode 100644 hianime/hianime.json create mode 100644 hianime/hianimetemp.js create mode 100644 hianime/hianimetemp.json create mode 100644 hianime/icon.png create mode 100644 hianime/iconapp.png create mode 100644 honadrama/honadrama.js create mode 100644 honadrama/honadrama.json create mode 100644 iyinghua/iyinghua.js create mode 100644 iyinghua/iyinghua.json create mode 100644 kaido/kaido.js create mode 100644 kaido/kaido.json create mode 100644 kawaiifu/kawaiifu.js create mode 100644 kawaiifu/kawaiifu.json create mode 100644 kawaiines/kawaiines.js create mode 100644 kawaiines/kawaiines.json create mode 100644 kimcartoon/kimcartoon.js create mode 100644 kimcartoon/kimcartoon.json create mode 100644 kissasian/kissasian.js create mode 100644 kissasian/kissasian.json create mode 100644 kisscartoon/kisscartoon.js create mode 100644 kisscartoon/kisscartoon.json create mode 100644 lmanime/lmanime.js create mode 100644 lmanime/lmanime.json create mode 100644 luciferdonghua/luciferdonghua.js create mode 100644 luciferdonghua/luciferdonghua.json create mode 100644 mavanimes/mavanimes.js create mode 100644 mavanimes/mavanimes.json create mode 100644 megakino/megakino.js create mode 100644 megakino/megakino.json create mode 100644 monoschinos2/monoschinos2.js create mode 100644 monoschinos2/monoschinos2.json create mode 100644 movi/movi.js create mode 100644 movi/movi.json create mode 100644 novelbin/novelbin.js create mode 100644 novelbin/novelbin.json create mode 100644 novelcool/novelcool.js create mode 100644 novelcool/novelcool.json create mode 100644 novelnext/novelnext.js create mode 100644 novelnext/novelnext.json create mode 100644 onlinemovieshindi/onlinemovieshindi.js create mode 100644 onlinemovieshindi/onlinemovieshindi.json create mode 100644 pelisplushd/pelisplushd.js create mode 100644 pelisplushd/pelisplushd.json create mode 100644 poseidonhd2/poseidonhd2.js create mode 100644 poseidonhd2/poseidonhd2.json create mode 100644 prmovies/prmovies.js create mode 100644 prmovies/prmovies.json create mode 100644 readnovelfull/readnovelfull.js create mode 100644 readnovelfull/readnovelfull.json create mode 100644 readnovels/readnovels.js create mode 100644 readnovels/readnovels.json create mode 100644 s.to/sToEngDub.json create mode 100644 s.to/sToEngDub_v2.js create mode 100644 s.to/sToGerDub.json create mode 100644 s.to/sToGerDub_v2.js create mode 100644 s.to/sto.png create mode 100644 s.to/stoalt.png create mode 100644 shahidd4u/shahidd4u.js create mode 100644 shahidd4u/shahidd4u.json create mode 100644 soaperlive/soaperlive.js create mode 100644 soaperlive/soaperlive.json create mode 100644 sololatino/sololatino.js create mode 100644 sololatino/sololatino.json create mode 100644 soundcloud/soundcloud.js create mode 100644 soundcloud/soundcloud.json create mode 100644 streamingunity/streamingunity.js create mode 100644 streamingunity/streamingunity.json create mode 100644 test/.gitkeep create mode 100644 toonitalia/toonitalia.js create mode 100644 toonitalia/toonitalia.json create mode 100644 toontales/toontales.js create mode 100644 toontales/toontales.json create mode 100644 topstreamfilm/topstreamfilm.js create mode 100644 topstreamfilm/topstreamfilm.json create mode 100644 turkish123/turkish123.js create mode 100644 turkish123/turkish123.json create mode 100644 vegamovies/vegamovies.js create mode 100644 vegamovies/vegamovies.json create mode 100644 veranimes/veranimes.js create mode 100644 veranimes/veranimes.json create mode 100644 veziseriale/veziseriale.js create mode 100644 veziseriale/veziseriale.json create mode 100644 watchanimeworld/watchanimeworld.js create mode 100644 watchanimeworld/watchanimeworld.json create mode 100644 wikipedia/wikipedia-logo.png create mode 100644 wikipedia/wikipedia.js create mode 100644 wikipedia/wikipedia.json create mode 100644 witanime/witanime.js create mode 100644 witanime/witanime.json diff --git a/111477/111477.js b/111477/111477.js new file mode 100644 index 0000000..ef99b11 --- /dev/null +++ b/111477/111477.js @@ -0,0 +1,229 @@ +async function searchResults(keyword) { + const results = []; + const image = 'https://files.catbox.moe/9tbjtb.png'; + const regex = /([^<]+)<\/a><\/td>]*>[^<]*<\/td><\/tr>/g; + + const urls = [ + 'https://a.111477.xyz/tvs/', + 'https://a.111477.xyz/movies/', + 'https://a.111477.xyz/kdrama/', + 'https://a.111477.xyz/asiandrama/' + ]; + + for (const url of urls) { + const response = await fetchv2(url); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + const rawTitle = match[2].trim().replace(/\/$/, ''); + const cleanedTitle = rawTitle.replace(/\.+/g, ' ').toLowerCase(); + + if (cleanedTitle.includes(keyword.toLowerCase())) { + results.push({ + title: rawTitle.replace(/\.+/g, ' '), + image, + href: url + match[1].trim() + }); + } + } + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + + results.push({ + description: 'None provided, but hell who cares anyway', + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const episodeRegex = /([^<]+\.mkv)<\/a><\/td>/g; + let match; + let count = 1; + + while ((match = episodeRegex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: count++ + }); + } + + if (results.length > 0) { + return JSON.stringify([{ + href: url, + number: 1 + }]); + } + if (results.length === 0) { + const seasonRegex = /]*>([^<]+\/)<\/a><\/td>/g; + const seasons = []; + + while ((match = seasonRegex.exec(html)) !== null) { + const seasonHref = match[1].trim(); + const seasonName = match[2].trim(); + + if (seasonHref === '../' || seasonName === '../') continue; + + const isSeasonDir = ( + /season\s*\d+/i.test(seasonName) || + /s\d+/i.test(seasonName) || + /series\s*\d+/i.test(seasonName) || + /specials/i.test(seasonName) || + /extras/i.test(seasonName) || + /bonus/i.test(seasonName) || + (/\d+/.test(seasonName) && seasonName.endsWith('/')) + ); + + if (isSeasonDir) { + seasons.push({ + href: seasonHref, + name: seasonName + }); + } + } + + seasons.sort((a, b) => { + const aNum = extractSeasonNumber(a.name); + const bNum = extractSeasonNumber(b.name); + + if (aNum === null && bNum === null) return a.name.localeCompare(b.name); + if (aNum === null) return 1; + if (bNum === null) return -1; + + return aNum - bNum; + }); + + console.log(`Found ${seasons.length} seasons:`, seasons.map(s => s.name)); + console.log(`Base URL: "${url}"`); + console.log(`Base URL ends with /: ${url.endsWith('/')}`); + + + for (const season of seasons) { + console.log(`Processing season: ${season.name}`); + console.log(`Season href: "${season.href}"`); + + let seasonUrl; + if (season.href.startsWith('http')) { + seasonUrl = season.href; + } else { + const baseUrl = url.endsWith('/') ? url : url + '/'; + seasonUrl = baseUrl + season.href; + } + + console.log(`Season URL: "${seasonUrl}"`); + console.log(`URL encoded version: "${encodeURI(seasonUrl)}"`); + + try { + const seasonResponse = await fetchv2(decodeURIComponent(seasonUrl)); + const seasonHtml = await seasonResponse.text(); + + console.log(`Sample HTML from ${season.name}:`, seasonHtml.substring(0, 500)); + + let episodeCount = 1; + + const seasonEpisodeRegex = /]*>([^<]+\.mkv)<\/a>/g; + let seasonMatch; + let episodesInSeason = 0; + + while ((seasonMatch = seasonEpisodeRegex.exec(seasonHtml)) !== null) { + let episodeHref = seasonMatch[1].trim(); + + if (!episodeHref.startsWith('http')) { + episodeHref = seasonUrl.endsWith('/') ? seasonUrl + episodeHref : seasonUrl + '/' + episodeHref; + } + + results.push({ + href: episodeHref, + number: episodeCount++, + season: season.name.replace('/', '') + }); + episodesInSeason++; + } + + console.log(`Found ${episodesInSeason} episodes in ${season.name}`); + + } catch (error) { + console.warn(`Failed to fetch season ${season.name}:`, error); + console.warn(`Season URL was: ${seasonUrl}`); + } + } + } + + return JSON.stringify(results); +} + +function extractSeasonNumber(seasonName) { + const patterns = [ + /season\s*(\d+)/i, + /s(\d+)/i, + /series\s*(\d+)/i, + /(\d+)/ + ]; + + for (const pattern of patterns) { + const match = seasonName.match(pattern); + if (match) { + return parseInt(match[1], 10); + } + } + + return null; +} + + +async function extractStreamUrl(url) { + if (url.toLowerCase().endsWith('.mkv')) { + const filename = url.split('/').pop(); + + const final = { + streams: [filename, url], + subtitles: "" + }; + + console.log("RETURN: " + JSON.stringify(final)); + return JSON.stringify(final); + } + + try { + const response = await fetchv2(decodeURIComponent(url)); + const html = await response.text(); + + const mkvRegex = /]*>([^<]+\.mkv)<\/a><\/td>/g; + const streams = []; + let match; + + while ((match = mkvRegex.exec(html)) !== null) { + const mkvUrl = match[1].trim(); + const filename = match[2].trim(); + + streams.push(filename, mkvUrl); + } + + const final = { + streams, + subtitles: "" + }; + + console.log("RETURN: " + JSON.stringify(final)); + return "JSON.stringify(final)"; + + } catch (error) { + console.log("Error in extractStreamUrl:", error); + return JSON.stringify({ + streams: [], + subtitles: "" + }); + } +} diff --git a/111477/111477.json b/111477/111477.json new file mode 100644 index 0000000..9bf5032 --- /dev/null +++ b/111477/111477.json @@ -0,0 +1,20 @@ +{ + "sourceName": "111477", + "iconUrl": "https://media.tenor.com/tIOhF5a8McEAAAAe/heart-emoji-love-nonchalant.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Multi Language", + "streamType": "MKV", + "quality": "1080p", + "baseUrl": "https://a.111477.xyz/", + "searchBaseUrl": "https://a.111477.xyz/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/111477/111477.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": true, + "downloadSupport": true, + "note": "USE AN EXTERNAL PLAYER (E.G., VLC/MPV)" +} diff --git a/1movies/1movies.js b/1movies/1movies.js new file mode 100644 index 0000000..6433586 --- /dev/null +++ b/1movies/1movies.js @@ -0,0 +1,286 @@ +async function searchResults(query) { + const encodeQuery = keyword => encodeURIComponent(keyword); + const searchBaseUrl = "https://1movies.bz/browser?keyword="; + const baseUrl = "https://1movies.bz"; + + const posterHrefRegex = /href="([^"]*)" class="poster"/g; + const titleRegex = /class="title" href="[^"]*">([^<]*) { + const results = []; + const posterMatches = [...htmlText.matchAll(posterHrefRegex)]; + const titleMatches = [...htmlText.matchAll(titleRegex)]; + const imageMatches = [...htmlText.matchAll(imageRegex)]; + + const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); + + for (let index = 0; index < minLength; index++) { + const href = posterMatches[index][1]; + const fullHref = href.startsWith("http") ? href : baseUrl + href; + + const imageSrc = imageMatches[index][1]; + + const title = titleMatches[index][1]; + const cleanTitle = decodeHtmlEntities(title); + + if (fullHref && imageSrc && cleanTitle) { + results.push({ + href: fullHref, + image: imageSrc, + title: cleanTitle + }); + } + } + return results; + }; + + try { + const encodedQuery = encodeQuery(query); + + const urls = [ + `${searchBaseUrl}${encodedQuery}`, + `${searchBaseUrl}${encodedQuery}&page=2`, + `${searchBaseUrl}${encodedQuery}&page=3` + ]; + + const responses = await Promise.all(urls.map(url => fetchv2(url))); + + const htmlTexts = await Promise.all(responses.map(response => response.text())); + + const allResults = []; + htmlTexts.forEach(htmlText => { + const pageResults = extractResultsFromHTML(htmlText); + allResults.push(...pageResults); + }); + + return JSON.stringify(allResults); + } catch (error) { + return JSON.stringify([{ + href: "", + image: "", + title: "Search failed: " + error.message + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const htmlText = await response.text(); + + const descriptionMatch = (/
([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; + const aliasesMatch = (/([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; + const airdateMatch = (/
  • Released:\s*]*>(.*?)<\/span>/.exec(htmlText) || [])[1]; + + return JSON.stringify([{ + description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", + aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not aliases", + airdate: airdateMatch ? cleanHtmlSymbols(airdateMatch) : "Not available" + }]); + } catch (error) { + console.error("Error fetching details:" + error); + return [{ + description: "Error loading description", + aliases: "Not available", + airdate: "Not available" + }]; + } +} + +async function extractEpisodes(movieUrl) { + try { + const response = await fetchv2(movieUrl); + const htmlText = await response.text(); + const movieIDMatch = (htmlText.match(/
    ]*id="movie-rating"[^>]*data-id="([^"]+)"/) || [])[1]; + if (!movieIDMatch) { + return [{ + error: "MovieID not found" + }]; + } + const movieData = [{ name: "MovieID", data: movieIDMatch }]; + const tokenResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/ilovethighs", + {}, + "POST", + JSON.stringify(movieData) + ); + const temp = await tokenResponse.json(); + const token = temp[0]?.data; + const episodeListUrl = `https://1movies.bz/ajax/episodes/list?id=${movieIDMatch}&_=${token}`; + const episodeListResponse = await fetchv2(episodeListUrl); + const episodeListData = await episodeListResponse.json(); + const cleanedHtml = cleanJsonHtml(episodeListData.result); + + const episodeRegex = /]+eid="([^"]+)"[^>]+num="([^"]+)"[^>]*>/g; + const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; + + const episodeData = episodeMatches.map(([_, episodeToken, episodeNum]) => ({ + name: `Episode ${episodeNum}`, + data: episodeToken + })); + + console.log(JSON.stringify(episodeData)); + const batchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/ilovethighs", + {}, + "POST", + JSON.stringify(episodeData) + ); + const batchResults = await batchResponse.json(); + + const episodes = batchResults.map((result, index) => ({ + number: parseInt(episodeMatches[index][2], 10), + href: `https://1movies.bz/ajax/links/list?eid=${episodeMatches[index][1]}&_=${result.data}` + })); + + return JSON.stringify(episodes); + } catch (err) { + console.error("Error fetching episodes:" + err); + return [{ + number: 1, + href: "Error fetching episodes" + }]; + } +} + +async function extractStreamUrl(url) { + try { + const fetchUrl = `${url}`; + const response = await fetchv2(fetchUrl); + const responseData = await response.json(); + const cleanedHtml = cleanJsonHtml(responseData.result); + + const server1Regex = /
    ]*data-lid="([^"]+)"[^>]*>\s*Server 1<\/span>/; + const server1Match = server1Regex.exec(cleanedHtml); + + if (!server1Match) { + console.log("Server 1 not found"); + return "error"; + } + + const serverId = server1Match[1]; + + const tokenRequestData = [{ name: "Server1", data: serverId }]; + + const tokenBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/ilovethighs", + {}, + "POST", + JSON.stringify(tokenRequestData) + ); + const tokenResults = await tokenBatchResponse.json(); + const token = tokenResults[0]?.data; + + if (!token) { + console.log("Token not found"); + return "error"; + } + + const streamUrl = `https://1movies.bz/ajax/links/view?id=${serverId}&_=${token}`; + const streamResponse = await fetchv2(streamUrl); + const streamData = await streamResponse.json(); + + if (!streamData.result) { + console.log("Stream result not found"); + return "error"; + } + + const decryptRequestData = [{ name: "Server1", data: streamData.result }]; + + const decryptBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/iloveboobs", + {}, + "POST", + JSON.stringify(decryptRequestData) + ); + const decryptedResponse = await decryptBatchResponse.json(); + const decryptedUrl = decryptedResponse[0]?.data.url; + + const subListEncoded = decryptedUrl.split("sub.list=")[1]?.split("&")[0]; + const subListUrl = decodeURIComponent(subListEncoded); + + const subResponse = await fetchv2(subListUrl); + const subtitles = await subResponse.json(); + + const englishSubUrl = subtitles.find(sub => sub.label === "English")?.file.replace(/\\\//g, "/"); + + if (!decryptedUrl) { + console.log("Decryption failed"); + return "error"; + } + + const headers = { + "Referer": "https://1movies.bz/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + }; + + const mediaResponse = await fetchv2(decryptedUrl.replace("/e/", "/media/"), headers); + const mediaJson = await mediaResponse.json(); + + const result = mediaJson?.result; + if (!result) { + console.log("Media result not found"); + return "error"; + } + + const postData = { + "text": result, + "Useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + }; + + const finalResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/ilovebush", {}, "POST", JSON.stringify(postData)); + const finalJson = await finalResponse.json(); + + const m3u8Link = finalJson?.result?.sources?.[0]?.file; + + const returnValue = { + stream: m3u8Link, + subtitles: englishSubUrl + }; + console.log(JSON.stringify(returnValue)); + return JSON.stringify(returnValue); + } catch (error) { + console.log("Fetch error:"+ error); + return "https://error.org"; + } +} + +function cleanHtmlSymbols(string) { + if (!string) { + return ""; + } + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function cleanJsonHtml(jsonHtml) { + if (!jsonHtml) { + return ""; + } + return jsonHtml + .replace(/\\"/g, "\"") + .replace(/\\'/g, "'") + .replace(/\\\\/g, "\\") + .replace(/\\n/g, "\n") + .replace(/\\t/g, "\t") + .replace(/\\r/g, "\r"); +} + +function decodeHtmlEntities(text) { + if (!text) { + return ""; + } + return text + .replace(/'/g, "'") + .replace(/"/g, "\"") + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/ /g, " "); +} diff --git a/1movies/1movies.json b/1movies/1movies.json new file mode 100644 index 0000000..3108327 --- /dev/null +++ b/1movies/1movies.json @@ -0,0 +1,19 @@ +{ + "sourceName": "1Movies", + "iconUrl": "https://1movies.bz/assets/uploads/675b5c22f2829fc8e3a4030af7f4284acad017e5241280b3dc21.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.5", + "language": "English", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animekai.to/", + "searchBaseUrl": "https://1movies.bz/home", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/1movies/1movies.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": true, + "downloadSupport": true +} diff --git a/1tamilcrow/1tamilcrow.js b/1tamilcrow/1tamilcrow.js new file mode 100644 index 0000000..857cfbb --- /dev/null +++ b/1tamilcrow/1tamilcrow.js @@ -0,0 +1,225 @@ +async function searchResults(keyword) { + const results = []; + const regex = /
    ]*>\s*([^<]+)\s*<\/a>/g; + + try { + const response = await fetchv2("https://www.1tamilcrow.net/?s=" + keyword); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[2].trim(), + title: decodeHtml(match[3].trim()), + image: match[1] ? match[1].trim() : "No Image" + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +function decodeHtml(str) { + return str + .replace(/&/g, "&") + .replace(/’/g, "’") + .replace(/"/g, "\"") + .replace(/'/g, "'") + .replace(/</g, "<") + .replace(/>/g, ">"); +} + + +async function extractDetails(url) { + try { + return JSON.stringify([{ + description: "No description on the website", + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + console.log(html); + const regex = /]*SRC="(https:\/\/(?:videospk|vidhidevip)[^"]+)"[^>]*>/; + const match = html.match(regex); + + if (match) { + results.push({ + href: match[1].trim(), + number: 1 + }); + } else { + results.push({ + href: url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const obfuscatedScript = html.match(/]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + const unpackedScript = unpack(obfuscatedScript[1]); + + const streamMatch = unpackedScript.match(/["'](\/stream\/[^"']+)["']/); + const hlsLink = streamMatch ? streamMatch[1] : null; + + const baseUrl = url.match(/^(https?:\/\/[^/]+)/)[1]; + + console.log("HLS Link:" + hlsLink); + + return baseUrl + hlsLink; + } catch (err) { + console.log(err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} diff --git a/1tamilcrow/1tamilcrow.json b/1tamilcrow/1tamilcrow.json new file mode 100644 index 0000000..46f359e --- /dev/null +++ b/1tamilcrow/1tamilcrow.json @@ -0,0 +1,19 @@ +{ + "sourceName": "1TamilCrow", + "iconUrl": "https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img/https://www.1tamilcrow.net/wp-content/uploads/2020/09/Tamil-Crow-e1600735514979.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Tamil", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.1tamilcrow.net/", + "searchBaseUrl": "https://www.1tamilcrow.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/1tamilcrow/1tamilcrow.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f523942 --- /dev/null +++ b/LICENSE @@ -0,0 +1,32 @@ +License + +Copyright (c) 2025, 50/50 +All rights reserved. + +This software module is primarily licensed for use within the Sora/Sulfur iOS application(https://github.com/cranci1/Sora), developed by cranc1. +It may also be freely used in other projects, provided they meet the criteria outlined below. + +LICENSE TERMS + +1. Permitted Use +- This software may be used as part of the official Sora or Sulfur iOS applications. +- It may also be used in open-source applications that are: + - Free to download and use this software (no paywall, subscription, or purchase required) + - Without advertisements during the usage of this software + - Released under an open-source license +- All three of the above requirements are mandatory unless explicit written permission has been granted by the copyright holder to an application that does not meet one or more of them. + +2. Prohibited Use +- Redistribution, reproduction, or sublicensing of this software as a standalone module is not allowed +- Use in proprietary, closed-source, paid, or ad-supported software is strictly prohibited +- Commercial use of this software in any form is forbidden + +3. Access & Agreement +- By accessing, downloading, or using any portion of this repository, you acknowledge and agree to abide by these terms +- Unauthorized use or distribution may result in legal action + +--- + +This license does not grant any rights under patent, trademark, or other intellectual property laws beyond those explicitly stated above. + +Note: License terms may change over time. It is your responsibility to review the latest version periodically. diff --git a/README.md b/README.md new file mode 100644 index 0000000..270b042 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +
    + +
    +

    ⚠️ IMPORTANT

    +

    Any app meeting the following criteria is free to use my modules:

    +
      +
    1. No paywall, subscription, or payment required for my modules + (you may charge for other parts of your app).
    2. +
    3. No advertisements during the usage of my modules.
    4. +
    5. Open source: your app’s source code must be publicly available.
    6. +
    +

    All the above terms are mandatory unless given permission by me.
    +In short: no commercial use and transparency is required.

    +
    + +
    + +
    +

    🚫 CAUTION

    +

    Do not pay to use these modules — if someone is charging you, it's a scam.

    +

    Neither should you bear watching ads to use these modules. Please report apps that do this forcibly!

    +
    + +
    + +
    + +[![Discord Presence](https://lanyard.cnrad.dev/api/1072985316916469870?theme=dark&bg=000000&animated=false&hideDiscrim=true&borderRadius=30px&idleMessage=For%20requests%20go%20to%20Sora%20server,%20for%20questions%20about%20using%20my%20modules%20in%20your%20app%20DM%20me.%20If%20a%20module%20is%20broken%20go%20to%20Sora%20server%20or%20open%20a%20GitHub%20issue.)](https://discord.com/users/1072985316916469870) + +
    + +[![Ko-fi](https://img.shields.io/badge/support_me_on_ko--fi-F16061?style=for-the-badge&logo=kofi&logoColor=f5f5f5)](https://ko-fi.com/50n50) + +
    +
    + diff --git a/aksv/aksv.js b/aksv/aksv.js new file mode 100644 index 0000000..3a2402d --- /dev/null +++ b/aksv/aksv.js @@ -0,0 +1,181 @@ +async function searchResults(keyword) { + const results = []; + + const response = await fetchv2("https://ak.sv/search?q=" + encodeURIComponent(keyword)); + const html = await response.text(); + const filmListRegex = /
    [\s\S]*?<\/div>\s*<\/div>/g; + const items = html.match(filmListRegex) || []; + + items.forEach((itemHtml) => { + const titleMatch = itemHtml.match(/

    ]*>([^<]+)<\/a>/); + const href = titleMatch ? titleMatch[1] : ''; + const title = titleMatch ? titleMatch[2] : ''; + const imgMatch = itemHtml.match(/]*data-src="([^"]+)"[^>]*>/); + const imageUrl = imgMatch ? imgMatch[1] : ''; + + if (title && href) { + results.push({ + title: title.trim(), + image: imageUrl.trim(), + href: href.trim(), + }); + } + }); + console.log(results); + return JSON.stringify(results); +} + +async function extractDetails(url) { + const details = []; + let description = 'N/A'; + let aliases = 'N/A'; + let airdate = 'N/A'; + const genres = []; + const response = await fetch(url); + const html = await response.text(); + const airdateMatch = html.match( + /
    \s*\s*السنة\s*:\s*(\d{4})\s*<\/span>\s*<\/div>/ + ); + if (airdateMatch) airdate = airdateMatch[1]; + + const descriptionMatch = html.match( + /
    ]*>[\s\S]*?

    ([\s\S]*?)<\/p>/ + ); + if (descriptionMatch) { + description = decodeHTMLEntities(descriptionMatch[1].replace(/<[^>]+>/g, '').trim()); + } + + const genresMatch = html.match(/

    ([\s\S]*?)<\/div>/); + const genresHtml = genresMatch ? genresMatch[1] : ''; + + const genreAnchorRe = /]*>([^<]+)<\/a>/g; + let genreMatch; + while ((genreMatch = genreAnchorRe.exec(genresHtml)) !== null) { + genres.push(decodeHTMLEntities(genreMatch[1].trim())); + } + + details.push({ + description: description, + airdate: airdate, + aliases: genres.join(', ') || 'N/A' + }); + + console.log(details); + return JSON.stringify(details); +} + +async function extractEpisodes(url) { + const episodes = []; + const response = await fetchv2(url); + const html = await response.text(); + const movieRegex = /]+href=["']([^"']+)["'][^>]+class=["'][^"']*link-btn link-show[^"']*["'][^>]*>/i; + const movieMatch = movieRegex.exec(html); + + if (movieMatch && movieMatch[1]) { + episodes.push({ + href: movieMatch[1], + number: 1 + }); + } else { + const reversedHtml = html.split('\n').reverse().join('\n'); + + const episodeBlocks = reversedHtml.match(/
    [\s\S]*?]*>[\s\S]*?<\/a>/g); + + if (episodeBlocks) { + episodeBlocks.forEach((block, index) => { + const hrefMatch = block.match(/href=["']([^"']+)["']/); + if (hrefMatch) { + episodes.push({ + href: hrefMatch[1], + number: index + 1 + }); + } + }); + } + } + + console.log(JSON.stringify(episodes)); + return JSON.stringify(episodes); +} + +async function extractStreamUrl(url) { + let stream = null; + const response = await fetchv2(url); + const html = await response.text(); + const urlMatch = html.match(/]*class="link-btn link-show[^"]*"[^>]*>[\s\S]*?<\/a>/g); + let match = null; + + if (linkBtnMatches && linkBtnMatches.length > 0) { + const hrefMatch = linkBtnMatches[0].match(/href="([^"]+)"/); + if (hrefMatch && hrefMatch[1]) { + match = [null, hrefMatch[1]]; + } + } + + if (match && match[1]) { + try { + const shortnerResponse = await fetch(match[1]); + const shortnerHtml = await shortnerResponse; + + const finalMatch = shortnerHtml.match(/
    \s*\s* String.fromCharCode(dec)); + + const entities = { + '"': '"', + '&': '&', + ''': "'", + '<': '<', + '>': '>' + }; + + for (const entity in entities) { + text = text.replace(new RegExp(entity, 'g'), entities[entity]); + } + + return text; +} diff --git a/aksv/aksv.json b/aksv/aksv.json new file mode 100644 index 0000000..b871642 --- /dev/null +++ b/aksv/aksv.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AK.SV", + "iconUrl": "https://i.ibb.co/fdyjNhkb/icon-number-255763.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.5", + "language": "Arabic (SUB)", + "streamType": "MP4", + "quality": "1080p", + "baseUrl": "https://ak.sv/", + "searchBaseUrl": "https://ak.sv/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/aksv/aksv.js", + "asyncJS": true, + "type": "movies/shows" +} diff --git a/anilibria/anilibria.js b/anilibria/anilibria.js new file mode 100644 index 0000000..fb1431f --- /dev/null +++ b/anilibria/anilibria.js @@ -0,0 +1,70 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetch(`https://api.anilibria.tv/v3/title/search?search=${encodedKeyword}&filter=id,names,posters`); + const data = JSON.parse(responseText); + + const transformedResults = data.list.map(anime => ({ + title: anime.names.en || anime.names.ru || 'Unknown Title', + image: `https://anilibria.tv${anime.posters.original.url}`, + href: `${anime.id}` + })); + + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + + +async function extractDetails(id) { + try { + const response = await fetch(`https://api.anilibria.tv/v3/title?id=${id}&filter=description`); + const data = JSON.parse(response); + + const animeInfo = data; + + const transformedResults = [{ + description: animeInfo.description || 'No description available', + aliases: `Alias: Unknown`, + airdate: `Aired: Unknown` + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(id) { + try { + const response = await fetch(`https://api.anilibria.tv/v3/title?id=${id}`); + const data = JSON.parse(response); + + const transformedResults = Object.values(data.player.list).map(episode => ({ + href: `https://cache.libria.fun${episode.hls.hd}`, + number: episode.episode + })); + + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Fetch error:', error); + } +} + +async function extractStreamUrl(url) { + try { + return url; + } catch (error) { + console.log('Fetch error:', error); + return null; + } +} diff --git a/anilibria/anilibria.json b/anilibria/anilibria.json new file mode 100644 index 0000000..5836cb6 --- /dev/null +++ b/anilibria/anilibria.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AniLibria", + "iconUrl": "https://github.com/50n50/sources/blob/main/anilibria/icon.png?raw=true", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Russian", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://api.anilibria.tv/", + "searchBaseUrl": "https://api.anilibria.tv/v3/title/search?search=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/anilibria/anilibria.js", + "asyncJS": true, + "type": "anime" +} diff --git a/anilibria/icon.png b/anilibria/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f12000c4c8d5ee16511b5cd3c470bca03fa9fcfa GIT binary patch literal 17556 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 literal 0 HcmV?d00001 diff --git a/anilibria/iconalt.png b/anilibria/iconalt.png new file mode 100644 index 0000000000000000000000000000000000000000..b15e0a8201eaf1b02af77b76d485fdbb7bffd040 GIT binary patch literal 78255 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 z zF>D|GR!YWw5j~FEk;TZwcd|)1Ly+gRC-pme4T>N=@4k9|!R^8NIOM$|j4x|ps?k-~ zX^~m6o%4b-{Y@9iHyKH1nz8uK+B)!UAYV42lu|vbSOx>`&WMs))h;eal~Noju|8u`6j-8bp#j!EnCtJk7~(F|3LSAZh|xD z7waUNUObtjmPr6V4>!)<+*zAN5JbKSjJ^Ymet~xbqu<^?c7B2o15_QAHQ}evx~i}CsU8nW0>$Qv6HtiC1V4A;J4p9Uo?)AZM@+f>n13Jsu%3_AxLPO* z+~{CubBU2!od<0@oc?FQQ-m7!W!jBfsLq;JVW3o+^3!8|wI6 z--ZXp^G@H7Ieqdz)x9@5K)M_^kFkT~S>Nw{ntMMo^^5l$@ph*Nq%d__KwR)2lqjlA ze@Jo@Fpo_15{CVb1X45Xhm(I0TCObGyqr^UvBhui76dkyUoVTf9RX-vZ!WotIm_;s z=Q#Ut%x&bNBqUVngJbu!${2N-{amWQS)ipGo90_8plK%4ISGVCL&<@MAPYg|0f#1nTPAtb=q-~qE!uRA4PRCVR zSYoDFQPeJuLPd)Vq8bx{k&xvHzj}-q`-suI}=b_>{ z5h_9GcCb}B$dc6<26HN7oa^%xbXd#W-5PG()(MuVaZ_~9K@SNHw)#J5ulV?Ne-82! zb0j^|4%pfvS<8BuiBV#?xRC|Fw02SrrT(~O0bV%melaq}nO8Nd#7_~`XYPjk_;O)Ng%<*RO>G#PbAR-jLPD zAKI|4{gOOM>TzJU_>XoXH(PjtizW0J9jqmk@F^K~NuszfnRyocFj_xJ7$S63o1uCc!prwJn^w#EOq?gmI@MKR{8P!M8qW>*UO*o@WSg@dS^;= zC9laCQTw==`KsC=u~Ad3Kp2W?RX#I&nOHmEd~SM1AFcJ^xWG_wx(8Uj?;%aGWnv+A zSPC5(#KxmA3EmwgSLBnpl&Jz9|2aTa_IBlR29Y%T7APDYssZYFL|c*lNo)HaHXS&M zM1g>xnVT{K(7(ZOQ~yIn!&m*tyxE2A$wc#)U>!dWbrvE z3w*qG#DMSeA6})wqHY(hXlkP_XiQ-H*Fr&#%Swoh$twvZlZBX!w!bQ?JU#Pn|>Vk{PA;QC;LGoKA#N!|BT3BKV zhn8X%H5oYx^>EkPRP?m?k=yj~&-dsvhuJmH!uO7cX}UVhoui+3v0qE{0%F?HON%C~ zJdAwt^0;KkTPQB^TeFfj-qLp5WjExpIVp9JFix`lV%iA|cghyR<_IdKXy#Era<K=#f(Td3xHi9U!+B$?8s^Z1+6J;cFzp(6BM#gm;3N|dI*?a;D8>IGHafb z;#^oDbCV0b@FMd-V$mOU=gM<7D2%SkZ;mb?Nwi4LUr%E#>_HnIF(;8EK#qVjM4qt~ zfy_;Pg3MS~*TPNLLHFJ-2epmnMEWdx+@^K9KW1L4OG(7PG%r^hyRVjiQS^BEHu`4^ z@O}F`Y)%GhqA~tmaQ2oMmy33l*j)eEY8SEoY!^_o1AI|_q*km8ImuL+nXdZ0I&_7wT~{+*x#0Oo$*WY=t=@mWD;IJoFe3BgyjReFESdXDTKC$c1hYpf2>L5g zB&DZ-<-a42Lj@H!PfB8DT;^n)Q3T}O01Lmq`o2Jrw&XuZTfya4URtfL>M+;cB(vf< zR@%2C+y|rAKbY|w(;Y>DzYg*bWj(||WF=)Z$aIC{)t4vQWciA4RaCoH9KURWtfG0~ zLxd5mcE(LjwbLse?r5@lUWV*w@@}8Y2ev)5Y*sXza(r|S!!=t0OgNBVqZx}bE1macyfTmr z!8$zKB=hd^hcEdo&&%|~7>z$c=cf+9a>kzjD&zS{qot{E%fcOl54Ql2oDfJO?Z;hq zRq)v5{u377IfM4VeVv1m%dTQ-RwAW!luBp>VdosX+b!aKndxa+&69}AV15^p_bd3? zGJjR++VOZa3qR1K9Vg{pNQ9X7`&*dpkV0~x*?ouW0X)FAwfL`WIP?w}s z=FEXI!oR0P3bNg%nwlkw z6sKYloJ)c9y|8Rx`Fqh*$+ziH(D?X50pQngVZB>|*=Xu&27VgZf$i7LT0uyRw^S?iVn^!%TPK7wDRfD zC=^*E!IAmlh!N!iGjehY;S?dd&F!R~jt}WQoA+He5~Mz6r?EY={(spv=`CoWBZp23 zUyPDLJqhi|gZyHYZe@^A`A#iB06jd;$Op{f=v%O)X+0b4Y%W=r~kD;Ln zx3)KS_jv@&J-gcW-|*3 zKKJUgcUxrUNK78(Psc^Z{7f=KA=H<0xm_DDeS04u=1(-4;Qgojvy`c>F+rN5+ms*G zKy0j*frYJ*hQGnXwUc75?#U0d$MkBWnKv6Qy6Dr{LJr5mGtz=}#Ho)&_hjzH_Q#=7 zj1(BZtz(c1WQ`_^EEGhiz;$?NqPBn%CvNLP6k7o;`)a>*v8u0wV)IhliN_4(%}Xw* zMNP1xxuiOg1)@E$WvHY@7v!zqh_jdw($t&O4Ur#1P6r)tz-rXGM(pkX(K!f|tUoM8 zW1#vvTy_b&)Rh*D1mFoc6rE7&zOzO&Ev2+1gr~`{Ogir!c7b^aHgnIxL^}fEK==)k z-S6c`cfhv*AlMPG>c5=UWkOVs{sk~u&SebFoEL$BaIaqEnGquM-9Uz9{vg}HPZi5b z^&}WRtCJ=oDU=Kd62gSW9jyz3raUZ1!gCMP;8##yu#(3hkB`)W~ z5FFRkIlHpU8yUtWE-?9BW)&RLk9U@4w3Pk8)HG7d@YjQxBoWmpFLf$rLw$d6Xi#N4 zaPJB%J6U8;E@8J=Z5lT)RP>PD?Z5*pgrtU?PT0b1H18>fqm2R(iW>4YRHOFhvY;NR4LSYQSW}GrP z1bN3S=dJL;1USvI|G!RA_!f*j$^@@Hx%t2g)Eoa$dxz)e3BU^oqY8cp`YrS2dI$nFWK{Sxw4 z`n-7vNCwG;4;++9UI|NQk_2n>@CnDM(02&!O1bThwlAs)0-n^luo6qDsb=v{7T~Up z_K>z`J?o{Q*varY(40J?%d3BXo9OfG3e4^zYtpP&DpRuhS2WOA*5AOJ3){-v8UY2{ zpl#s+I#D=17XeaJ+_zEFFPUkto6R+8H!+DG^g;H5(<{suOryAK+KXN^pLcRq0_x;H8SEb%A7}Mz6ap_cm`OGRa;!U zOoJ-GC&-@~K)Uh|#x+YrAdMsHe!Wl3BG(Foj{`A&`&H@LRQ9V`gaA9mfHDo7EtwGo z9Y|EIwIK5PbC8^IUZ^!1%;P)I0D=oo)KQUQP!3baVLz#4({DLpnl(|K?Pic`|PETvkYjQS083lxy zb<*tc_n(XQ&l^)$rf_j>M5Cv6r{zgs=D;7f?sfb*6d7>|i$Q)deuvw49WlQWJHGp{t9h2;Ce+1==wCjaC5wguF4Rdd2tQb-otV(TW%<#QZ!Ic(QjJ$+q+UVN^+O|OVI?# z0QUc90EVU;#b@o-3XFQ8@l!sRpBGD-j{;AWn2%$oMKWnHc6ygzW8)?|d-eIbaM1Wt z3w4WR*DTGw)N7ESvCVsg*~-H2OZ8xZ_!3+H#-AGcvo z;<=xA=dm+63^DlwRnC;vI&S7(fU(xIF>sGkBcWc~+QRv8%fpv@>s;W#70AaXnj$8x zn!@%ni(t3#j&>pKLSrq5(auuriu8xG_6^evt*@W%kR-)fSANJ_Ojm z?hgfMTd#M@tklXJc;I!cq(4TKty)NbNu*9Y8PUCyRykm*To_LJdF%2p_1IJa*11jn zLh;by@Rz}@;2N$#VwEAJMiv^We=b*NJS>NqC_h$>bNK8JD{$E1xE(Z2uIT~oLyGM1 z2^~{57`5>7hB>+-mke>Gy7bOJAe|gQUz^)_b!B0Fp5OTN_@aD0a}ni~g!$*JZqXZ- ze#K)Sa8B7MtwKoFB;Gp1_)PIW`@akT{P*QQ`(G{C0M!E1fE3_Fa7+!FeMR+>&bnR$ zoBKu6&l+K2Ovk89c&n>}Vj}vY1fK8o_m~L$C2+H!!MoE(`Rfore{>ce@}pCoa;48h z7{wH<{Xa6|H znx9Vq%CY-m_by8}F4tbuuQ})R)z2SifE?1Eyhd*LE5`ZLguzm6t{gMfIyq;S)ZcYT zQHx$Be=w`8van6Q3-vj{z2^KBO&0#T2VS&(dEY2YL|E6c{T+)HhNrb~AX~CaDGi&4 zp`8-gw9JRE2bfi`u2uM0^7@lz#BZKFwY}M@Pv)v$sWz};)+@iJsZS6tlWu)H zC^SQPQlprk5hVy_qYombA8TW^jhG2Bh13;}?gx1mvSmTEr-*G{MEY}0J4wd{;fvj^ zYEjOsT9Tkj4khB{O&8Dggti2?N!$eiMY*Zqzh_Ug^pDbBIHP_Zg*9*3BmAkG25(?9 zIwB4&pUbzQHC%LEPq#fWH0#*cZ6>^d`}#VIyV8yDt#(z6U;%aiN5pfnjhZlt*oQ4< z6~@3eQx}j#cJY`}_f=2*rLg$J%_@Yy=6_AC=-KOgd19(>7HhUiyN&*foIR(F+eF_f zN}*;UZBsPNxHRs4D;6T`xpDaNyLq~C0ZzXk%9O7L3^RmAf@&wvv^+|-}0s~+N!9!uX^w2i^V8|>9QBnf9bD{6Cb0&Q8A|Z$b zqLc{u3#w-;S}F}RT;|%IJ8rB$4;oBKZKF8XhCSS=Oa?MtiK>uk?gf~5gGKyk<#5GY ze+65Lp?JG`DVS)H@$0@~|NmJ4#$tTyKk2$}W)1YuAHY}UR~=++HHX=PmHWA@Mo zdF$@*JKPI0+S(?dlZzrHmV@rfO*eQsY}WOg`Qla9AK_?Wi-d}p(L5m-g8hmfxoTyoM51tYqvEp1 z^Za1FfwokuRHC?C9}O;TidfFkGYD8)t2Pu^yk91yXmV5WX<-rQXUA9A)j|&(JzI7_DfpkEWjXY9ZjkfLpd~w0lA{p#uN9-^9{X&!;)CIrc7%WnqVgN>wF13}4Cd zvGNgf_xnbD${2YhzLrf|2z3xo9zJ>!6y}wF%2nWYrwf<+}KF@n-_L=d2vy*Nfk^rZMRK&jhRmOY}&b&uL9X{2A5fnY^h}oOzZB@z*(&MLh z{xgZ#y3LAyvO#XDD^%Wf@Rp7&OUK+%doZ>WYxkCNah{Ud$nb$nQbt$uxvHCidr;&% znzz~6_ZhMwtRrd1Yb^g{J;LwMS^62@L%dd>cxIEjcN~FBY1=it7r7nJtZw}^W;sn#E?BoSL4yeKg%(3=&ZrzwfWhfteTjf8Nk z4~e9N)1I~=4n6aZ3nc+7xSBZ+N4NSrHvvznjU!ZXC}VOK)ylrRJt=K90xwLrdVINO z)`T7$p}FrrpQ={)Z`vAO=OVlfy~#A1C>Ah|N9L{&tNlyGj#*}8N6}n!Fk|=dx9o0 zmJ!Kyfw)dKlf2LEc0RfB&vM^*`MRzgtS1jfNJo1`%B`lMgFNfSMM7h~C324oVwF(c zWeOGnXQpq6Y3=Lw^b?;!RMf5!0)XaP&M{ZoncMyyL>k6wI-Inx4-UTQ6}|KZ?8&3m zWksy{pDxoZ3$No_Z?w;S_PglcbmnZ<$9i;>^!dA1k7Yb?FuY5lE9QcHnv-D9OH$DxaFzme@Hq)Y5RBrvSVJ_x-n zBZK64p90ihto!;(_}fwKyl8I@30~JhNbQDrx-1FC?F;Um%=RbYuoWvF7OCI=dp|k# z@KHgK94(8E?iOICg+K4r^s(>#qebuRW%#?>i0X#yL%B@TQwd#z$kLDU%En>&3kX+( zzS)T%d2#zl7sI3 zrBdJ3c5tQH1=v3Re7id>VHER+uAB88^qVnrvH7@G; z#PIg(v^yM;xm-WM_j6qZQU9_qO4Q64ZJxP2L3ycDg;>7~R16_hu1G?t#hC1h&d{{a zIT)PK5W9wl{1-%-bA(X=GnmvqXtlW%J^+q=z*<>A-n)3_N~I0y-|tsbz4{?171n}K zF~8u9_zg)VI&;)GmFWm`J8hRL7*FHAMvtl+;^Ma-uI3m?$?AWKf+Z4?E0IAqU1CJT z?jD6}{9K1lVA@NZTh&>hVD8UzvfZfumirRu?@(T$YLKjBkpl*hs<>AQT~6!+Qh zhVL*Qcu4(lo3z;kX33@kkY0?rduu7bQ45qur=9h(4%i@cbR!3H$MBVZ%gTvLnX?^S zN(r}nnfysx9RXejT%$6g?p(BgIbV4F{q0ixdFr`b)v<48QGeja8I@cka- zeoPNp>V6_aZ@8n9|3E7^M6sd%L2zsD(zqF`5cdt#bU7l{lyjF8d=KY?&>cdqkH!v#BqyC6z7SJCEz%p?_fjMJmTCFI9Q^oY~kBZfJDy!pyo_w7^Hw#pm!{?1@xZIF>b%XPu3P%$h4@NspMPz(1+h$G z;2rS>cq~kJbI}5e5X_l*4e8%R3`{Vt>Havbc)>G9?F+J)D$X%UM)3lTNCiOot{T33 zhSpzr_P>0`0W$ei;AOI7yb9dKs{%P{n60r&5lHyk8@?A8?1B3-hQ);@OLXE-b-y6# zBmBmL9;+Z%ykRLluBN`L8Xn=VP75U$H{r)W(h@-6wVON4uGmPTAGL?#&>Ql8b9F*Q z__bB@&aiA|nLcUOdxy5gl)suL4Y@DQqa{|riS%P=_t?dpmM8`(ab5-Gy4SbW32iPm zWH5M3U{j2?L)D%ef*uFT&0yCH?;G?&fmZGeOA+K*^Qe}p{!TbRlvz;qv*Ep2&{y#y z9B{Y?&Xp?F&xjZbSP1W6L&fRBS1{7bJrKwHKwxH|eUP73J>y80VP}AK_m6|}YU@6ggAS;!2i$JW>fXe(>Nz{>nIw_t4f|RechW6R{{+h&mpQA9fpCKo{T>2w zjf5x<@Wc!nro+kzSz(z320rLZXA%YfJRBP%6Zmq8OU@6*+(l&+IWu$dG@2-#Z3y7l z@p=!Bp7A+&JlGKcVBIYAr0Qn174&h8)U#OIP&>kQpB#G~7^^46@Z^ec%&dM(_of{*^NEb^|RAo1W))0o=rQD-<~0b>X)Hu05BI_gnf%*%I$Va=W?N zhm7#!S{VPRMQf(0lD}hB7v&RQuHj24lnf=J7g*9@MivuI7oZAXdLLWwd;*sB{LcPb z`koD>Ms)S)H9f(lYS*|czfK)d&DHm#RXrrxbcmSG6`eFay$Mu^u%iO-5l6cPGpa5o z`~2v30G$4LTOaS6HFKR7>hItlczfYeHcaZAWD;n6q~Shju$N3PtXR{(K1VV-EpwN= zZ$2qV0|pxGBSIKMzeX2o zc)`Msy1>WVkAN!K$K=Keo@}7CPg@B7vzr_ur|GhOC8ePmAJABEbVqYu(^`4|_@ujX z%AG9BmC976*HZpD0vKQ76#d0MQR2CZH+VKcydsJ~%W=X+w8&rR0XtHbi8WCy&c$f1 z;!O7)8KsuQ!*}HQs|VQibY>Y0*g9!HA0MvqD{=nJvXdm~j-@NtDyaYFuBx=Ps+UH} zRygt3Y45z0x@%Yhn_o^=Pc6|>hT0GGgZR%?seMkiUxfg#fbKTKQm?6U3naid@Hl0Z zu5$OVa`3&tSud7N^hZd{BMyIZX3z1t0{WWs*QuK%WVd;#o)m>?q-%2Kzv9+dKN!gO zEy(xg0K!%QFa8_aBkHN;3|9OFODGuBQaq0S!_rvG$`gd$&Jr63JyINMW_$w>q!Hv^ zcx$kd{|XbPq}Ey)XbR9&51}+n7T93Z^dN-N%(NBEh8S{j$U{O3X(@Th#zesp?AtJm zmg(R4@g-uSH_=vb@Lh;?~s3W^6INMTU{+t4P`VtHq%yF_8n1wv-%SW0IdULd4y` zk=PYI)quD33VB!cv-xpsFV2#4n67n;*%w;<#SBu;LP^I9@%OrU1zT>bt}I{W>*{IQ;yPnoG-8l0xBuq-?1(o?5Q+xhmCjVLMyLtHAx0v=P6 z|8ijDZ#Px>{5=7)7d4imLf+d>z%A2tySbRF#Zyxi={#%0O` zsbfPlbnoOLy&e2jPAGACmTTa*yi`{Vfdb2FjK$$pw4GR~`;yXw3Mr1x2!6^C2fIhyjx_5QwoKR+vh|qIcv2_tN2tW}$bJQj)_CB%h~K%OfOr+phYz zQL+>}0yA}A88$ZBT?MOATGpee3DG)nOg9}zZ!Z(fR9QBvli%nI45c!_H_bPT#vSFt zE%7p-nVcOvvyPJ}E^nvr0)L$>$1*bapmhQxa(^+m1biY*jQt{rTjWlN&VCeE_!*SW zfHXg3Y$~0>1gEB=~x9H#3Z#K&A@DKAguOWog}0=jP8;}UdDkLOEGfHWsp?a$9usULsPHw$dh#JB1y6VTb%FiF2$i-6Ol zS~EOV)>r5ngVZ`#j0>%D1o;9bu}bY0pv~P)ed>rrf77@P+}$to{BvqEGq2r+QqgV& zcnyN5HAl4`cwA6K{A6(O@Syv5Kaf|GjeqH(OGFj^BbH&=tEweWH1n8j-7G7EA?;+jlPIsShxhJSTzdvRjl z><@@IG;u-BuS5cuN9MPxQ?%445Lz2-ub zK6^VTB}zWQZYxScdJY`fA=cD4HE0>uX@-J{n5R?B9Jib2k>~4S6_&wnR)MZc;S&2r z5F3^%$q3l;I_TYS7{1c5a7EK=F@i%+Aa>HLBS>p)q%EPu>Y*t78NpDSETT9THHh@V z!#rL|Sz7W)yMisxPpGr))pe~IZ`*Tre?^nNRH^44bC z1$xGIo$jF!e$UFZ-+z$Q?mtNS8L%31vu}*kz`E1p95kS%6~BvO&VK48A4+G#&E!@|>E4*KoFy?IQ8+v1N<#iS|T$87%t8tz$^HDr5S>RE4 zpV7#qn!BTgSAfHjJT#Sp;#96&Q(lZfjO*6~BD7$IJejxV`s=>K=wSyfd%Dx-P4!}S zrtF!eg^LmbA+&0E> z7Sqc0VeB#%!{Fud+W9yYWKK#r$#jSd_K5mrt;&%Rxj^gNgr4CRE-_7iVvHydUK-#S?2xKLvPPz)6Y>XL`r%Qa2c`{y? zqRue~_!$GB4YT9B&M4F10`x9$`_hrovc3?;`WOdnq%(yy_!=^ZwsJB^2!c~(;p2%d zhBq&-KesEGe+ir%jvtJTFUg+M=A_QPjCR6lqd}y*AiwOS;d;rx`paOdNyK2Rdk^$a zRg4D%cCst0_W9Na)ok7zaqC|^aT#vruEGbY#nQlAA4F~B@Gj4`Z~d3_TLN6y?^1th zYK;|wm0c9?`fe0uTppNWuy|0YD~MwV5%kY9 z{_=Cb*g5gPI_9j%!r$D&bjpjLj!#R^H(HahB7Cxe^2ipsAd?NIPw$vE*zsIQy>jSG zIkU&fgmOJO_!w{86Pi0hg{-Gavv!EI+ad8g3|fDZT&|=I{3)vUCnVSvi@GC*4^{t? zBK>7loP=#B?80l-=a*Jn=W#|;0jZyG^MPu2O|s&EaVh0*Bi7!&Hae#Cpl^cI?51p( zA!J*6q9#cy;d}d{-eP!{hgn@??N^Y@!W&<^Tip{q#=Py5_4i7Mi7RGG8&av+^DwbP z$_xEq>Zhz$o37oz%=1 zCS>$vOb+0#F|ZD0Gm8bdIJDZPo=-#gnRr^RU!3W?W)-m;m2b~$QMBA21zAPhZ4_I5 zs0sW+UJh76#2pTGhXW{Q-hM_O0NQ3i73ltd6=;L?duK7V%_4N)DF2S}toDN z^B?+V5oWGAiptfuXre>;xH(BN-rVMG>O!fUFLB6p2zm7=Z9tP1(U77=V+b5ai~L%2?$GK4>{6^_0;EChv4Ck#^V=Huq?b`_|ptCm;O8REUoA)8{~ zQ1kgpyA$oZYxFaq4#*-^RL%V4sU2R9PD1xjHN zR6q;|pO%|X{gVAOmz~@CSwvQYGIUeYic`|L>O+qHGAzBv?_le9T=u0Xtk4*mu_rQ` zHnaN!dlFqM_ryq?61^`+b9cJlS)ebx-;|K6QTX-Z&84R^QcKH@_J@|_%8)b`PozME z$Uz`b?Vg38MdYOKpsL^;o$(udntKre`1A5RmH0b!=@HnpY$xTUmu=sC%o-A~R-D@#48 zQqVfX-bX~j2029tCZQQA{M-q%h0N`EVY~LH_b1C7^@edHRxB@gJN6Qr;Szt6O)hgT ztYwvm#W`6*Ip}F;eY2(hYR(7=IV$^*^?GOPAt!qMogO>aiHQ9l{MiID<7c2=R_ZYn zoa}faL3%E*Ok6Ies5D{%HsXD5Mkn&_izN*`t5bd(?Z*om_bo5|%OhbKriRT8gfqX) z^uG?m`6;5J5p)y9+SC+<8=3H}h~z15?trM+<-~Nu%8uJgfK0TIenEwHfzAAh&nUD( z{i@xl3*^F_PT6NDO1y4x&_92bgT7Bg1)U?7vOo0d)tq!5YXX}9ayj=Ks5P3`ZsEK4 z%|no}zk`guUc=`xw1xXSfs~Cg1`iiz)a0+V(-iCCvx@>e@O4bhgC&O~E;_Suw8&A_ zqQoy|^RNG1Qbyuy%BXXsn7d=~$d` zV6(>g<9zheDzG{rDR`i+`?l>#^>!MszhYqXHU4&GUb69s=utVllvaLKJS}+wZ6!Yo zN0kvM>@cciVTQi9gTN?6RuI;@m?@(9XnG z3N6*T)Tl2G;x?u?L{X3gFZeX}g#Wt-V8FaZ{|J|V|oaI40<;pw44gs0S#$Rqu9 zs8#n_YTaylfgGrSEl|E5G;3+R@%|(8{5jbJB>d0yIsfPSpFB(3!Ph&|OByQblGcKy zAHU05!wj(ak{bWGSPa>BPvtJ zh<>GG`qSpN`^Ka5E1k7RJYj@Qg`BBmK`%>@rX(oGc`#?~P8z`8bGPYada$y*QfZ*` zi=mABF!PBZ+F;8}iB~E%d%jgVzksw}rIr16ARw??^0&ti;q=mW-?e8`4ejby+S`SQ z_8m{VO+51jqq-uc3T~F*epT>042q@q5qwoxvEiAlP>=%AnM~X}Qds z2%I=vaS)YJx#6`LK~)gTJ|#PlL}bdgxvJDzF#MULOTU~kIb1TWr=gDwmB+K?h8DGm zVxs9+ta48B?e0eO>f9o04r>@FdNgWp4aq4dpdfMW6S>2GECl>|{jYzJ|6l(A@7n0w zPZ582!m{#`MJAo-UV;Lguz3Bm_H%>_X8)yjQy+$8sZn1Q96b1A86!ZDU}m@OxUqxl zh+{e?!^q>KboGxDW|Ar<;mT%?83dsLG=A9csieAVP}0OvIbCMCQ~B=u%dxxHj zu0-CcIkb%`vUY!oE?TdnW-*0HtJi6V`7&3h#VUp8Hd1Y^BbU^XJMYq;N3H>z&S9^Y zPsc@L-hOrBc{{}`9DAaQP#&%g`-O{WdxgYd;nxea$i4tFrSmzzm}dX0`EyL^iC07S zZFkd`NJBT^11SX#;=(r5$N}2~EoMGj5|~hmo`lhYwU~RHEd1#heCxw0Kh~nlpFuWl z%G}IQev)fgRV^S7SKq+WpwmtCM)qL6Y+RKtViyU+h_ElbF4hT|Alpzg>>Aps-$H87# zF&f%0pKKU=(=2*IQSXv`Ya*lD`FZYW4##w_O5pxm?;3Atk#?KAhMnV&OZ&+*Kg_nb zI1>MAEj{*g9Oojc{R_w22F;|VzuyM@;&Ty74Xv&XE6H(zjQ$`7EZ&e6K`#R?3ZY&r z*|LL5*n~P`#p2Xa7E6iCX%l~(Qh*$e-RpS!cs3J?!0YI0DL_?&ePMnQ@DyES>P(Kj zeS;C+!QiMTArmWG7TQ~fHgI74R}|%Xwus$-c@ z#{S@(XpoN+#HYmEj*xxVVfOPA=pJ>^OhU&p!j3*Bct^e1btKh2h)AsKur#U`{sSA& zvL>iHy3Ix9?*K%d0-@&m>HnC-kgJj6GE~>R>)o_B_@Hqb+_kCa2^L}3QbzKS9lM*HySCj6Vy<|2#Q2nu* z)NvF(WR0p6QyR7x^idvsA_EV;d+UpGx11&Q^o>*+Pa@r*mijTyRC&M z{9i67B3zO8~?OwKcSO&G+g2K}W3BjwJK% zf3m_i1SVTw)nv{Fxk|0U>$En-OoL5t$(nMznX8%9*mkV98;*dNH!jxe;EHFIb89S= zAwPq(R3TQfeC4c-YU-8D1+T>G4~CyX+Zyt=_ilcqqQbfO2C+2{J2(8+eztK(TE;Za z!Pkb)z!aup7- z-!kl1qyqQa@Qc&qsIDNZ#gXg_AO)R~;b8+}*r!W&cDl5c+)6kG#~0J0#lO^**?!tt zy|&ao9aXBsWh*(!do|T%vM~7gkTE9Qj$WOB40Fv3w9p9lZyG#*9(8MG4;nHG?UAA_ za{`ipv3mIarR9&@MLPWtg?-d`n>gol{D5|PKek*Or?Nx$!OSdOi#<37))WinXeFr; zAsCPi)L}|S6qe@)gV633eroG~p<^GBYqrMwsr3d8I!68{m|lNPfFQ&WnNma76sSKvh-Z~#FKc2apMmj%&piZcX{?}2`zTa81X6PPL^YG?Q^!i|)%|Sg#TWTo z64^#$qZpi$pVEE>Va;2bE%V8HdG7qVo%?>;M`>lI&wN~*B9HzP;2PWL!ajWm{V#dU zWG2D~ zgFa}Msq*u|BD-E~KS539`34&r|M?kf8A2j@{rzrgDIG4qJb$%E=`HrHk9ddki)`{1 zU^=db>V%?P_NVS>$)^uAqsPqdS46Akk}cjZgvL2IkQFD+EY-=gw-9r0cl>hI6YeqQ zKU2JQ0J*n#!Q@kLM8EafJrXVQv_&^@5nOyR4749u0p-VCIiUQQkl4e_%ka+Sd*;vY zf_*#Iz!1rc6+*G4^g#X12N}#yu4G+vdMr-EN9G(ir8D%NLx4YRd$wuT)V2O!JyUOiAMoh07lI}&%JrT3q%{7182L7B=V5{ocgd-^x{x~LDUfcS zRJuENlXi26ec-;1z1>?YhM3w>V2{E|>EV)5XZ&>Q4L9yWnzZNLVlau1hH-A!9NW$w8@W%XG-`Ji68uv}qg`pLy8 zWKWma4enb?1TPx<;&3%%MBvA1(X!QGaYarkM{MTCHrmCcc5E3QYMe0yJ0)u`s&VDrNiEj-_-2 za+`jY8ZLeDX;nh-g89+n=8fT| zPe85dx@F&bw%(JAa_6ReaQIT(?q{R={D7VG!MqLbcxH;$JVSI&^>Cury(!=i1lgI z%IGQwJb}>7e=7PQT1G>U-p6^v!+=pjoH}LG0Ila-R9UpSjFtLJ?|(;QKjNqA$X`rn zCtOu$!V3C$%jDUKn@mbaW#HVp5sZ|3gl*6R&{-`Hp!3FRlB%0ROT(iCDoficSYBYj z5FePnlY|TSEquh9s{Ag(Lt-QHpki`(cqMZPeI3f=MqL@&SM_|aFH>#|UxklhS4oziK3^jpd!ZP2F&YAl z9zr7GtZ~k-F>Y_H*!CPOuGasWFQmodIu0{20#M{(5B9vSrOR)yet~vK@e4gPOr&G` zTv%=yqQ=F+z(f_%H%y>7xW~r{=ZNq2g!l|Th#`%O5E3Yilg285 zazk`JP;MyWtYYIfUXi%X=g8B4_XMcLqFM6WkIn=PXW2TNImy$n_S93+DTgy+E=8&_ z*rBj}E=wZAd7E`q%?4y8j|;Lo7OXkOuh5z2T)lHM7L|Wka!WVH;Ma|4{b8N0X2Z7I z2DDpUOfwNz7NeO<8}%(%N{@;fr8O#xUj`nzc^>HpcN(+7sVsclHI1c&dAjP#HQADE z-AU(Xs}Sz_v$^KJs@&iCypK{NTD2KPZ6eaC(=rSX&FU6+biEdS1NlV}+(nmvw@glw z9L!hSmCV|a|8Pe`ik)t*9h7yl?yu_#JqvE_(B|Syy~brA^t*_$AipRhDvm=w;Z{T$ ze}5|2{Dtoy^Es|ZW~pe3t+t&q!y8I>$DmDl!JWG;-xVDurgw?t z=_Kx0{551Qm=CY`3ro_!v`e#>c8LK~GV3iw^-1i2okm~Jqx7hHh^5u*^iS7RxJH-WebRUcy7h;zeiPe30)Wuc{lGPidp44!I@4eN_H;e{;T6gv|17rF^ zwVy92&7aNtb0#ZHhvI1?j>bUw-+sASy}2LnISz@&1W~(b9xW?rb?ki=3sk_%A+Z^h zc&8g+oBz`8kYirQW^YD+y&4)s{RVVoEtZMS|s+qUjcPg zRWj32aeP>1X)@SX$+)Mb5V-aZUSL3;;6_t8Z&Ed1Vj5Oq>Z#!SV#>H&jf*(CVkuTW z5~y`=kUqJuPa?|I^ z{q2$Xo$;v`9WJ&d8bT&6?42Q6Sa0Y9Df5lICD?mieR5`!FyTKv=X)wzqASKfePXNb z+(}LB3+?$=kuXd}y~z3~H%5fn&9m!i!MfTxrL@Nlr3)HVsV%t1yj@KlZ`6rBP(MYF zU5H)pw~2B9xewL$vHrx8crRhP2EcTWa*-v*lzT_&R+Q&Zy_#e`*nXoP|BD@<@;v)D z9Ir$L`P*80D8hz#7yVNLviKK~c?t(LxezF>1$XFe^jGsMMOHP-z|-g}065~Pxy-KI zv8kf_qoVV@V49+`U9i% zLbg>{i1ixJmnoi4{3%ZUeUc&dDYug~DhA}UJ{}K3}-s%-uKJKS<|5G4>2a9z{o_Io$pB! zNsDI<+|Es&w=IevUxjx`M2eGR^t$OnO;-AA1(U6zR-;4Qj z(`4hUJ~g%N{Dj4ZIvnrTH!*~U%h75jj+9fN^WzLRt;y?1WIr6iPBkN6DjiX%Q^HCO z0NWP@mwf8Vnus!6k;!PO43)duojF8kwpt_{8diQWe-rDd7%gBCwe+7@cb0*;hMn1i zo>v!*tN9+D+rdZ2D+;KFu)Phou!x>7?!SsN_l+h$pM4|yOsD@j>2AoY%Jt{^+HXa# zPecRDvhL5+1lYjq#kIEJ4{Cs|%YrrWljlCf4)VeR(d+C-)-Us#+wZl#2@X0wLcY_KeA<9xmXDfD1Tg|$y+*D?#?DP`be`MXaY&+aP<7u_E%y~z0Vx^a5# zG-z>m5A}^V1hsb}CgNRWWa6>0on=4pO-<+zlnKM+n2dRO5|)4>Ib23lOPA49fg7t# z#@4+?P?YTc@wzNmr^80t98#zGVbW@`;olsi{?UGOx@gRJ=vY68l66bpRpNL-zFW(o z%F%%P&av#Z!P^F<39~fzG=6eiTpL~D)J#wDC~7#r%Xok929w#HD1x!Es>(L z*p=Q1eQEuE@=I7z)aZiiLoexDAw!23)htqV67Q1B*ylLvJ!cAYb)WdHXFIoq`;o>e zv84(+UM;#ChIb1XerKg{+vzuoJb(t* z$n;%3a^91MI~YN$*iR;R(u?uHO;$?|E9`|8usqI_*bZ;kW-6)hov7d z(29^t9+H_fkQQ+^zlLKL5HQcq1#Kv9`2B{Sr;U_DD|adk;<z6JPBW2Y7i%NtoYS=bh1hH?QILxp7v_y(hgb(I{}DP0>N0hHl66*H!nk zyZA@%u%FZTP;K&uU1SqViYVMfS-MQh_MYZ_CaR>ka)*P7WwTu9u=&E-YBfL_WPY(L|D<7cVm;wr;*cMs{B@oOVggTtABrUPzN?SG zus|K;AWlnF7qV%;64t@OprwKCrEhX5lJiQ^0A_f;=nDr@N$j$>6K;j#pKB)N0?a_X zIt*m98uV}IEPih+HnM~|R_-;f%W+-Uwb>UpHbm>v`Kqvu-HCjgwyDffaEk%@C5DXs z=KH5D4yMfJu7mpLejtUR=PaFXpU5y{QSHd^ql|@Z@<7K`my%QE{s*~U%J$eNO*I-B9=Z%=+H&y=ATux4wUwz1pppYP+_6~=i+gzuPhGX$!(xi)U)Ly1pr|=Q=LH?-kK0}9j;Hkl+IG{^u6cHi>%NU&nP5tI9|?YxcXMhW6^C-`APCK6 zs~Oi=ee3yB^#USc!O^Jk(x()>R(kXiF0|O83eZEZ4<&3)wqdrP88&8dLCn5@dw6Ax zc$#IQ4Y_w0ZjFF|O=>@jRuCGS;Fmegp+qjdTE6v+wJ8)q0#_1{FQO~xKKa{jUx?xQStXB5y zBa`88-Od-63P^)@_QhT?V`7a_4=xW?lA4p3vJYg`{5ma!WzD=nJa=vFRLAV}e^5_i z)&7NN^jv+1lqa6R$&xRsj&j(;oWIIsid2--xKSncrW`e&eFeeSvk!M(yHaf`yr8pJ zF1528sq725xKQr2hyUjIn0-y4Uful8n8v#KQ+~}yaojA(8yuO`PYlU@3eqJDGO1wuC&W@ioe|Z0^+w43F0XFgsHfqhQp4hf zt;F}EF@BDw_9vC+EC={2{fMDgS!jc>cq5e1Z1dY4ey&}M`+Dq*Je^*VhYcx!M=>N` z7o{hvVy(NeCocN9;QO-g5N)2AVgX$nuw*9pL%o*43ak3t?EJ?)J-lx6BK!s_LJvyP z>}Bse88F7*ok$QAFY2ehJM^e2i-$6H ztbOQm-Q`r<87Xz6xs&3G4%%4$Hzp!U_q@~G_M6j-?j)wcVx>;u<5l?QA)#ct>y>wU z?oCPw>a>HD~FXS*wdZHhdxdcx@x z$?IOU-_*_p1^4Ll5peC7~lE>EW91`Y(-6uU*l_M4yo-b^gs zotB~r6baRquw6*tUWF9a8dvnD*Y&=q>;wQw$o_~ zSb=planekt;P2KH-`%vg%WV97<&y>v`RQm6pA&|C#3Uw#6OM=Km7hL(Sgz*8&wu1g z6~~_WJL@xRw7`@DayUp@`ZMQW2g{s3k0wlJ0gX+_F9gs>5#rhVA@Y2E5Z(zECLL=2 zh{0VON+QxPA1aY3ccXApp}X_v4Wo@5mdi#>jj2K&4~>xz65&=`k6aZt8f}MaO$+zz z`lv?))Lf*wbYGi4=dBFEPHC22?%zP#%QoRsydN!^D}R4K5l77>(JTch&#fzQg^^~=W(0a>*eTtc zZp>ls)Kn+U7$uv|{RDZiFSYyrol3?_Lw`4KMitg@C*9pUb!>E-a@qT%f7GOZG@IHs z((^qxrds-jY4~Fc!nWDo?C+DrdTnkxBCyjEp~xM+FFJtuR$dY58J`TRMEJEhip0EqvCpGvi3sF4)q`tk)zxXWC1n|+;YXJ`6NED7$PHN6%FbWJZ73&ia)ERQWVwh*ktfp4!0*bchen+%1dE&hcq` zoO1On?bekNBPVg=o3Bh`9%t}UFmP|WTll>%*uY0r1EjJ02q29s2AoBKsfR!I>tmyJ zrCy4i`R#)1Xi@&v_*zRecoE%BxII_XeC`cbxX8m&Ovp4Z{%zfq?Q5?44#m4|X`2Rl zwG4+HWnjE**EHaR(%`&QX~0E^0OJ{3HHX;Ef%9T#h;DP#{4Hvs-tv7+SM+va5hkMff^q-)4t|ldmh|x6Pfcjp}8`hBa~n2t~(0#XfPuLQ1p60(~sBy zaJ-tF%7t&I#JHxBUt{;G`=_?#a*@95s#(T`LCxkVVWIw8fs%G2#q2}xDW*PHOs!@( z#qNoVRNrNp`>R}zjN-^bxbhJt1xVpabtGHPT zT1%A1typON1S?7Hv8Yf_1baH&A1Sk!sdS$%W)Z3_{xq9qVpQ|kOH9T~T0b{&+Jvto zk6*ZdQiE{lMkowCf9_W4BvrO4HidJ4FlA#e}aD7gp zIf}tXE`zltNKv9%fe`?&(?bd*~S^E#(_sLn$p30BW%Q5x#7UO#&jCwhIS7UnNpMV)(3A(-I+^iyI%U-C;1CIi+ud3lD^^- zvXJV*a~Ebx6;TlDy2eAvcSC37@y zJg3nkiz3&7H?lu1I*SHchV6l_^i>(^Ra;&)&<)({>{;*0wpZWRGS5)gz*->4>`e-w zK*n`|-`YeuTaZM7sTaAu6sjkJu~$zln7KVT9jZ+s-3}-imR;aJ!?7Zah1*3SFcP?-!ulJDZoC8dSG@b>&B+M zNZKA5yPY)&mq-^r-lN=sNRz5>c|z!Go8SoU4*n;E-Oany9zXB0*LT_VA6;(5OEh5X zRhE#U%Qd0YvMA7Bzc&pcc%{`4r+|(bz}?!f?GHOVI6B1QtpO3`+^4w1+>&1V-67@X>rWDonfPz3^WK%0uWw&SB5Xnu6ID9|Rmcslah1+JMsKpPINW zdvCwVXGVQ3aK~$W>5<`U>2CtF;5u&7SL_V&Xel;07WBmgeHBF|7qiq^%Sgi5|PN1&(8cWAJ8BIADHVJLSS zN^M1N6vNM|;Z9Z-igpKMLAU@v^>qvrPbElU=YT%?peHn0!V@ye!0RFTW9MYoN& zXdzx&qocv2d%UVA#8h|FLJn8z^t6%RmW>`>VtS!okv{tGV_^S5@xM-doo*eeb zYHP|R&=j>yK57oRm+&Ea?(Y7?)yjASa^5@qia72jR-jy3_*LRYGUQ{J?IBho4h2r_ zxRR>ybD9^1XNJ+6wvp~5GwSjwZ2KUAg72`X*PP4f51z+gP8FRc#}0GR=V z3Lv!27(vT;7cX8Kj{rNS?AW_F{wO*-h1b9gWO5r7mJ*txvbFb>JdTs(iEQs_eO13c zp?sb8pZ4#pSmwt&dKVb}>9qTgTG+V^dUWKa2AqCN#1fHZNHV4--8)s+#9{i4%U%}K z_7=?2q5=9Z-bB^HjI8ymDurgG*$x#P^-~^t@atdy94n}_G-vSjI)m2D!5)6?w}S+l zQ)cBvkfK=IQa7EgH1*fc9GCqIn4wRI{8ExVOR6(py!G^tFTVQIEfu|HlNu~9d8E~v z_1^k%mmW>Z%9IA)bn}QSrhU#d1@+m;=YvaJ%h5PdSi^1qL6M9J@I|2U?3T!Tbm~%n z=g1?Y)kQVf*6H$JZ%ADkzL;Vdd;D0h1fp4c(1wHTF{A>{WVE^btWUA(94GTm@MHU`CDQ!3}xWO@R$BH^SuFHAU{^=hoO`Q#r2t7abyjD#&@gDN6P#H8alcNl3sISur7u-a_JNo1r(<0}(n*+CKH;cSXt}mK6lHnQNr@`I@hmHFvF z^c6Q>iSPGRM1Zq;8SrbTPB*{Szi_&Pnmw(DmiWaacv*EZB^n`JGkPlgK2^5AG@IF% z-2CY(d88USq^p%x*X=aqE5qP&u~<*^{fuA zRE3nPmyY1Ae#N{j>$7>-#GCUS?(p+<8B0{n_WAfCPCbngA<#rw#)`ly07c+TH(+>= zxVnBt{?`4&(3JH5m_G8X0cQ6wjqS;;cSi<^$wtC2rj%9eI_A}ielrNUrJ&D0->>tN zcc0thXbBa3Q%(~Zz#DQy@9%v{NJ`j_+|#$A^eJch>uZ8-EW9)vr<^~K4>GV1EdM^R z+>jRWnS7D>ZuIM%*}r-Ij!|vqml(_ zN*TiE|Jcd|dg-R@^rXd|Ec5oO?yc;1sk@-x{fh8^oKGb&^pun}@{Gxm{*5(n&~U0k zd**4_{25NH3W~bb0GRJ6Erq*qmeerE>aaJCsDJ8wcj0$e@Jjxn+~>?kVQQ~q&TtQa zN)Gh4z~W3l_ouGqljx?_2xmxi+hFyy>Y zq`$~C1T}MASbFoVzPibZ&!ielNMYt2u`DXMF7ykjB=(%^%CzHda~OS!*f@HuDnoH5T<@S?=~^*NK#e3TmJ^E=Lshlwdo9 z7}9=^zFB`WRY6|;5&{ z?PkgJ%{l^8>T8At#?x;vipUnC;Up*o%(iZkvmCp$q~P%2%13&n;&A}3Kavl6UDAMo z@;Zmvr%0ZU_j_Y#&8h4usZv7UA9kmt{f0$7q4Ie4(Sb6_acFY*pB4(@UUxSh--+GY zPl=UZY@P>u8TWo~G0Mj&Y<=q&f_-pI?XALOp04-qRa@egw`I>~5CtKlyvr$t2f&h? zoG~RjC~l#<;9PyDK{seN%muxF(`PK4xVPf`myYcKm|$V{FS+0pL3Z}!G%wkP0w+Gd zaxu`qMY6c=>0ji%AGscZ4P_**>GpNv%Oy|*&R?4v44Lx4IY zoB&>h_VyKyos&3!%w_0C7KCf9ld^v>y%}eZ@5%g}yv%`l1!6%Vi@_rbzEp z6nt5=j|SF9;V2VW@6nIKLNMwNu5uTpg z{yen(RR%AlIw!J_-mDx!dycl7^Ii*Im=}a;g`L!68xav6fSIl3I8W1JrdD0e@CJPX{ZmLweKTfI2mV zGm{>C(ycXt57*l{SdJy+r*Zc!mAXufN zURF_9Q~}w(ckxXIL>y&U3Vtn(Assh{S+2gmME&nffFpl8_TWc?;MaZ5-eu+>t;GWF z3zpOO1y2sZI?)FUO7{;I@XC`x8lx!qPg40ymmH<*iTS_B!Xvwr&7NV+2uQWiI|m9S zX48vGF@LxibL7r__opIaA0;r|-ZKeL=mec;U-Y7{_-ZM9Bf2_0b4j_O!}`9*okyLaz4Y*dl0mQBgWL?Ra&i|zSy313toNUVQU zMB^m(2)9hAj>I|)qgY7h_jq}Ex5vJq7gG)u3(g>!SCI~$-2GgfDNFysroxihH zpfI~=LL58RA zlzAZa5v~_%qyFku=Rh|M2yVaKq02*m!Rn5p1W^AcBT7eSVY-yOkngbPktn<_Y$!zX zv%cO7?ft>7IFz|IO$!YSoAO6TMFrOX9v17>Q-ntM_)nhUr|{TUAU4M>3+8?g?r>j_4dnj3gL9p=m165#t82<EKTP71D|Qh6^{Pim>&?4An0q66@7_83D#Ii?Mn&@rZxT9WvV%{E za2~n)gP1GGY)v_9aoq>-5mhDA6T}6$FP-xTanRdQ`YWZuT=qwb#kvEXjYN^9rgHeG z)m-Wx@G6Zxx|FL(BziR^OI$YgAFlEbwipmBvESMm7m4ovz~oq-&xbEK(-fOVM*kr; zhYL4&Av4=_Zgm1`O6)9WQyW=Iz0EH%%F%s!Z&$iuhRt>-pO~EJ73A>(5@Xp2)E*)V zZB5}OH&>(#x;?PGiy1h(V#=aS+)gCpxZ#+%GfT?IL|I!NPFrQwumTL#_ zr*Ygq1p=EbWYcCXbsd-*y7-dMFwLEr6@y|sVi~znT zH}aiem(sE7R4w{vP?<#}p9XI)izl6Cl88THq}Bp@0+gGvI%ctK@7149Jqf1-NRQAO z<|piEWa&kY93aAY)s#Gk-giIihogw1!>H#HS%`H4xU(q=Eh4-4uU?AYf3HN-#Cus; zq@;mFk2t62|3q*O7v0zG~FS*BW|YPOUD=KLaG> z&aHp4l81IU!I`5GVAk56m3f`$o&0CLz3HCIk!kraK}S~|orwhO8I+X#9GiY%90r>5 z6Z9{5P+27E*SRLgS|OZ0TI@d~L)$S5?k|)~|dIIRhT}_@Z@5 zE1;)grB^3BpA>#9=cNI&+|h_5STk$Ip2rg9_a)mV2+hHC2@L*qSjDkC9G84m>C<{d zg0HEY(nt81RDe2ni?p(5vb3kVWSZ}rw$b4lb~Egm&i~}Pc(O=7F#lFu7T?A>F z)`yc~b-5(+N8{2Tkv}wPgTyIB3l9?U(O+|CBgan7ULn18blOP2&x*CDqG`d$6I?c~ zMNtooEI$QELxJN|!&{9+O@|8mwVkHli3+@f`O0NSBh~;vBCfsyz!csMgWzQ$KHm_!iqHZO zDbE`t0F1)qTRpnK2)jT7j=Q2vTjW(0a!{$t*zllT0Zh+5UU zDvWP&sihU(@PDEdeg&G1mxV|Mfpz9l&W)t-SU8K1^LW?Niw-Mi((%?{{t}F%pQGF@ zB~O$+@>YW&Tw(^qFDKfikf;Twmj=uH?^P_j>6lFM^M(l4>|~YiG#jufQ2@l*uj6tc zz1o@ReE){xAm4*3Cz6|7d&y5&E_T4C;bjgeMd9oj=ur{yc+8iNCwO${-xh#Nw%>s50&X8bC^@u_$+Z2L zD}xe0kV@IS|D!GwKv?Ipkk?;{icmbCu|z=r?;9WJGqjQgKmHh--!O%*e*d=Hi`--`c;@`8O76#MT`&mmdZ?MA1_aoCeBxQ|=785CIASw2XcEjB9 zj^%^=DGEjnQRs;)NCh6q`E0JTGXfn&2s<#P0A7X#+D}VM0&+*~M8$&(g3bvKq~}^r zc$vPgoTQS@2?mk(V@7wCL2sUcWcu^bAH^8Z2{Gsq#P6HW(HhUtFG5*UKM7?;C2y*xlr-% zXyUe$={@OZpkhHe4B8|`VKE>Q?R%-hj%~R742lIB2e?S>tvtvcoFi6gOA(4lQ($m; ztd&<(#T>W^%CxF&?=hE?4f%Y$Ty4{N!+RjIIyb^;Kg@v|Rh~{LxRJ4BDjkLP7`Xyd zJ9pFtb?`uTW;0&`D#D%1xncm%$&hjgvy--@lnHDIA&L%ispjP!%(+&r9YvsD#7bcO zP*!x=J@SWb^0G01l0pmG5xT;7Zo2;3Ye?&0vVP3}q7E{cK$}g9!c!i65TJM#YC!Sq z9|YyXa`)r6Du{}iXAqeiFv@w}l)UYMa4MKw9(f&ZK!14LboLK(sO|E8=$&SSlIF>+ z6zjAl3S>>Wtf>ulFHK?c@GZJNiN#U(M*lKY@lqHym%_-n4ij)m$HU@Vm9m51K)GMZ zaG>9PLwnRUK$K4+d-8E1^T+4Ru%6v>^yj`j>xIZEc;kU4bgy7c^908Om#?RSv0p=; zje3zGpKAl&FVkhQV9JuQ zkD?|hC{QkMyiBsCiPa+W+3y*VEz{&Pq6}$>amd9ljjyVGBpFE2vM{c*-rZ3qc_FD@0g_9cSAreu< z8KBu^NlB&@UCjfR6(&Q9v@}4jA@hK50y&LnWXrOWI6xt^z>UidE* zk*R-#GyjJZWqBL$>_iXHg{T4#eD4ST9r}1^sAOix+5&`t=+@K}lu8tbJDC+8iq(;u zNC%FAv6m7*Xtm?S5c(GKVcz>^;! zM$K42j58DiT&qsy(Gn9-V8+gJS_h}SmzmPXJPKqU4`dnlQ?e|`=UL6y(@&XUnwmZ# zN)KC6Vf|Q)!bQfCPOODZ@h6j1Y;`}_?zFS1_hFqS!ipS4!Xt>u<*5YH6{Jk7)L9-n zBxT94DH0t4JUg7ZKR<{EFL_CB^Z>?pwF=OL?FXdShl;Uha-Z^CW0gT|H}{PR%ffXH ze_=`wAa>r#7UpH2GPgIKNP|M}Y-}Q+8`C?nh|`^m&ladfhse^Xo?kOkB{^cBd(+fA zsC>#ZXCEqAosgn!b6%ZvjfEzk6QEpX^KEI?v@p3N{**kx@dxgt4G00aQ^F#NijIIR zXx;;|xb-r937q?*tehf@+nuNw1<=toA6&Bv@l8sVM5lW}^@cBVr2xp`83=XA7;R=t z^|g+2ZVs79`y_it>P^`CYMr+fo8EFP(WEQvRn?c}y7SJ^Es`#&L0uNl&4Zj%1{s@( z4tg;=fg{kXpXeQv11ii|){`8|)5rvrin6N!8^d-NurZ!-P%LWuB}elE8xZOXdOH38 z0;!;fQ>F_FnKsVZ2Z3yfYK~*ry^slxHv@>at6yTJWqw#%uGWl<|Kf*t-ZZ9l#UvxV z+>TpD|3VOvp`>`y*%R0l=^uU65Tlp%r}PT{!|qYcf5<3p`hKpPK-ejl*Al;iFCm2S z#3K@bx7Wrv1+A}tas>q$M2uf_3_apZa*ZX(@V1Qx2{+;&@0XwXmV%7(Ji5w&7Lch(egE#*D;D4iPFZV|duHfNxv zx_*D}{Xh_@+Cpf8eYbOyKGdIbk+CZg3~9aKKzg5*Gr!s(ZU(l~A$mJ)sYn8wu5Qp+2so%LL)L-}HI zq3Mlln#U8%56`&iTOD$MB+apTu^R_Vz#HNtvSNH z?os{+RN%IMdV5pkf*(da?{@6e(js-u`En!9r&mSZIw%b34`gk|i!bjj5B%-ySO)hXAe=|wzjstB!hfnm`PnvtAbIdcoe2<6+QhSF5ydM5QHWp|$MWM-}g zx>^avj&@eha^Ib;*?Obay(5HF$fR@GW&UOpC=uxWWtDbWukbdf*OXmn1L|>og#09m zFqQ|<;~_wg=C4u!_wEGJ>D(?R0mc4ualwouEpJw_9!^KTI?)^qXZ?2wqbd0_MnC*M zus_KrV@7C_Em-9N(pLv7*RNAoJ1HzYydwl<5x)1W31e%XSRqxcSoLwtpMCOL)m~0m z%}vKK%e)uW_{nWJ$iSH1@JKw6`x}?b`S07eyzqtJ{H-adAsf>FeNiKy!skNj5W4bE z=w*CB%?EJz*-vP#00esO1l56ZgGrn|Sk+3pVIK&gb>R`PXYaUH&D0qHI?!}7*|D;y}fPkr4=hSeQRJ(eP!sknQsEMZ)EnU6)tc7 zjwyh>FkSj1zw)P9&%*sUj6Hgp71r)Qigvsp(sdfLyH6iZzV^>l*5MBRYSx@P zzT;qE{<2VUoK;tQwrDAE?_?&7$gVVf!jO#j6u+yQ5@r?*O$BoPVow0tVRh5ObRt&PiAJF%9!*}6ZGGN+c_${4ad`hP85c|4Tg8?A(-NGeI9uY|Hwc0#sn z*|&zWM%FM>#uzP9S+i7@u|z4mk#(3UvagY4Y?FN(GZ<#@n(=$(=TCgzdFS5eKF@j1 zIrrY}w4f~J3bj)W74;=GG><39OfQBybw97FfS*;v(w0GNn?O=GX`NA^x)QG_{8#cO z?amL!FGW1Q(`AsfIF^=m`crznwJug0so^RBOphoi1jM}0tRz1Sx;xraL``V4S~Gug zmHW0FFSe$fYeogoM+#Ib$z{@MO-@h2mXBhXNtFCaYuf?5!RpT@z#*LeiFh9Nkd&c2 zY~_Zs34{N9q#nG)DZWHGCikAqxdRVPpz|(}BPUxJ+S#Lvxn1Xc4HM$q%CBucoACE~ zHA1R>3@>o3)s&HVrBk7H3?2B1s0{#yJzxb}11ngk*e7E5D8D!m3kFL~4*_G~9nv@S z2HtdNVR!M73*Ny@s(Bp3u3W-IJ?*9rk5M#ZSo zn=9CQlvzIYdo6b&v+*b-<86ygUREXR$g}wHeO3jl;Y|{nCzp@yLkm4EE!nvH_^#K% zVCN&Z1ISZg;+U$$TVJYNM2kM^>7Ox?D(zQ5%Ms418Y8F!9HSEq8pUIgA$ zv`N&~IA@v!PJs(#D7whVfpTg38~aHQbO>I?FlH9+gfz{sgwqkV^W5P?UW~-|8s5Y^ z{dZ<#bps#DXV{7B^7n@5yvHTaajG+DGG zV)V&W?}~#Z_twM^VXdn`3z_)`Cht*Yr=7-U_D%k?CGp`qVxD{8Pf~Rd=DMR3>XYBc zTPnxU$0QSD^L+5v2L7e=tz)V%%RYf$YAMx3@UUf2Dkq;*5JA~m?v|Sa4?HHBFXwl zF!e&DEAE7?3DQed z&pBPmra0nsCt<#Pj|1H(T(%XJ0M?TfO>~|n6j-_R9?_%ZhD1*6)<*@f;vLv*gqFTW z_zZ;u+90ay5!%379sZ>q)dNHew_n*}*dlFW$v|w!@mYTVo~1KNDA~w~S?vtVJG3z{ zBfKCg<*A8}zizuCwm=+Vbd&0+&xqJpnOHVyH9STf&d1UY{}o6Bz-K$T?x8-QgsKzc z>o$*}nU7;yl^e2S)gX3Wp1O*T+W3LpJF0#8H_J4(~f(S9u)iD00p`89o<) z@Ut$Sej>|MOR)^4qM;sZx2{A^hMHV{oEz|nz6VIYyozn?osSwk~xai*BP31gSB#ACFOUuIG8 zONroHD9*H{RMLv-K*Kz2REUlUCB!`s(h_ca=%z}7>vmzynC4?mo*LEsgvHZeujg7m zzOR;Nv9fqW&%N>6z!MRbASjC~tx8)E{?`O5O=l<-;&6W%a2#=8YMWVM>G1u99%Ux* zj1bHMO|$1FqLsYTiyH9uHW4Cp9c+0s04CbH`kbf{=~z0B8c>$m^e2A>;#oo2B!AW{R%vAr}h+y3kYsCKmIXo zHYy-gqjnxx*jAxJIO&L?T>a%-J=5(BnMeJpEBs7Q~cvhX?a2XqebSZj~!r{OD6!U^&`nGMctN=nl35m-s`U|93AYJ>3=V!%= zX8xlO0}A{sp<+KEC92YoOuSzOMv9TqXU0McpXS9sXSc0#3PBAe6)e#P>FV+IO|mO@ zv$&7oU!1z4!gIl!^l5!En@$&|5+d6VhUMOVw(#X!rH3Iihj#1Jpuuv!3}Ws*)OYr7 zXy5o9Wxvzix_=yJ3vCK({tjh6y`kqDT;zY#0Eu)4K^RZyoJAh#$JrmIjYQnzHQzm!xMPbDvu5*GD7~-G(JOFvsnSKSCm)L+71dtlfAah{1t$Vu}hr zyPTjAxk+2CZ|l5BBk28q!mLY)EaDjBRfIboQ3!HS%@Nb2T-5y#l|`?-d-s*y$A3qU z^2xv@oC{t`%x1l7q4$Ejays(2``ZBE$1ch=Irwj6&qpcMhIJ!*5w)0@(5vtVB8iqv zq;>5mYUhKO4Pk7t{U-X!0n<N9Z-X%9#|+UwJGRJNYu&B!h4a_ROp zS4o*ybxyD)GlAM9%-~9)8zw;`B^O7?#8Kiz!?{m-^d>$t-fDZ7U#MA0E|2+zP)IwK z2GsOhuG^P9)JqN+IBzPn;Byoab4WSu)H&Nc>1CtH4=5%)Qx(@CHAO-Ap3>|ty#@dQ z&B0vWIf~~DL66S$6C%MvXeZJNmO&O#l%0O@L|p32F>Q9pC4?wEDlXg=4`9joCdyt40K?3nl7b=_dr zg=s#Le7K_YS!pvrZv3tG2j`wjRQa90=C0fa-UK_-Wahpe3S`uaThI>71WwWoni3Tzu5tz{4j-8?8p$fM$@x*sW-C>`<9sXAL!Kwh z=d!m{^H|eY;CV&HlL0;7*>?^Bf0G0hXW-No{(>{@aC2OSw0HC(@Zd)b;)8&arH3zM z!b9}8`+d|0HS&#&+FqJvpsromMuX8k5z~BO6_%zl;}5VjDX|~p11GlaZK=L5d5ua+ z35GbLOV9pWW&pE$4?8>D*LWmB1SX`3o-ZXv+EN=G0|kg=R?zvf55(>C6u{0#(a*e6 zx4}9p@w*(F2CTgjL#%JomQUNN3I^tli#nY#|EXPd+BI?x`=}A?a7C=Kd5cb$ zejQ4vXysVBmbH74%kSu*RNX7N52WGjXI`0d*GIdWdkI6Ey0i1n0!DzM-CXZ{AUfK7AqK`ER&h8Cc@R&kKYloZ@POUNOP zN&Y~WEtFyj*6FtI5txvpPZk9B*S+o+1d6S$ZTU{z;ZtbI#Azc81zuTx?OBRvY3l;YO{$TmUwF;$LZp|)8QoROe z8r*byagHoEjLg(OSj}GCdo@VD4&R?&97w4cK|qm?*a7vW78q3J{rHH!eSukj@E=Q# z#p9Yjvx0|bcRf>^Y-V@w6W&}U?}lFWNOm=H@Jw_aqo+tG|M77@VJ>(ne+R2`c)r-~ zy5X7A>?TU{s(kAZ)I_w69?f>}C> zxm|g>;avzU9b`;g%ZQ5^#OBil*Iz|#%_^hILksrR}m$$p-;Av@3(aZ&jT4JppWhhKsx4FQ2LWotXM+@{*)`80JXL zeww@Q0zfu1K$rhNh+uR63c&H6-g+&4Ka4EEqp(389#%@U)1=x*e}Fj5bQX;aoIyKf zlE_Non=4FtyS-wO+)0Frwo>x+CTus~>0E~%+$JxwtDPGev%aQji%q@j=e~(%irVS) z6b_a;SB3G!@U;vP?)e`RQ0qO6arL>dOV_{^fYBW%hHm8D}KOd^l+_FK1$ z@-71fE_EXcT`vvJniYNyO5o4g?PaNeIBjV9R1G~RxwrPez2%cvTLwqty!WX^y3)aL z4{?iQsMKQ}lIfgjz>|ZQP=P)qt%&EZ#N>Xypx~&p5s_6JlA6+h?=zFkcQ9BOk`2ei zv_Jxg)}VNl??MDFIcEQ)DfocrNthHQS1t>+SL9kJ-0&6vFA_CDOt{qM`czk9{1pB8 z{NwswRM2_p2z7wmlXS2c69n|4>GVkWKkOdgIqin!7=EP5^9LGVAHyOme>(~B@XG>O zZWNjM=HEJXo#ax%c;2GAbcB<8(s6NBd$F#BXCuCtHv44*3t@Nh2>H*skCO5}% zC2IK)D(*z2r5UBM(JyR;UHq)FGFV*_XT1W1uh}WxPAD3GG^uc@I$pbIWaHW)MRiiX@Y! zMlvdH_RrZjJUKgX);3rTr(yZWx_r{6o^l6k+7|Ys6?ftq@}fEN>|ovece0SOe9R0?IdcVuQ@)q?3az6jT3o_X=?NewS?Fw-=@x@EKHZhy2)XgNv z2HX%dleph^N8VH5GQGYu?Zy*8c6&vq+W};`gK!iFn|U<}S^6*Wbg&JL-v;i1bxh^v zLvYqVzq@HO{p#^;IM-dM?~=Ban$b~J2PAQnp)LVv-r5$5NA)9KFQ^OlZpOQ9X*PeW zR_5FG4xd}oTX z!WQ}EErwNFtR3{ec8^H)>V>ykVyksTN^sht-bHmhz2pHy-QgfaL3Lng zEaT(d5Ud7~Omo=1I8W{!8&w)L9_-UkxgMY`R@fHUZ1$g?_v5%3(?c+g;*|$0D)Ic~ z;ECS&%B&)d?U|H`f&fVS@QhfaG8x|dJtD(Y@XU5hHB=&-pr7LASs?o$>9*x{v(0NC zFAWt6Zys6RP4qB<*l(=10%-VXIJ{G&U0uF>nVd+*k->|gq$%v)YabLrm!$M_VvDXB zRg(a6&hvG96XO+^$K>Wh+JpE9cp8_?+vVQ6bYF$}(XU4XoGkWc+LV?HhDUQ+F6_2c%ym2Ajm*26MOvY3EA}LPI$QfG(LA&E#=PVG@z(_Z0s99& z74b}Mm+D1SVy1bzpVDY+bL7B;g9PXwPXuhK7KwiW2vWfmG+%cy;IN)Sd|4&TTfr_+ z!n5wJ7yD%^u@%IxsS_@NhK%7Vx=8et9&aW|S>uI+QBQ(*d-b~;ex#AgpBq9|OGkAO zOV1vfjPHJXM(NC9?x!SSZ!s-5cZ4(Bmb@ZvmX`BsqN`j$v5mV0E#k=q3n4PVJLiDi zgHF;y@7x; zf>^)%AiCmF@+HMtL7>JIuIb4hhWPC#x)Y<5su3fME9?9y$uw7x_4zc~%FY1=a)Tn0 z#EhHH-5;-EuutZn zbTmyXmLYi@*4ayK@2HDy$oTHblnT5v3|O+7_k_HYNn&cgKKPjbxoydB&cd_$!}cff zUJvw8f$}-MgODP{Qqtm;CwQ?R{2eBn`^HPqH$N|-qUSGi`Dw~))Huj7I+}z$UE2ml zxQX#bIa+#6hU^hiQ|VIDy8*-UP{(P-l0MCI(~@eBuV;f^)eoB7rH&^Z9;FvuDjO2Y zQc~vQk{)NPd2@J~1Rd+>h&`_2j5@8&KHtc|zTO7dTMuA{pgxsJ97r)+MLa}m@c$+_ zdF|C>uFKPOn=Rig8*+6$y_I1aU8f!V$!41UwKQ;kll~R~7u%{}wCe zeHU)_KPxLVm=o*X8Ndx2|AktJR&rodkX4)X1W!LTeNt<1f1F*UPgUpS7U<*!P4YEl z94`8xc1-+47x?y^5Y-AKYs4_MgPK|9EJI}{W2v|zxm>>QiF{DdK>Tud4@$l_Fq|JCh&cp6J@ z+2U@>#>s1@oKzZfC&9`5A1;%{y+%Q#z(BZklNQlKh?wK3cIb7z>QS5*lU$9xIB@Ui z*}D^Qb`XrxuF_F$r>>FU_hoB^tY~)mFB~;R3(7*TK}6HE+ta2F15*p5iR@* zuuW9bmbQ*>|RYg{98U**DxV+tZhWhv}!W|&Pk<*{u{*`FT zvGSc0XH1P+fVtGQG_!vd)x|{UKM(6%`$*xQ( zNw2CXtgRz9L&?SVE#Ld;W;exWTcvZ521$X<*~@yo(>qqGfi{0rFxhYYVc!!>#>U30 zc**yl3T)6Fk(mR#h!Hw1;$UUCU%CQhuTzac_kseA7gWTCL44rwjtn2Pj?JuF{z-d$ zJCXA;Asa`o9tkQTzk-L)!2Y5zTx{HL1ld;|Vr?WYS>KTwf)%V2Gk2TV=cyGX_%`dts zy$Y){SJjV6sPFe}GU5whvQJj>Z|fGdlF7nxq%Fye8aMnlsbR*;g$9Do4W5rU)4DyZ z?LmMRK6kSjb6mI!E)6ztYzW}=*um-as~%GTTsRx|*3*zHIKwJ~*;RzGqMhkVD6g0v zX&o8LY88>_Fj)4gcrrrX3}$Qz&giSS@m5VK>Z&n1TXW9y|Cab{^aulOE7J>@97?iN zb4)I)GB+u!gumKiG*D=HJ3zz#$AB$?t{(s|KI=N426zKN2MI^p_GKod*;%N$ebtJH zTa`|0(wGT0SvD>a*5_abGCa7O+nRbXd#gW6xa+fF}_RJz4+6H`{A8H-hnfX*T$x1 zTQ;a%5(OXfKGY9nBr(qc2_LUb@p)_70jfnX?`Pr}MLNz?Bx(cGc zx%m;~6HRn1tCHl4=DgD)eet}X#aV)F9=J%j`&{*Ycr_8~jBlFD*o+0uykkhD+Ch6a zf3!mq*Y!wdd4y}0t_1GnA>$}mn$;5{)zrT8+hWFVEQX|@;1%^FIk5}s;Y7RTW~^bz z9kKQ3Ia$}Qx3el80(@ZLFg1g_Wq1b(Jn~2$5xJ5(2Wc`mp4jr(RXGms2!p8;$?Tc9 zo`-v=%mzwN<|IOo;1;vwS4;tKL@0!a@S|Uo5Dnj-yTS}jL)Y1LA;*`Bg}&JT88g!I zfd$FxgPIKq^p37kXhT>372_1i=ftNgkdSr_aq#F?#smggLEGisczt9yRE8m$r)3LK z>oB?k-wsmnx)-ygaRrq7$Te459Jgzntek^w(#y`tDfHfI{%t~$12tR zakBM4ZmzAI9#&k{Hx=F1xfSE45Ki2zW_I=a%#S*eu+K~IrIEtE<8T|h^nn8o{p#@q z`t4UnQup!fBNz&3v8bTXJT&%D$aNK*M!!CLBJIDtDY6qYVOu2)>N#-ukimTFzDm&+Mg*RS$m%B6h((I+Q`mNTL^Y%GX=!9VtpN(dPMw-J%|N=pB#7A zd?w(rvaHe_qedINdOsQ8dxd|D1Xzecw&B(c&Nzk(8fkI+kktkT;UjMHEM zN*#Qh2m)Q8LjYCH-fckP{vKk1;?X|URnR+S%F8?ROG+jC_tPcT{#l;GZqKZQ28C*u zzh+-h804OFZ$E;rlH<4!Ng9tZhMn9|_XL&5UApl>fy*%3o!=`WiM_9X?Iz{L0s!D1 zzaiva{T^e0G2df3^?Ix0>z6Z{?L1ofM+$!B<)3HizcKrodhM-U9IqFfC~?kxq_2H= zyDzdtD`co$t0iTp;VRsDAWWL0gcKEFbwK7ARMpXP@Kl@T?U<(cqc zIE=LeJDNDIRELuSd6mk8HX{c#+Ian-i2#6tANcLJ<>~>Ovh}YWjrh)wf(mx*0@9U7v6oFb0;Eh76eGnaQ==C4_@cVV1VAS8h@d@P=N$ zVFU3D$I!;$LX`}@elqqe0 zW!iz@Sm&U|HQvX6e!c0q;|3ZHqRKzwkPs?id(~kzt1ceGS2=N9<3}0$;eJ~9x?{T5 z+yp^n7>Ud|$hL4UHye&tbrYlrK%Sx(Y<+iGc;*)bg%#DUR{^o3Y7-j_?yx?wE%kgH zIeLLiNyp(J|31?Ix#McXu@yE%@Q^|7*^_aEZOLDfuBNIHiZ6-E=l&2fKjLtn2mdMs zDkkD^yI|P+U*$t%Eh}Wg7#(yh(Yt8?eO$)(AFZ;&049)|l?Np=bZYN%t7MJDb#k8+ z@R0&T?=eo(5hQ@@#PsipY%mdw^DXG4rP_`C7YDcI(wY~^`#gWm9%D29Uzd8KUA>dm zcZ|@+0ET=SjEZ;rzYT4C;fni#cDhFH&RCD@+W+HA3XQJQL&zLK?kWER_WPSg{l*=y tk=DWOUTXW#=cE#xz%wXQ+c>uO4x{DBy<3pvtB1fJ109pw#aj2D{|{<9Jv0CS literal 0 HcmV?d00001 diff --git a/anime-sama/anime-sama.js b/anime-sama/anime-sama.js new file mode 100644 index 0000000..bb9645d --- /dev/null +++ b/anime-sama/anime-sama.js @@ -0,0 +1,340 @@ +async function searchResults(keyword) { + const results = []; + const headers = { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "X-Requested-With": "XMLHttpRequest", + "referer": "https://anime-sama.fr/" + }; + + const regex = /]+href="([^"]+)"[\s\S]*?]+src="([^"]+)"[\s\S]*?]*>(.*?)<\/h3>/gi; + + try { + const response = await fetchv2( + "https://anime-sama.fr/template-php/defaut/fetch.php", + headers, + "POST", + `query=${encodeURIComponent(keyword)}` + ); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /

    (.*?)<\/p>/is; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const seasonRegex = /panneauAnime\("([^"]+)",\s*"([^"]+)"\);/g; + let match; + + const seasonUrls = []; + while ((match = seasonRegex.exec(html)) !== null) { + const seasonHref = match[2].trim(); + const fullSeasonUrl = url + '/' + seasonHref; + + seasonUrls.push(fullSeasonUrl); + } + + const seasonPromises = seasonUrls.map(seasonUrl => fetchv2(seasonUrl)); + const seasonResponses = await Promise.all(seasonPromises); + + for (let i = 0; i < seasonResponses.length; i++) { + const seasonResponse = seasonResponses[i]; + const seasonHtml = await seasonResponse.text(); + const seasonUrl = seasonUrls[i]; + + const episodeScriptRegex = /]+src=['"]([^'"]*episodes\.js[^'"]*?)['"][^>]*>/; + const scriptMatch = episodeScriptRegex.exec(seasonHtml); + + if (scriptMatch) { + const episodesSrc = scriptMatch[1].trim(); + const fullEpisodesUrl = seasonUrl + '/' + episodesSrc; + + const episodesResponse = await fetchv2(fullEpisodesUrl); + const episodesJs = await episodesResponse.text(); + + let episodeNumber = 1; + + const oneuploadRegex = /'(https:\/\/oneupload\.to\/[^']+)'/g; + let episodeMatch; + let foundEpisodes = false; + + while ((episodeMatch = oneuploadRegex.exec(episodesJs)) !== null) { + const oneuploadUrl = episodeMatch[1].trim(); + results.push({ + href: oneuploadUrl, + number: episodeNumber + }); + episodeNumber++; + foundEpisodes = true; + } + + if (!foundEpisodes) { + episodeNumber = 1; + const sendvidRegex = /'(https:\/\/sendvid\.com\/[^']+)'/g; + + while ((episodeMatch = sendvidRegex.exec(episodesJs)) !== null) { + const sendvidUrl = episodeMatch[1].trim(); + results.push({ + href: sendvidUrl, + number: episodeNumber + }); + episodeNumber++; + foundEpisodes = true; + } + } + + if (!foundEpisodes) { + episodeNumber = 1; + const smoothpreRegex = /'(https:\/\/smoothpre\.com\/[^']+)'/gi; + + while ((episodeMatch = smoothpreRegex.exec(episodesJs)) !== null) { + const smoothpreUrl = episodeMatch[1].trim(); + results.push({ + href: smoothpreUrl, + number: episodeNumber + }); + episodeNumber++; + foundEpisodes = true; + } + } + + if (!foundEpisodes) { + episodeNumber = 1; + const mp4Regex = /'([^']+\.mp4[^']*)'/g; + + while ((episodeMatch = mp4Regex.exec(episodesJs)) !== null) { + const mp4Url = episodeMatch[1].trim(); + results.push({ + href: mp4Url, + number: episodeNumber + }); + episodeNumber++; + foundEpisodes = true; + } + } + + if (!foundEpisodes && seasonUrl.includes('film')) { + episodeNumber = 1; + const allVideoRegex = /'(https:\/\/[^']+\.(mp4|mkv|avi|mov|webm)[^']*)'/gi; + + while ((episodeMatch = allVideoRegex.exec(episodesJs)) !== null) { + const videoUrl = episodeMatch[1].trim(); + results.push({ + href: videoUrl, + number: 1 + }); + foundEpisodes = true; + break; + } + } + } + } + + return JSON.stringify(results); + } catch (err) { + console.error(err); + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + if (/^https?:\/\/smoothpre\.com/i.test(url)) { + const response = await fetchv2(url); + const html = await response.text(); + const obfuscatedScript = html.match(/]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + const unpackedScript = unpack(obfuscatedScript[1]); + + const hls2Match = unpackedScript.match(/"hls2"\s*:\s*"([^"]+)"/); + const hls2Url = hls2Match ? hls2Match[1] : null; + + return hls2Url; + } else if (/^https?:\/\/sendvid\.com/i.test(url)) { + const response = await fetchv2(url); + const html = await response.text(); + const match = html.match(/var\s+video_source\s*=\s*"([^"]+)"/); + const videoUrl = match ? match[1] : null; + + return videoUrl; + } else if (/^https?:\/\/oneupload\.to/i.test(url)) { + const response = await fetchv2(url); + const html = await response.text(); + const match = html.match(/sources:\s*\[\{file:"([^"]+)"\}\]/); + const fileUrl = match ? match[1] : null; + + return fileUrl; + } else if (/\.mp4$/i.test(url)) { + + return url; + } else { + return "https://error.org/"; + } + } catch (err) { + return "https://error.org/"; + } +} + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} diff --git a/anime-sama/anime-sama.json b/anime-sama/anime-sama.json new file mode 100644 index 0000000..5c909bb --- /dev/null +++ b/anime-sama/anime-sama.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Anime-Sama", + "iconUrl": "https://cdn.statically.io/gh/Anime-Sama/IMG/img/autres/logo_icon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "French", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://anime-sama.fr/", + "searchBaseUrl": "https://anime-sama.fr/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/anime-sama/anime-sama.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/anime3rb/anime3rb.js b/anime3rb/anime3rb.js new file mode 100644 index 0000000..485bae1 --- /dev/null +++ b/anime3rb/anime3rb.js @@ -0,0 +1,228 @@ +function searchResults(html) { + if (typeof html !== 'string') { + console.error('Invalid HTML input: expected a string.'); + return []; + } + + const results = []; + + const titleRegex = /]*>(.*?)<\/h4>/; + const hrefRegex = /]*>/; + const imgRegex = /]*src="([^"]+)"[^>]*>/; + + const itemRegex = /]*>[\s\S]*?<\/a>/g; + const items = html.match(itemRegex) || []; + + items.forEach((itemHtml, index) => { + try { + if (typeof itemHtml !== 'string') { + console.error(`Item ${index} is not a string.`); + return; + } + + const titleMatch = itemHtml.match(titleRegex); + const title = titleMatch?.[1]?.trim() ?? ''; + + const hrefMatch = itemHtml.match(hrefRegex); + const href = hrefMatch?.[1]?.trim() ?? ''; + + const imgMatch = itemHtml.match(imgRegex); + const imageUrl = imgMatch?.[1]?.trim() ?? ''; + + if (title && href) { + results.push({ + title: decodeHTMLEntities(title), + image: imageUrl, + href: href + }); + } else { + console.error(`Missing title or href in item ${index}`); + } + } catch (err) { + console.error(`Error processing item ${index}:`, err); + } + }); + + return results; +} + + +function extractDetails(html) { + const details = []; + + const containerMatch = html.match(/

    \s*((?:

    [\s\S]*?<\/p>\s*)+)<\/div>/); + + let description = ""; + if (containerMatch) { + const pBlock = containerMatch[1]; + + const pRegex = /

    ([\s\S]*?)<\/p>/g; + const matches = [...pBlock.matchAll(pRegex)] + .map(m => m[1].trim()) + .filter(text => text.length > 0); + + description = decodeHTMLEntities(matches.join("\n\n")); + } + + const airdateMatch = html.match(/]*title="([^"]+)">[^<]+<\/td>/); + let airdate = airdateMatch ? airdateMatch[1].trim() : ""; + + const genres = []; + const aliasesMatch = html.match( + /([\s\S]*?)<\/div>/ + ); + const inner = aliasesMatch ? aliasesMatch[1] : ""; + + const anchorRe = /]*class="btn btn-md btn-plain !p-0"[^>]*>([^<]+)<\/a>/g; + let m; + while ((m = anchorRe.exec(inner)) !== null) { + genres.push(m[1].trim()); + } + + if (description && airdate) { + details.push({ + description: description, + aliases: genres.join(", "), + airdate: airdate, + }); + } + + console.log(details); + return details; +} + + +function extractEpisodes(html) { + const episodes = []; + const htmlRegex = /]*href="([^"]*?\/episode\/[^"]*?)"[^>]*>[\s\S]*?الحلقة\s+(\d+)[\s\S]*?<\/a>/gi; + const plainTextRegex = /الحلقة\s+(\d+)/g; + + let matches; + + if ((matches = html.match(htmlRegex))) { + matches.forEach(link => { + const hrefMatch = link.match(/href="([^"]+)"/); + const numberMatch = link.match(/الحلقة\s+(\d+)/); + if (hrefMatch && numberMatch) { + const href = hrefMatch[1]; + const number = numberMatch[1]; + episodes.push({ + href: href, + number: number + }); + } + }); + } + else if ((matches = html.match(plainTextRegex))) { + matches.forEach(match => { + const numberMatch = match.match(/\d+/); + if (numberMatch) { + episodes.push({ + href: null, + number: numberMatch[0] + }); + } + }); + } + + console.log(episodes); + return episodes; +} + +async function extractStreamUrl(html) { + try { + const sourceMatch = html.match(/data-video-source="([^"]+)"/); + let embedUrl = sourceMatch?.[1]?.replace(/&/g, '&'); + if (!embedUrl) return null; + + const cinemaMatch = html.match(/url\.searchParams\.append\(\s*['"]cinema['"]\s*,\s*(\d+)\s*\)/); + const lastMatch = html.match(/url\.searchParams\.append\(\s*['"]last['"]\s*,\s*(\d+)\s*\)/); + const cinemaNum = cinemaMatch ? cinemaMatch[1] : undefined; + const lastNum = lastMatch ? lastMatch[1] : undefined; + + if (cinemaNum) embedUrl += `&cinema=${cinemaNum}`; + if (lastNum) embedUrl += `&last=${lastNum}`; + embedUrl += `&next-image=undefined`; + + console.log('Full embed URL:', embedUrl); + + const response = await fetchv2(embedUrl); + const data = await response.text(); + console.log('Embed page HTML:', data); + + const qualities = extractQualities(data); + + const epMatch = html.match(/[^<]*الحلقة\s*(\d+)[^<]*<\/title>/); + const currentEp = epMatch ? Number(epMatch[1]) : null; + + let nextEpNum, nextDuration, nextSubtitle; + if (currentEp !== null) { + const episodeRegex = new RegExp( + `<a[^>]+href="[^"]+/episode/[^/]+/(\\d+)"[\\s\\S]*?` + + `<span[^>]*>([^<]+)<\\/span>[\\s\\S]*?` + + `<p[^>]*>([^<]+)<\\/p>`, + 'g' + ); + let m; + while ((m = episodeRegex.exec(html)) !== null) { + const num = Number(m[1]); + if (num > currentEp) { + nextEpNum = num; + nextDuration = m[2].trim(); + nextSubtitle = m[3].trim(); + break; + } + } + } + + if (nextEpNum != null) { + embedUrl += `&next-title=${encodeURIComponent(nextDuration)}`; + embedUrl += `&next-sub-title=${encodeURIComponent(nextSubtitle)}`; + } + + const result = { + streams: qualities, + } + + console.log(JSON.stringify(result)); + return JSON.stringify(result); + } catch (err) { + console.error(err); + return null; + } +} + +function extractQualities(html) { + const match = html.match(/var\s+videos\s*=\s*(\[[\s\S]*?\]);/); + if (!match) return []; + + const raw = match[1]; + const regex = /\{\s*src:\s*'([^']+)'\s*[^}]*label:\s*'([^']*)'/g; + const list = []; + let m; + + while ((m = regex.exec(raw)) !== null) { + list.push(m[2], m[1]); + } + + return list; +} + + +function decodeHTMLEntities(text) { + text = text.replace(/&#(\d+);/g, (match, dec) => String.fromCharCode(dec)); + + const entities = { + '"': '"', + '&': '&', + ''': "'", + '<': '<', + '>': '>' + }; + + for (const entity in entities) { + text = text.replace(new RegExp(entity, 'g'), entities[entity]); + } + + return text; +} diff --git a/anime3rb/anime3rb.json b/anime3rb/anime3rb.json new file mode 100644 index 0000000..26270ef --- /dev/null +++ b/anime3rb/anime3rb.json @@ -0,0 +1,17 @@ +{ + "sourceName": "Anime3rb", + "iconUrl": "https://anime3rb.com/favicon/apple-touch-icon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.2.0", + "language": "Arabic (SUB)", + "streamType": "MP4", + "quality": "1080p - 720p - 360p", + "baseUrl": "https://anime3rb.com/", + "searchBaseUrl": "https://anime3rb.com/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/anime3rb/anime3rb.js", + "streamAsyncJS": true, + "type": "anime" +} diff --git a/anime3rb/iconalt.png b/anime3rb/iconalt.png new file mode 100644 index 0000000000000000000000000000000000000000..64d7e6eff510accc92bd8a21eaa56316cd7d5590 GIT binary patch literal 48834 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 MZKCz*{^OVb19h;nU;qFB literal 0 HcmV?d00001 diff --git a/anime4up/anime4up.js b/anime4up/anime4up.js new file mode 100644 index 0000000..41ed367 --- /dev/null +++ b/anime4up/anime4up.js @@ -0,0 +1,165 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2( + "https://ww.anime4up.rest/?search_param=animes&s=" + encodeURIComponent(keyword) + ); + const html = await response.text(); + + const regex = /<div class="anime-card-container">[\s\S]*?<img[^>]+src="([^"]+)"[^>]*alt="([^"]*)"[\s\S]*?<h3><a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a><\/h3>/gi; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[4].trim(), + image: match[1].trim().replace('ww.anime4up.rest', 'www.anime4up.rest'), + href: match[3].trim().replace('ww.anime4up.rest', 'www.anime4up.rest') + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descMatch = /<p class="anime-story">([\s\S]*?)<\/p>/i.exec(html); + const description = descMatch ? descMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + + try { + const response = await fetchv2(url); + const html = await response.text(); + + const episodeRegex = /<div class="col-lg-3[^"]*DivEpisodeContainer">([\s\S]*?)<\/div>\s*<\/div>/gi; + let match; + let epNumber = 1; + + while ((match = episodeRegex.exec(html)) !== null) { + const hrefMatch = /<h3><a href="([^"]+)"/i.exec(match[1]); + const href = hrefMatch ? hrefMatch[1].trim() : ""; + results.push({ + href: href, + number: epNumber + }); + epNumber++; + } + + const paginationRegex = /<li\s*><a\s+class="page-numbers"\s+href="[^"]*\/page\/(\d+)\/">(\d+)<\/a><\/li>/gi; + let maxPage = 1; + let paginationMatch; + + while ((paginationMatch = paginationRegex.exec(html)) !== null) { + const pageNum = parseInt(paginationMatch[2]); + if (pageNum > maxPage) { + maxPage = pageNum; + } + } + + if (maxPage > 1) { + const pagePromises = []; + + for (let page = 2; page <= maxPage; page++) { + const pageUrl = `${url}/page/${page}/`; + pagePromises.push(fetchPageEpisodes(pageUrl, epNumber + (page - 2) * getEpisodesPerPage(results.length))); + } + + const pageResults = await Promise.all(pagePromises); + + pageResults.forEach(pageEpisodes => { + results.push(...pageEpisodes); + }); + + results.forEach((episode, index) => { + episode.number = index + 1; + }); + } + + return JSON.stringify(results); + + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function fetchPageEpisodes(pageUrl, startingEpNumber) { + try { + const response = await fetchv2(pageUrl); + const html = await response.text(); + const episodeRegex = /<div class="col-lg-3[^"]*DivEpisodeContainer">([\s\S]*?)<\/div>\s*<\/div>/gi; + const pageResults = []; + let match; + let epNumber = startingEpNumber; + + while ((match = episodeRegex.exec(html)) !== null) { + const hrefMatch = /<h3><a href="([^"]+)"/i.exec(match[1]); + const href = hrefMatch ? hrefMatch[1].trim() : ""; + pageResults.push({ + href: href, + number: epNumber + }); + epNumber++; + } + + return pageResults; + } catch (err) { + return []; + } +} + +function getEpisodesPerPage(firstPageCount) { + return firstPageCount || 12; +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = /<a[^>]+data-ep-url="([^"]*uqload\.cx[^"]*)"/i.exec(html); + if (match) { + console.log(match[1].trim()); + const response2 = await fetchv2(match[1].trim()); + const html2 = await response2.text(); + + const match2 = /sources:\s*\[\s*"([^"]+)"\s*\]/i.exec(html2); + const url = match2 ? match2[1] : null; + + + return url; + } + + return "dwd"; + } catch (err) { + console.error(err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} diff --git a/anime4up/anime4up.json b/anime4up/anime4up.json new file mode 100644 index 0000000..c414779 --- /dev/null +++ b/anime4up/anime4up.json @@ -0,0 +1,20 @@ +{ + "sourceName": "Anime4Up", + "iconUrl": "https://ww.anime4up.rest/wp-content/uploads/2019/03/Anime4up-Icon-1.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Arabic", + "streamType": "HLS", + "encrypted":true, + "quality": "1080p", + "baseUrl": "https://uqload.cx/", + "searchBaseUrl": "https://uqload.cx/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/anime4up/anime4up.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/animeav1/animeav1.js b/animeav1/animeav1.js new file mode 100644 index 0000000..a2a4bfe --- /dev/null +++ b/animeav1/animeav1.js @@ -0,0 +1,94 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://animeav1.com/catalogo?search=" + encodeURIComponent(keyword)); + const html = await response.text(); + console.log(html); + + const regex = /<article[^>]*class="group\/item[^"]*"[^>]*>[\s\S]*?<img[^>]+src="([^"]+)"[^>]*alt="[^"]*"[^>]*>[\s\S]*?<h3[^>]*class="[^"]*text-lead[^"]*">([^<]+)<\/h3>[\s\S]*?<a[^>]+href="([^"]+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[2].trim(), + image: match[1].trim(), + href: "https://animeav1.com" + match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + console.error("Search error:", err); + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry[^>]*>\s*<p>([\s\S]*?)<\/p>\s*<\/div>/); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a[^>]+href="([^"]+\/(\d+))"[^>]*>\s*<span class="sr-only">/g; + let match; + + while ((match = regex.exec(html)) !== null) { + results.push({ + href: "https://animeav1.com" + match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/url:"(https:\/\/player\.zilla-networks\.com\/play\/[^"]+)"/i); + if (match) { + return match[1].replace("/play/", "/m3u8/"); + } + + return "https://files.catbox.moe/avolvc.mp4"; + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + + diff --git a/animeav1/animeav1.json b/animeav1/animeav1.json new file mode 100644 index 0000000..de28a20 --- /dev/null +++ b/animeav1/animeav1.json @@ -0,0 +1,20 @@ +{ + "sourceName": "AnimeAV1", + "iconUrl": "https://animeav1.com/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Spanish", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animeav1.com/", + "searchBaseUrl": "https://animeav1.com/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animeav1/animeav1.js", + "type": "anime", + "asyncJS": true, + "softsub": true, + "downloadSupport": false, + "note": "Use external player." +} diff --git a/animebalkan/animebalkan.js b/animebalkan/animebalkan.js new file mode 100644 index 0000000..37c7558 --- /dev/null +++ b/animebalkan/animebalkan.js @@ -0,0 +1,111 @@ +function preprocessHtml(html) { + //Module specefic, ignore + return html.replace(/\\2605/g, '★'); +} + +function searchResults(html) { + html = preprocessHtml(html); + const results = []; + const baseUrl = "https://animebalkan.org/"; + + const filmListRegex = /<article class="bs"[\s\S]*?<\/article>/g; + const items = html.match(filmListRegex) || []; + + items.forEach((itemHtml) => { + const titleMatch = itemHtml.match(/<h2 itemprop="headline">([^<]+)<\/h2>/); + const hrefMatch = itemHtml.match(/<a[^>]+href="([^"]+)"[^>]*>/); + const imgMatch = itemHtml.match(/<img[^>]+src="([^"]+)"[^>]*>/); + + let title = titleMatch ? titleMatch[1].trim().replace(/–/g, '–') : ''; + const href = hrefMatch ? hrefMatch[1].trim() : ''; + const imageUrl = imgMatch ? imgMatch[1].trim() : ''; + + if (title && href) { + results.push({ + title, + image: imageUrl.startsWith('http') ? imageUrl : baseUrl + imageUrl, + href + }); + } + }); + + return results; +} + + +function extractDetails(html) { + const details = []; + const descriptionMatch = html.match(/<span class="Y2IQFc"[^>]*>([\s\S]*?)<\/span>/); + const airdateMatch = html.match(/<time[^>]*datetime="([^"]+)"/); + + if (descriptionMatch) { + let description = descriptionMatch[1].trim() + .replace(/–/g, '-') + .replace(/—/g, '—') + .replace(/“/g, '"') + .replace(/”/g, '"') + .replace(/…/g, '...') + .replace(/″/g, '"') + .replace(/′/g, "'"); + + let airdate = airdateMatch ? airdateMatch[1].split('T')[0] : ''; + + if (description && airdate) { + details.push({ + description: description, + aliases: 'N/A', + airdate: airdate + }); + } + } + + return details; +} + +function extractEpisodes(html) { + const episodes = []; + const episodeRegex = /<a href="([^"]+)">[^<]*<div class="epl-num">([^<]+)<\/div>/g; + + let match; + while ((match = episodeRegex.exec(html)) !== null) { + const href = match[1]; + let number = match[2]; + + const isMovie = href.includes('film') || + href.includes('movie') || + number.toLowerCase() === 'film'; + + if (isMovie) { + number = '1'; + } + + if (href.includes('epizoda-') || + href.includes('specijalna-epizoda') || + href.includes('-epizoda/') || + href.includes('film') || + href.includes('movie')) { + + episodes.push({ + href: href, + number: number + }); + } + } + + episodes.reverse(); + console.log(episodes); + return episodes; +} + +function extractStreamUrl(html) { + const sourceRegex = /<source\s+[^>]*src="([^"]+)"/; + const match = html.match(sourceRegex); + + if (match) { + console.log(match[1]); + return match[1]; + } else { + console.log("No stream URL found."); + return null; + } +} diff --git a/animebalkan/animebalkan.json b/animebalkan/animebalkan.json new file mode 100644 index 0000000..f665506 --- /dev/null +++ b/animebalkan/animebalkan.json @@ -0,0 +1,16 @@ +{ + "sourceName": "AnimeBalkan", + "iconUrl": "https://i.ibb.co/7tRnVMqY/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Croatian", + "streamType": "MP4", + "quality": "720p", + "baseUrl": "https://animebalkan.org//", + "searchBaseUrl": "https://animebalkan.org/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animebalkan/animebalkan.js", + "type": "anime" +} diff --git a/animebalkan/iconalt.png b/animebalkan/iconalt.png new file mode 100644 index 0000000000000000000000000000000000000000..071e65b135dbe5e4320ad2ec38a4bd9b13122894 GIT binary patch literal 112188 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 literal 0 HcmV?d00001 diff --git a/animebum/animebum.js b/animebum/animebum.js new file mode 100644 index 0000000..80bb605 --- /dev/null +++ b/animebum/animebum.js @@ -0,0 +1,364 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://www.animebum.net/search?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="search-results__item[^>]*>[\s\S]*?<a href="([^"]+)"[^>]*><img src="([^"]+)"[^>]*><\/a>[\s\S]*?<h2>([^<]+)<\/h2>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="description scrollV">\s*<p>([\s\S]*?)<\/p>/i; + const match = regex.exec(html); + let description = match ? match[1].trim() : "N/A"; + + description = description.replace(/<[^>]+>/g, ""); + description = description.replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/á/g, "á") + .replace(/é/g, "é") + .replace(/í/g, "í") + .replace(/ó/g, "ó") + .replace(/ú/g, "ú") + .replace(/ñ/g, "ñ") + .replace(/ü/g, "ü") + .replace(/“/g, "“") + .replace(/”/g, "”") + .replace(/‘/g, "‘") + .replace(/’/g, "’") + .replace(/¡/g, "¡") + .replace(/¿/g, "¿"); + + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const containerMatch = html.match( + /<div class="list-episodies-content">([\s\S]*?)<\/div>/ + ); + + if (!containerMatch) { + return JSON.stringify([{ href: "Not found", number: "N/A" }]); + } + + const containerHtml = containerMatch[1]; + + const regex = /<a[^>]+href="([^"]+)"[^>]*>[\s\S]*?Episodio\s+(\d+)\s*<\/a>/gi; + + let match; + while ((match = regex.exec(containerHtml)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ href: "Error", number: "Error" }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + // Try Filemoon first + const filemoonRegex = /(https:\/\/filemoon\.(?:to|sx)\/e\/[A-Za-z0-9]+\/[^\s"']+)/; + const filemoonMatch = filemoonRegex.exec(html); + + if (filemoonMatch) { + const filemoon = filemoonMatch[1]; + console.log("Filemoon URL found: " + filemoon); + + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": "https://animebum.net/", + }; + + const filemoonResponse = await fetchv2(filemoon, headers); + const filemoonHtml = await filemoonResponse.text(); + + try { + const streamUrl = await filemoonExtractor(filemoonHtml, "https://animebum.net/"); + if (streamUrl) return streamUrl; + } catch (err) { + console.log("Filemoon extraction error:" + err); + } + } + + const optionRegex = /<ul class="play-list-tabs">([\s\S]*?)<\/ul>/i; + const optionMatch = optionRegex.exec(html); + if (!optionMatch) return null; + + const optionsHtml = optionMatch[1]; + const faireMatch = /<li[^>]*data-id="(\d+)"[^>]*>\s*<a[^>]*title="Faire"/i.exec(optionsHtml); + if (!faireMatch) return null; + + const faireId = parseInt(faireMatch[1], 10); + const videoRegex = new RegExp(`video\\[${faireId}\\]\\s*=\\s*'([^']+)'`); + const videoMatch = videoRegex.exec(html); + if (!videoMatch) return null; + + const iframeHtml = videoMatch[1]; + const srcMatch = /src=["']([^"']+)["']/.exec(iframeHtml); + const streamUrl = srcMatch ? srcMatch[1] : null; + + const responeSome = await fetchv2(streamUrl); + const htmlSome = await responeSome.text(); + + const shareIdMatch = htmlSome.match(/var\s+shareId\s*=\s*"([^"]+)"/); + if (!shareIdMatch) return null; + const shareId = shareIdMatch[1]; + const someUrl = `https://www.amazon.com/drive/v1/shares/${shareId}?resourceVersion=V2&ContentType=JSON&asset=ALL`; + + const shareJsonResp = await fetchv2(someUrl); + const shareJson = await shareJsonResp.json(); + console.log(JSON.stringify(shareJson)); + const nodeId = shareJson.nodeInfo?.id; + if (!nodeId) return null; + + const childrenUrl = `https://www.amazon.com/drive/v1/nodes/${nodeId}/children?resourceVersion=V2&ContentType=JSON&limit=200&sort=%5B%22kind+DESC%22%2C+%22modifiedDate+DESC%22%5D&asset=ALL&tempLink=true&shareId=${shareId}`; + const childrenResp = await fetchv2(childrenUrl); + const childrenData = await childrenResp.json(); + console.log(JSON.stringify(childrenData)); + + const file = childrenData.data.find(item => item.kind === "FILE"); + if (!file) return null; + + return file.tempLink; + + } catch (err) { + console.log("Fetch error:" + err); + return "https://error.org/"; + } +} + + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ + + + diff --git a/animebum/animebum.json b/animebum/animebum.json new file mode 100644 index 0000000..9d5b184 --- /dev/null +++ b/animebum/animebum.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeBum", + "iconUrl": "https://files.catbox.moe/i96cs1.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.animebum.net/", + "searchBaseUrl": "https://www.animebum.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animebum/animebum.js", + "type": "Anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/animedefenders/animedefenders.js b/animedefenders/animedefenders.js new file mode 100644 index 0000000..b825765 --- /dev/null +++ b/animedefenders/animedefenders.js @@ -0,0 +1,113 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://animedefenders.me/view/?wd=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<a class="vod-item-img shining" href="(.*?)">[\s\S]*?data-original="(.*?)"[\s\S]*?<h3 class="vod-item-title.*?"><a href=".*?">(.*?)<\/a><\/h3>/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: "https://animedefenders.me" + match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descriptionRegex = /<div class="detail-desc-content layout-box">\s*<p>(.*?)<\/p>\s*<\/div>/s; + const match = html.match(descriptionRegex); + + let description = "N/A"; + if (match && match[1]) { + description = match[1] + .replace(/<br\s*\/?>/gi, ' ') + .replace(/<[^>]*>/g, '') + .replace(/\s+/g, ' ') + .trim(); + } + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a class="text-overflow ep" href="([^"]+)">(\d+)<\/a>/g; + let match; + + while ((match = regex.exec(html)) !== null) { + results.push({ + href: "https://animedefenders.me" + match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results.reverse()); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const subUrlRegex = /data-url="(https:\/\/ee\.anih1\.top\/bb\/sub[^"]+)"/; + const match = html.match(subUrlRegex); + + if (match && match[1]) { + const subUrl = match[1]; + const headers = { + "Referer": "https://ee.anih1.top", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" + }; + + const subResponse = await fetchv2(subUrl, headers); + const subHtml = await subResponse.text(); + + const artplayerRegex = /url:\s*'([^']+\.m3u8)'/; + const artMatch = subHtml.match(artplayerRegex); + + if (artMatch && artMatch[1]) { + return artMatch[1]; + } + } + console.log("No stream URL found"); + return "https://error.org/"; + } catch (err) { + return "https://error.org/"; + } +} diff --git a/animedefenders/animedefenders.json b/animedefenders/animedefenders.json new file mode 100644 index 0000000..1bea437 --- /dev/null +++ b/animedefenders/animedefenders.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeDefenders", + "iconUrl": "https://cdn.jsdelivr.net/gh/756751uosmaqy/vjplayer@main/2fcbd487e5cacb41cbe7802d5ccfc0dc.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English (SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://ee.anih1.top", + "searchBaseUrl": "https://ee.anih1.top", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animedefenders/animedefenders.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/animeepisodeseries/animeepisodeseries.js b/animeepisodeseries/animeepisodeseries.js new file mode 100644 index 0000000..1d652ab --- /dev/null +++ b/animeepisodeseries/animeepisodeseries.js @@ -0,0 +1,139 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://animeepisodeseries.com/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*>\s*<img[^>]+src="([^"]+)"[^>]*>[\s\S]*?<h2 class="entry-title"><a [^>]+>([^<]+)<\/a><\/h2>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: cleanTitle(match[3].trim()), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<p><strong[\s\S]*?>[\s\S]*?Summary:[\s\S]*?<\/strong><br\s*\/?>(.*?)<\/p>/i); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: cleanTitle(description), + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const gridMatch = html.match(/<div[^>]+class="[^"]*eael-post-grid[^"]*"[^>]*>([\s\S]*?)<\/div>\s*<div[^>]+class="clearfix">/i); + + + const gridHtml = gridMatch[1]; + + const patterns = [ + /<a[^>]+href="([^"]*?-episode-(\d+)-[^"]*)"/gi, + /<a[^>]+href="([^"]*?-episode-(\d+)(?:-[^"]*)?\/?)"/gi, + /<a[^>]+href="([^"]*?episode(\d+)[^"]*)"/gi, + /<a[^>]+href="([^"]*?ep(\d+)[^"]*)"/gi + ]; + + for (const regex of patterns) { + let match; + while ((match = regex.exec(gridHtml)) !== null) { + const episodeNumber = parseInt(match[2], 10); + + if (!results.find(r => r.number === episodeNumber && r.href === match[1].trim())) { + results.push({ + href: match[1].trim(), + number: episodeNumber + }); + } + } + } + + if (results.length === 0) { + const linkRegex = /<a[^>]+href="([^"]+)"[^>]*title="[^"]*episode[^"]*(\d+)[^"]*"/gi; + let match; + while ((match = linkRegex.exec(gridHtml)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + } + + const uniqueResults = results.reduce((acc, current) => { + const existing = acc.find(item => item.number === current.number); + if (!existing) { + acc.push(current); + } + return acc; + }, []); + + uniqueResults.sort((a, b) => a.number - b.number); + + return JSON.stringify(uniqueResults); + + } catch (err) { + console.error("Error in extractEpisodes:", err); + return JSON.stringify([{ + href: "Error: " + err.message, + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<iframe[^>]+src="(https:\/\/www\.4shared\.com\/web\/embed\/file\/[^"]+)"/i); + const video = match ? match[1].trim() : null; + + const response2 = await fetchv2(video); + const html2 = await response2.text(); + + const match2 = html2.match(/<source[^>]+src="([^"]+)"[^>]*type="video\/mp4"/i); + + return match2 ? match2[1].trim() : "dwa"; + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} + +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + diff --git a/animeepisodeseries/animeepisodeseries.json b/animeepisodeseries/animeepisodeseries.json new file mode 100644 index 0000000..0481efe --- /dev/null +++ b/animeepisodeseries/animeepisodeseries.json @@ -0,0 +1,20 @@ +{ + "sourceName": "AnimeEpisodeSeries", + "iconUrl": "https://animeepisodeseries.com/wp-content/uploads/2019/10/cropped-anime-episode-1-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English (DUB/SUB)", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "hhttps://animeepisodeseries.com/", + "searchBaseUrl": "https://animeepisodeseries.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animeepisodeseries/animeepisodeseries.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true, + "note": "Use external player." +} diff --git a/animefhd/animefhd.js b/animefhd/animefhd.js new file mode 100644 index 0000000..56ebd2e --- /dev/null +++ b/animefhd/animefhd.js @@ -0,0 +1,100 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2("https://animefhd.com/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + const filmListRegex = /<div class="ultAnisContainerItem">[\s\S]*?<\/div>\s*<\/div>/g; + const items = html.match(filmListRegex) || []; + + items.forEach((itemHtml) => { + const titleMatch = itemHtml.match(/<a href="([^"]+)"[^>]*title="([^"]+)"/); + const href = titleMatch ? titleMatch[1] : ''; + const title = titleMatch ? titleMatch[2] : ''; + const imgMatch = itemHtml.match(/<img[^>]*src="([^"]+)"[^>]*>/); + const imageUrl = imgMatch ? imgMatch[1] : ''; + + if (title && href) { + results.push({ + title: title.trim(), + image: imageUrl.trim(), + href: href.trim(), + }); + } + }); + + console.log(results); + return JSON.stringify(results); +} + +async function extractDetails(url) { + const details = []; + const response = await fetchv2(url); + const html = await response.text(); + const descriptionMatch = html.match(/<b>Sinopse:<\/b>\s*<p>\s*([\s\S]*?)\s*<\/p>/); + let description = descriptionMatch ? descriptionMatch[1].trim() : 'N/A'; + + const airdateMatch = html.match(/<b>Ano:<\/b>\s*(\d{4})/); + let airdate = airdateMatch ? airdateMatch[1].trim() : 'N/A'; + + const episodesMatch = html.match(/<b>Episódios:<\/b>\s*(\d+)/); + let aliases = episodesMatch ? episodesMatch[1].trim() : 'N/A'; + + details.push({ + description: description, + alias: "Episódios: " + aliases, + airdate: airdate + }); + + console.log(details); + return JSON.stringify(details); +} + +async function extractEpisodes(url) { + const episodes = []; + const response = await fetchv2(url); + const html = await response.text(); + const episodeMatches = html.match(/<a href="([^"]+)"[^>]*class="list-epi"[^>]*>Episódio (\d+)<\/a>/g); + + if (episodeMatches) { + episodeMatches.forEach(match => { + const hrefMatch = match.match(/href="([^"]+)"/); + const numberMatch = match.match(/Episódio (\d+)/); + + if (hrefMatch && numberMatch) { + episodes.push({ + href: hrefMatch[1], + number: parseInt(numberMatch[1]) + }); + } + }); + } + + console.log(JSON.stringify(episodes)); + return JSON.stringify(episodes); +} + +async function extractStreamUrl(url) { + const response = await fetchv2(url); + const html = await response.text(); + const iframeMatch = html.match(/<iframe[^>]*src="([^"]+)"/); + + if (iframeMatch) { + const streamUrl = iframeMatch[1]; + console.log(streamUrl); + const response = await fetch(streamUrl); + const newHtml = await response; + + const m3u8Match = newHtml.match(/file:\s*'([^']+\.m3u8)'/); + + if (m3u8Match) { + const videoUrl = m3u8Match[1]; + console.log(videoUrl); + return videoUrl; + } else { + console.log("No m3u8 URL found."); + return null; + } + } else { + console.log("No iframe found."); + return null; + } +} diff --git a/animefhd/animefhd.json b/animefhd/animefhd.json new file mode 100644 index 0000000..61a1d14 --- /dev/null +++ b/animefhd/animefhd.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AnimeFHD", + "iconUrl": "https://animefhd.net/wp-content/uploads/2024/12/270.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.2", + "language": "Portuguese (SUB)", + "streamType": "MP4", + "quality": "1080p", + "baseUrl": "https://animefhd.net/", + "searchBaseUrl": "https://animefhd.net/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animefhd/animefhd.js", + "asyncJS": true, + "type": "anime" +} diff --git a/animeheaven/animeheaven.js b/animeheaven/animeheaven.js new file mode 100644 index 0000000..0d6c4a0 --- /dev/null +++ b/animeheaven/animeheaven.js @@ -0,0 +1,126 @@ +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function searchResults(keyword) { + const url = `https://animeheaven.me/fastsearch.php?xhr=1&s=${encodeURIComponent(keyword)}`; + const response = await soraFetch(url); + const html = await response.text(); + const results = []; + + const itemRegex = /<a class='ac' href='([^']+)'>[\s\S]*?<img class='coverimg' src='([^']+)' alt='[^']*'>[\s\S]*?<div class='fastname'>([^<]+)<\/div>/g; + let match; + + while ((match = itemRegex.exec(html)) !== null) { + const href = `https://animeheaven.me${match[1]}`; + const image = `https://animeheaven.me${match[2]}`; + const rawTitle = match[3].trim(); + const title = cleanTitle(rawTitle); + + results.push({ title, image, href }); + } + + console.log(results); + return JSON.stringify(results); +} + +async function extractDetails(url) { + const response = await soraFetch(url); + const html = await response.text(); + const details = []; + + const descriptionMatch = html.match(/<div class='infodes c'>([^<]+)<\/div>/); + let description = descriptionMatch ? descriptionMatch[1] : ''; + + const aliasesMatch = html.match(/<div class='infotitle c'>([^<]+)<\/div>/); + let aliases = aliasesMatch ? aliasesMatch[1] : ''; + + const airdateMatch = html.match(/Year: <div class='inline c2'>([^<]+)<\/div>/); + let airdate = airdateMatch ? airdateMatch[1] : ''; + + if (description && airdate) { + details.push({ + description: description, + aliases: aliases || 'N/A', + airdate: airdate + }); + } + + console.log(details); + return JSON.stringify(details); +} + +async function extractEpisodes(url) { + const response = await soraFetch(url); + const html = await response.text(); + const episodes = []; + + const episodeRegex = /<a[^>]+id="([^"]+)"[^>]*>[\s\S]*?<div class='watch2 bc'[^>]*>(\d+)<\/div>/g; + + let match; + while ((match = episodeRegex.exec(html)) !== null) { + const id = match[1]; + const number = parseInt(match[2], 10); + + if (!isNaN(number)) { + episodes.push({ + href: id, + number: number + }); + } + } + + episodes.reverse(); + + console.log(episodes); + return JSON.stringify(episodes); +} + +async function extractStreamUrl(id) { + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + + const cookieHeader = `key=${id}`; + const headers = { + Cookie: cookieHeader + }; + + const response = await soraFetch(`https://animeheaven.me/gate.php`, { headers }); + const html = await response.text(); + + const sourceRegex = /<source\s+src=['"]([^"']+\.mp4\?[^"']*)['"]\s+type=['"]video\/mp4['"]/i; + const match = html.match(sourceRegex); + + if (match) { + const streamUrl = match[1].replace(/&/g, '&'); + console.log("Extracted stream URL:", streamUrl); + return streamUrl; + } else { + console.error("Stream URL not found."); + return ""; + } +} + +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} + +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} diff --git a/animeheaven/animeheaven.json b/animeheaven/animeheaven.json new file mode 100644 index 0000000..19feeb5 --- /dev/null +++ b/animeheaven/animeheaven.json @@ -0,0 +1,18 @@ +{ + "sourceName": "AnimeHeaven", + "iconUrl": "https://animeheaven.me/ah_logo.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.5", + "language": "English (SUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://animeheaven.me/", + "searchBaseUrl": "https://animeheaven.me/search.php?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animeheaven/animeheaven.js", + "type": "anime", + "asyncJS": true, + "note": "Website was recently hit by a DMCA, so not everything might work right away, please give them time to reupload anime!" +} diff --git a/animeheaven/iconalt.png b/animeheaven/iconalt.png new file mode 100644 index 0000000000000000000000000000000000000000..ec467b18b896174bd25daf2600e42a63d84e1ad1 GIT binary patch literal 104063 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 M07*qoM6N<$g8ka%s{jB1 literal 0 HcmV?d00001 diff --git a/animekai/dub/animekai.js b/animekai/dub/animekai.js new file mode 100644 index 0000000..134a469 --- /dev/null +++ b/animekai/dub/animekai.js @@ -0,0 +1,307 @@ +async function searchResults(query) { + const encodeQuery = keyword => encodeURIComponent(keyword); + const searchBaseUrl = "https://animekai.to/browser?keyword="; + const baseUrl = "https://animekai.to"; + + const posterHrefRegex = /href="[^"]*" class="poster"/g; + const titleRegex = /class="title"[^>]*title="[^"]*"/g; + const imageRegex = /data-src="[^"]*"/g; + const extractHrefRegex = /href="([^"]*)"/; + const extractImageRegex = /data-src="([^"]*)"/; + const extractTitleRegex = /title="([^"]*)"/; + + try { + const encodedQuery = encodeQuery(query); + const searchUrl = searchBaseUrl + encodedQuery; + const response = await fetchv2(searchUrl); + const htmlText = await response.text(); + + const results = []; + const posterMatches = htmlText.match(posterHrefRegex) || []; + const titleMatches = htmlText.match(titleRegex) || []; + const imageMatches = htmlText.match(imageRegex) || []; + + const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); + + for (let index = 0; index < minLength; index++) { + const hrefMatch = posterMatches[index].match(extractHrefRegex); + const fullHref = hrefMatch ? + (hrefMatch[1].startsWith("http") ? hrefMatch[1] : baseUrl + hrefMatch[1]) : + null; + + const imageMatch = imageMatches[index].match(extractImageRegex); + const imageSrc = imageMatch ? imageMatch[1] : null; + + const titleMatch = titleMatches[index].match(extractTitleRegex); + const cleanTitle = titleMatch ? + decodeHtmlEntities(titleMatch[1]) : + null; + + if (fullHref && imageSrc && cleanTitle) { + results.push({ + href: fullHref, + image: imageSrc, + title: cleanTitle + }); + } + } + + return JSON.stringify(results); + } catch (error) { + return JSON.stringify([{ + href: "", + image: "", + title: "Search failed: " + error.message + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const htmlText = await response.text(); + console.log(htmlText); + + const descriptionMatch = (/<div class="desc text-expand">([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; + const aliasesMatch = (/<small class="al-title text-expand">([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; + + return JSON.stringify([{ + description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", + aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not available", + airdate: "If stream doesn't load try later or disable VPN/DNS" + }]); + } catch (error) { + console.error("Error fetching details:" + error); + return [{ + description: "Error loading description", + aliases: "Aliases: Unknown", + airdate: "Aired: Unknown" + }]; + } +} + +async function extractEpisodes(animeUrl) { + try { + const response = await fetchv2(animeUrl); + const htmlText = await response.text(); + + const animeIdMatch = (htmlText.match(/<div class="rate-box"[^>]*data-id="([^"]+)"/) || [])[1]; + if (!animeIdMatch) { + return [{ + error: "AniID not found" + }]; + } + + const tokenResponse = await fetchv2(`https://ilovekai.simplepostrequest.workers.dev/?ilovefeet=${encodeURIComponent(animeIdMatch)}`); + const token = await tokenResponse.text(); + + const episodeListUrl = `https://animekai.to/ajax/episodes/list?ani_id=${animeIdMatch}&_=${token}`; + + const episodeListResponse = await fetchv2(episodeListUrl); + const episodeListData = await episodeListResponse.json(); + const cleanedHtml = cleanJsonHtml(episodeListData.result); + + const episodeRegex = /<a[^>]+num="([^"]+)"[^>]+token="([^"]+)"[^>]*>/g; + const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; + + const episodeData = episodeMatches.map(([_, episodeNum, episodeToken]) => ({ + name: `Episode ${episodeNum}`, + data: episodeToken + })); + + const batchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/?ilovefeet", + {}, + "POST", + JSON.stringify(episodeData) + ); + + const batchResults = await batchResponse.json(); + + const episodes = batchResults.map((result, index) => ({ + number: parseInt(episodeMatches[index][1], 10), + href: `https://animekai.to/ajax/links/list?token=${episodeMatches[index][2]}&_=${result.data}` + })); + + return JSON.stringify(episodes); + } catch (err) { + console.error("Error fetching episodes:" + err); + return [{ + number: 1, + href: "Error fetching episodes" + }]; + } +} + +async function extractStreamUrl(url) { + try { + const fetchUrl = `${url}`; + const response = await fetchv2(fetchUrl); + const text = await response.text(); + const cleanedHtml = cleanJsonHtml(text); + const subRegex = /<div class="server-items lang-group" data-id="sub"[^>]*>([\s\S]*?)<\/div>/; + const softsubRegex = /<div class="server-items lang-group" data-id="softsub"[^>]*>([\s\S]*?)<\/div>/; + const dubRegex = /<div class="server-items lang-group" data-id="dub"[^>]*>([\s\S]*?)<\/div>/; + const subMatch = subRegex.exec(cleanedHtml); + const softsubMatch = softsubRegex.exec(cleanedHtml); + const dubMatch = dubRegex.exec(cleanedHtml); + const subContent = subMatch ? subMatch[1].trim() : ""; + const softsubContent = softsubMatch ? softsubMatch[1].trim() : ""; + const dubContent = dubMatch ? dubMatch[1].trim() : ""; + const serverSpanRegex = /<span class="server"[^>]*data-lid="([^"]+)"[^>]*>Server 1<\/span>/; + const serverIdDub = serverSpanRegex.exec(dubContent)?.[1]; + const serverIdSoftsub = serverSpanRegex.exec(softsubContent)?.[1]; + const serverIdSub = serverSpanRegex.exec(subContent)?.[1]; + + const tokenRequestData = [ + { name: "Dub", data: serverIdDub }, + { name: "Softsub", data: serverIdSoftsub }, + { name: "Sub", data: serverIdSub } + ].filter(item => item.data); + + const tokenBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/?ilovefeet", + {}, + "POST", + JSON.stringify(tokenRequestData) + ); + const tokenResults = await tokenBatchResponse.json(); + + const streamUrls = tokenResults.map(result => { + const serverIdMap = { + "Dub": serverIdDub, + "Softsub": serverIdSoftsub, + "Sub": serverIdSub + }; + return { + type: result.name, + url: `https://animekai.to/ajax/links/view?id=${serverIdMap[result.name]}&_=${result.data}` + }; + }); + + const processStreams = async (streamUrls) => { + const streamResponses = await Promise.all( + streamUrls.map(async ({ type, url }) => { + try { + const res = await fetchv2(url); + const json = await res.json(); + return { + type: type, + result: json.result + }; + } catch (error) { + console.log(`Error fetching ${type} stream:`, error); + return { + type: type, + result: null + }; + } + }) + ); + + const decryptRequestData = streamResponses + .filter(item => item.result) + .map(item => ({ + name: item.type, + data: item.result + })); + + if (decryptRequestData.length === 0) { + return {}; + } + + const decryptBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/?ilovearmpits", + {}, + "POST", + JSON.stringify(decryptRequestData) + ); + const decryptResults = await decryptBatchResponse.json(); + + const finalResults = {}; + decryptResults.forEach(result => { + try { + const parsed = JSON.parse(result.data); + finalResults[result.name] = parsed.url; + console.log(`decrypted${result.name} URL:` + parsed.url); + } catch (error) { + console.log(`Error parsing ${result.name} result:`, error); + finalResults[result.name] = null; + } + }); + + return finalResults; + }; + + const decryptedUrls = await processStreams(streamUrls); + const decryptedDub = decryptedUrls.Dub || decryptedUrls.Sub || decryptedUrls.Softsub; + + console.log(decryptedDub); + const headers = { + "Referer": "https://animekai.to/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + }; + + if (decryptedDub) { + const response = await fetchv2(decryptedDub.replace("/e/", "/media/"), headers); + const responseJson = await response.json(); + + const result = responseJson?.result; + + const postData = { + "text": result, + "Useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + } + + const finalResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/ilovebush", {}, "POST", JSON.stringify(postData)); + const finalJson = await finalResponse.json(); + const m3u8Link = finalJson?.result?.sources?.[0]?.file; + + return m3u8Link; + } + + return "error"; + } catch (error) { + console.log("Fetch error:"+ error); + return "https://error.org"; + } +} + +function cleanHtmlSymbols(string) { + if (!string) { + return ""; + } + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function cleanJsonHtml(jsonHtml) { + if (!jsonHtml) { + return ""; + } + return jsonHtml + .replace(/\\"/g, "\"") + .replace(/\\'/g, "'") + .replace(/\\\\/g, "\\") + .replace(/\\n/g, "\n") + .replace(/\\t/g, "\t") + .replace(/\\r/g, "\r"); +} + +function decodeHtmlEntities(text) { + if (!text) { + return ""; + } + return text + .replace(/'/g, "'") + .replace(/"/g, "\"") + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/ /g, " "); +} diff --git a/animekai/dub/animekai.json b/animekai/dub/animekai.json new file mode 100644 index 0000000..a623865 --- /dev/null +++ b/animekai/dub/animekai.json @@ -0,0 +1,20 @@ +{ + "sourceName": "AnimeKai (Dub)", + "iconUrl": "https://apktodo.io/uploads/2025/5/animekai-icon.jpg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.3", + "language": "English", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animekai.to/", + "searchBaseUrl": "https://animekai.to/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animekai/dub/animekai.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true, + "note": "Make sure you're on the latest version of Sora." +} diff --git a/animekai/hardsub/animekai.js b/animekai/hardsub/animekai.js new file mode 100644 index 0000000..1a042bd --- /dev/null +++ b/animekai/hardsub/animekai.js @@ -0,0 +1,307 @@ +async function searchResults(query) { + const encodeQuery = keyword => encodeURIComponent(keyword); + const searchBaseUrl = "https://animekai.to/browser?keyword="; + const baseUrl = "https://animekai.to"; + + const posterHrefRegex = /href="[^"]*" class="poster"/g; + const titleRegex = /class="title"[^>]*title="[^"]*"/g; + const imageRegex = /data-src="[^"]*"/g; + const extractHrefRegex = /href="([^"]*)"/; + const extractImageRegex = /data-src="([^"]*)"/; + const extractTitleRegex = /title="([^"]*)"/; + + try { + const encodedQuery = encodeQuery(query); + const searchUrl = searchBaseUrl + encodedQuery; + const response = await fetchv2(searchUrl); + const htmlText = await response.text(); + + const results = []; + const posterMatches = htmlText.match(posterHrefRegex) || []; + const titleMatches = htmlText.match(titleRegex) || []; + const imageMatches = htmlText.match(imageRegex) || []; + + const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); + + for (let index = 0; index < minLength; index++) { + const hrefMatch = posterMatches[index].match(extractHrefRegex); + const fullHref = hrefMatch ? + (hrefMatch[1].startsWith("http") ? hrefMatch[1] : baseUrl + hrefMatch[1]) : + null; + + const imageMatch = imageMatches[index].match(extractImageRegex); + const imageSrc = imageMatch ? imageMatch[1] : null; + + const titleMatch = titleMatches[index].match(extractTitleRegex); + const cleanTitle = titleMatch ? + decodeHtmlEntities(titleMatch[1]) : + null; + + if (fullHref && imageSrc && cleanTitle) { + results.push({ + href: fullHref, + image: imageSrc, + title: cleanTitle + }); + } + } + + return JSON.stringify(results); + } catch (error) { + return JSON.stringify([{ + href: "", + image: "", + title: "Search failed: " + error.message + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const htmlText = await response.text(); + console.log(htmlText); + + const descriptionMatch = (/<div class="desc text-expand">([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; + const aliasesMatch = (/<small class="al-title text-expand">([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; + + return JSON.stringify([{ + description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", + aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not available", + airdate: "If stream doesn't load try later or disable VPN/DNS" + }]); + } catch (error) { + console.error("Error fetching details:" + error); + return [{ + description: "Error loading description", + aliases: "Aliases: Unknown", + airdate: "Aired: Unknown" + }]; + } +} + +async function extractEpisodes(animeUrl) { + try { + const response = await fetchv2(animeUrl); + const htmlText = await response.text(); + + const animeIdMatch = (htmlText.match(/<div class="rate-box"[^>]*data-id="([^"]+)"/) || [])[1]; + if (!animeIdMatch) { + return [{ + error: "AniID not found" + }]; + } + + const tokenResponse = await fetchv2(`https://ilovekai.simplepostrequest.workers.dev/?ilovefeet=${encodeURIComponent(animeIdMatch)}`); + const token = await tokenResponse.text(); + + const episodeListUrl = `https://animekai.to/ajax/episodes/list?ani_id=${animeIdMatch}&_=${token}`; + + const episodeListResponse = await fetchv2(episodeListUrl); + const episodeListData = await episodeListResponse.json(); + const cleanedHtml = cleanJsonHtml(episodeListData.result); + + const episodeRegex = /<a[^>]+num="([^"]+)"[^>]+token="([^"]+)"[^>]*>/g; + const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; + + const episodeData = episodeMatches.map(([_, episodeNum, episodeToken]) => ({ + name: `Episode ${episodeNum}`, + data: episodeToken + })); + + const batchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/?ilovefeet", + {}, + "POST", + JSON.stringify(episodeData) + ); + + const batchResults = await batchResponse.json(); + + const episodes = batchResults.map((result, index) => ({ + number: parseInt(episodeMatches[index][1], 10), + href: `https://animekai.to/ajax/links/list?token=${episodeMatches[index][2]}&_=${result.data}` + })); + + return JSON.stringify(episodes); + } catch (err) { + console.error("Error fetching episodes:" + err); + return [{ + number: 1, + href: "Error fetching episodes" + }]; + } +} + +async function extractStreamUrl(url) { + try { + const fetchUrl = `${url}`; + const response = await fetchv2(fetchUrl); + const text = await response.text(); + const cleanedHtml = cleanJsonHtml(text); + const subRegex = /<div class="server-items lang-group" data-id="sub"[^>]*>([\s\S]*?)<\/div>/; + const softsubRegex = /<div class="server-items lang-group" data-id="softsub"[^>]*>([\s\S]*?)<\/div>/; + const dubRegex = /<div class="server-items lang-group" data-id="dub"[^>]*>([\s\S]*?)<\/div>/; + const subMatch = subRegex.exec(cleanedHtml); + const softsubMatch = softsubRegex.exec(cleanedHtml); + const dubMatch = dubRegex.exec(cleanedHtml); + const subContent = subMatch ? subMatch[1].trim() : ""; + const softsubContent = softsubMatch ? softsubMatch[1].trim() : ""; + const dubContent = dubMatch ? dubMatch[1].trim() : ""; + const serverSpanRegex = /<span class="server"[^>]*data-lid="([^"]+)"[^>]*>Server 1<\/span>/; + const serverIdDub = serverSpanRegex.exec(dubContent)?.[1]; + const serverIdSoftsub = serverSpanRegex.exec(softsubContent)?.[1]; + const serverIdSub = serverSpanRegex.exec(subContent)?.[1]; + + const tokenRequestData = [ + { name: "Dub", data: serverIdDub }, + { name: "Softsub", data: serverIdSoftsub }, + { name: "Sub", data: serverIdSub } + ].filter(item => item.data); + + const tokenBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/?ilovefeet", + {}, + "POST", + JSON.stringify(tokenRequestData) + ); + const tokenResults = await tokenBatchResponse.json(); + + const streamUrls = tokenResults.map(result => { + const serverIdMap = { + "Dub": serverIdDub, + "Softsub": serverIdSoftsub, + "Sub": serverIdSub + }; + return { + type: result.name, + url: `https://animekai.to/ajax/links/view?id=${serverIdMap[result.name]}&_=${result.data}` + }; + }); + + const processStreams = async (streamUrls) => { + const streamResponses = await Promise.all( + streamUrls.map(async ({ type, url }) => { + try { + const res = await fetchv2(url); + const json = await res.json(); + return { + type: type, + result: json.result + }; + } catch (error) { + console.log(`Error fetching ${type} stream:`, error); + return { + type: type, + result: null + }; + } + }) + ); + + const decryptRequestData = streamResponses + .filter(item => item.result) + .map(item => ({ + name: item.type, + data: item.result + })); + + if (decryptRequestData.length === 0) { + return {}; + } + + const decryptBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/?ilovearmpits", + {}, + "POST", + JSON.stringify(decryptRequestData) + ); + const decryptResults = await decryptBatchResponse.json(); + + const finalResults = {}; + decryptResults.forEach(result => { + try { + const parsed = JSON.parse(result.data); + finalResults[result.name] = parsed.url; + console.log(`decrypted${result.name} URL:` + parsed.url); + } catch (error) { + console.log(`Error parsing ${result.name} result:`, error); + finalResults[result.name] = null; + } + }); + + return finalResults; + }; + + const decryptedUrls = await processStreams(streamUrls); + const decryptedSub = decryptedUrls.Sub || decryptedUrls.Softsub || decryptedUrls.Dub; + + console.log(decryptedSub); + const headers = { + "Referer": "https://animekai.to/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + }; + + if (decryptedSub) { + const response = await fetchv2(decryptedSub.replace("/e/", "/media/"), headers); + const responseJson = await response.json(); + + const result = responseJson?.result; + + const postData = { + "text": result, + "Useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + } + + const finalResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/ilovebush", {}, "POST", JSON.stringify(postData)); + const finalJson = await finalResponse.json(); + const m3u8Link = finalJson?.result?.sources?.[0]?.file; + + return m3u8Link; + } + + return "error"; + } catch (error) { + console.log("Fetch error:"+ error); + return "https://error.org"; + } +} + +function cleanHtmlSymbols(string) { + if (!string) { + return ""; + } + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function cleanJsonHtml(jsonHtml) { + if (!jsonHtml) { + return ""; + } + return jsonHtml + .replace(/\\"/g, "\"") + .replace(/\\'/g, "'") + .replace(/\\\\/g, "\\") + .replace(/\\n/g, "\n") + .replace(/\\t/g, "\t") + .replace(/\\r/g, "\r"); +} + +function decodeHtmlEntities(text) { + if (!text) { + return ""; + } + return text + .replace(/'/g, "'") + .replace(/"/g, "\"") + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/ /g, " "); +} diff --git a/animekai/hardsub/animekai.json b/animekai/hardsub/animekai.json new file mode 100644 index 0000000..36dd618 --- /dev/null +++ b/animekai/hardsub/animekai.json @@ -0,0 +1,20 @@ +{ + "sourceName": "AnimeKai (Hardsub)", + "iconUrl": "https://apktodo.io/uploads/2025/5/animekai-icon.jpg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.2", + "language": "English", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animekai.to/", + "searchBaseUrl": "https://animekai.to/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animekai/hardsub/animekai.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true, + "note": "Make sure you're on the latest version of Sora." +} diff --git a/animekhor/animekhor.js b/animekhor/animekhor.js new file mode 100644 index 0000000..a269d5e --- /dev/null +++ b/animekhor/animekhor.js @@ -0,0 +1,111 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://animekhor.org/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="inepcx">\s*<a href="([^"#]+)">\s*<span>New Episode<\/span>/; + const match = regex.exec(html); + + if (match) { + results.push({ + href: match[1].trim(), + number: 1 + }); + } + + return JSON.stringify(results); +} +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const iframeMatch = html.match(/dailymotion\.com\/embed\/video\/([a-zA-Z0-9]+)/); + + if (!iframeMatch) return "no iframe"; + + const videoId = iframeMatch[1]; + const metaRes = await fetchv2(`https://www.dailymotion.com/player/metadata/video/${videoId}`); + const metaJson = await metaRes.json(); + const hlsLink = metaJson.qualities?.auto?.[0]?.url; + + if (!hlsLink) return "no hls"; + + async function getBestHls(hlsUrl) { + try { + const res = await fetchv2(hlsUrl); + const text = await res.text(); + const regex = /#EXT-X-STREAM-INF:.*RESOLUTION=(\d+)x(\d+).*?\n(https?:\/\/[^\n]+)/g; + const streams = []; + let match; + + while ((match = regex.exec(text)) !== null) { + streams.push({ + width: parseInt(match[1]), + height: parseInt(match[2]), + url: match[3] + }); + } + + if (streams.length === 0) return hlsUrl; + streams.sort((a, b) => b.height - a.height); + return streams[0].url; + } catch { + return hlsUrl; + } + } + + const bestHls = await getBestHls(hlsLink); + return bestHls; + } catch { + const empty = "{ streams: ["; + console.log("Extracted stream result:" + JSON.stringify(empty)); + return JSON.stringify(empty); + } +} \ No newline at end of file diff --git a/animekhor/animekhor.json b/animekhor/animekhor.json new file mode 100644 index 0000000..5db4634 --- /dev/null +++ b/animekhor/animekhor.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeKhor", + "iconUrl": "https://i3.wp.com/animekhor.org/wp-content/uploads/2022/02/cropped-logo-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animekhor.org/", + "searchBaseUrl": "https://animekhor.org/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animekhor/animekhor.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/animeland/animeland.js b/animeland/animeland.js new file mode 100644 index 0000000..e07f290 --- /dev/null +++ b/animeland/animeland.js @@ -0,0 +1,122 @@ +async function searchResults(keyword) { + const baseUrl = "https://w7.animeland.tv"; + const results = []; + try { + const response = await fetchv2(baseUrl + "/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*>\s*<img[^>]*src="([^"]*)"[^>]*alt="([^"]*)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + let href = match[1].trim(); + let image = match[2].trim(); + let title = match[3].trim(); + + if (href.startsWith("/")) { + href = baseUrl + href; + } + if (image.startsWith("/")) { + image = baseUrl + image; + } + + if (href === baseUrl + "/" || href.includes("kissanimes.net")) { + continue; + } + + results.push({ + href, + image, + title + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="Anime Info">\s*<\/div>\s*([\s\S]*?)<\/div>/i; + const match = html.match(regex); + + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<li class="play"><a[^>]*href="([^"]+)"[^>]*>([^<]*)<\/a><\/li>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + const href = match[1].trim(); + const text = match[2].trim(); + + let number = null; + const urlMatch = href.match(/-episode-(\d+)/i); + if (urlMatch) { + number = parseInt(urlMatch[1], 10); + } else { + const textMatch = text.match(/Episode\s*(\d+)/i); + if (textMatch) number = parseInt(textMatch[1], 10); + } + + results.push({ + href, + number + }); + } + + return JSON.stringify(results.reverse()); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + const match = html.match(/file=([a-zA-Z0-9]+\.html)/); + if (match) { + const filename = match[1]; + console.log('Filename:' + filename); + const videoUrl = `https://animesource.me/cache/${filename}.mp4`; + console.log('Video URL:' + videoUrl); + return videoUrl; + } + + } catch (err) { + console.error("Error:" + err); + return null; + } +} diff --git a/animeland/animeland.json b/animeland/animeland.json new file mode 100644 index 0000000..e5ea3f1 --- /dev/null +++ b/animeland/animeland.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeLand", + "iconUrl": "https://w7.animeland.tv/wp-content/themes/twentytwelve/SAO2.ico", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://w7.animeland.tv/", + "searchBaseUrl": "https://w7.animeland.tv/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animeland/animeland.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/animemeow/animemeow.js b/animemeow/animemeow.js new file mode 100644 index 0000000..8052338 --- /dev/null +++ b/animemeow/animemeow.js @@ -0,0 +1,237 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://animemeow.xyz/directorio/?q=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const containerMatch = html.match(/<ul class="grid-animes directorio">([\s\S]*?)<\/ul>/); + const containerHtml = containerMatch ? containerMatch[1] : ""; + + const regex = /<a href="([^"]+)">[\s\S]*?<div class="main-img">[\s\S]*?<img[^>]+src="([^"]+)"[^>]*>[\s\S]*?<p>([^<]+)<\/p>/g; + let match; + while ((match = regex.exec(containerHtml)) !== null) { + results.push({ + href: "https://animemeow.xyz" + match[1].trim(), + image: "https://animemeow.xyz" + match[2].trim(), + title: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<p class="sinopsis" id="sinopsis">([\s\S]*?)<\/p>/); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const containerMatch = html.match(/<ul id="eps">([\s\S]*?)<\/ul>/); + const containerHtml = containerMatch ? containerMatch[1] : ""; + + const regex = /<a href="([^"]+)">[\s\S]*?<p>[\s\S]*?<\/i>\s*([^<]+)<\/p>/g; + let match; + while ((match = regex.exec(containerHtml)) !== null) { + const href = "https://animemeow.xyz" + match[1].trim(); + let number; + + if (/Episodio\s*(\d+)/i.test(match[2])) { + number = parseInt(match[2].match(/Episodio\s*(\d+)/i)[1], 10); + } else if (/Ver Pel[ií]cula/i.test(match[2])) { + number = 1; + } else { + number = "N/A"; + } + + results.push({ href, number }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const buttonMatch = html.match(/<button[^>]+data-url="([^"]*voe[^"]+)"[^>]*>/i); + if (!buttonMatch) return "https://error.org/"; + + const voeLink = buttonMatch[1].split('id=')[1]; + console.log("VOE Link: " + voeLink); + const voeResponse = await fetchv2(voeLink); + const voeHtml = await voeResponse.text(); + + const redirectMatch = voeHtml.match(/window\.location\.href\s*=\s*['"]([^'"]+)['"]/); + if (!redirectMatch) return null; + + const finalLink = redirectMatch[1]; + + const streamUrlOne = finalLink; + + const responseTwo = await fetchv2(streamUrlOne); + const finalHtml = await responseTwo.text(); + + let streamUrl = null; + try { + streamUrl = voeExtractor(finalHtml); + } catch (error) { + console.log("VOE extraction error:", error); + return null; + } + + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + + } catch (err) { + return "https://error.org/"; + } +} + +/* SCHEME START */ + +/** + * @name voeExtractor + * @author Cufiy + */ + +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + + const obfuscatedJson = jsonScriptMatch[1].trim(); + + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} + +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} + +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} + +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} + +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} +/* SCHEME END */ + + diff --git a/animemeow/animemeow.json b/animemeow/animemeow.json new file mode 100644 index 0000000..14eac14 --- /dev/null +++ b/animemeow/animemeow.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeMeow", + "iconUrl": "https://files.catbox.moe/5phbht.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animemeow.xyz/", + "searchBaseUrl": "https://animemeow.xyz/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animemeow/animemeow.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/animenana/animenana.js b/animenana/animenana.js new file mode 100644 index 0000000..9e82810 --- /dev/null +++ b/animenana/animenana.js @@ -0,0 +1,324 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://animenana.com/search/?key=" + keyword); + const html = await response.text(); + + const cardMatches = html.match(/<div class="card component-latest">[\s\S]*?<\/div>\s*<\/div>\s*<\/a>/g); + + if (cardMatches) { + for (const cardHtml of cardMatches) { + const hrefMatch = cardHtml.match(/<a href="([^"]+)"/); + + const imgMatch = cardHtml.match(/<img[^>]+(?:data-src|src)="([^"]+)"/); + + const titleMatch = cardHtml.match(/<h5 class="animename"[^>]*>(.*?)<\/h5>/); + + if (hrefMatch && imgMatch && titleMatch) { + results.push({ + href: "https://animenana.com" + hrefMatch[1].trim(), + image: "https://animenana.com" + imgMatch[1].trim(), + title: titleMatch[1].trim() + }); + } + } + } + + if (results.length === 0) { + const colMatches = html.match(/<div class="col-md-4">[\s\S]*?<\/div>\s*<\/div>\s*<\/div>\s*<\/a>\s*<\/div>/g); + + if (colMatches) { + for (const colHtml of colMatches) { + const hrefMatch = colHtml.match(/<a href="([^"]+)"/); + const imgMatch = colHtml.match(/<img[^>]+(?:data-src|src)="([^"]+)"/); + const titleMatch = colHtml.match(/<h5 class="animename"[^>]*>(.*?)<\/h5>/); + + if (hrefMatch && imgMatch && titleMatch) { + results.push({ + href: "https://animenana.com" + hrefMatch[1].trim(), + image: "https://animenana.com" + imgMatch[1].trim(), + title: titleMatch[1].trim() + }); + } + } + } + } + + if (results.length === 0) { + const regex = /<a href="([^"]+)"[\s\S]*?<img[^>]+(?:data-src|src)="([^"]+)"[\s\S]*?<h5 class="animename"[^>]*>(.*?)<\/h5>/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: "https://animenana.com" + match[1].trim(), + image: "https://animenana.com" + match[2].trim(), + title: match[3].trim() + }); + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<p><b>Description:\s*<\/b><\/p>([\s\S]*?)<br\s*\/?>/i; + const match = regex.exec(html); + + let description = match ? match[1].trim() : "N/A"; + + description = description.replace(/<[^>]+>/g, "").trim(); + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + // More flexible regex to handle the actual HTML structure + const epRegex = /<a href="([^"]+)"[^>]*title="[^"]*Episode\s*(\d+)">/g; + let match; + while ((match = epRegex.exec(html)) !== null) { + results.push({ + href: "https://animenana.com" + match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + const specialRegex = /<span class="badge[^"]*"[^>]*>([^<]+)<\/span>[\s\S]*?<a href="([^"]+)"[^>]*>[\s\S]*?<h5 class="animename">([^<]+)<\/h5>/g; + while ((match = specialRegex.exec(html)) !== null) { + results.push({ + href: "https://animenana.com" + match[2].trim(), + number: 1 + }); + } + + if (results.length >= 2 && results[0].number > results[1].number) { + results.reverse(); + results.forEach((item, index) => { + item.number = index + 1; + }); + } + + if (results.length === 0) { + results.push({ + href: url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error", + type: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + const fmRegex = /function\s+fm\(\)\s*\{[^}]*document\.getElementById\("videowrapper"\)\.innerHTML\s*=\s*['"]<iframe\s+src=['"]([^'"]+)['"]/; + const match = fmRegex.exec(html); + + + let streamUrl = "https://files.catbox.moe/avolvc.mp4"; + + if (match && match[1]) { + const iframeSrc = match[1]; + + if (iframeSrc.startsWith("https://")) { + streamUrl = iframeSrc; + } else { + streamUrl = "https://animenana.com" + iframeSrc; + } + } + + const finalUrl = streamUrl; + + console.log(finalUrl); + + const diejfioe = await fetchv2(finalUrl); + const jdi83rjf = await diejfioe.text(); + + const kvrokofrmfrklefmklrd = jdi83rjf.match(/<iframe[^>]+src="([^"]+)"/); + if (kvrokofrmfrklefmklrd) { + const iframeUrl = kvrokofrmfrklefmklrd[1]; + console.log("Iframe URL:"+ iframeUrl); + + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": "https://animenana.com" + url, + }; + + const i9jfrhtiee = await fetchv2(iframeUrl, headers); + const kopefjir4o0 = await i9jfrhtiee.text(); + + const obfuscatedScript = kopefjir4o0.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + const unpackedScript = unpack(obfuscatedScript[1]); + //console.log(unpackedScript); + + const hlsMatch = unpackedScript.match(/file:"(https?:\/\/.*?\.m3u8.*?)"/); + const hlsUrl = hlsMatch ? hlsMatch[1] : null; + console.log("HLS URL:"+hlsUrl); + return hlsUrl; + } else { + console.log("No iframe found"); + } + + + return "blehh"; + } catch (err) { + console.log(err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + diff --git a/animenana/animenana.json b/animenana/animenana.json new file mode 100644 index 0000000..c8fb7b9 --- /dev/null +++ b/animenana/animenana.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeNana", + "iconUrl": "https://animenana.com/favicon.ico", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English (Hardsub)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animenana.com/", + "searchBaseUrl": "https://animenana.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animenana/animenana.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/animenix/animenix.js b/animenix/animenix.js new file mode 100644 index 0000000..2e07e5a --- /dev/null +++ b/animenix/animenix.js @@ -0,0 +1,102 @@ +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://animenix.com/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: cleanTitle(match[3].trim()), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<li data-index="\d+">[\s\S]*?<a href="([^"]+)">/g; + + let match; + let count = 1; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: count + }); + count++; + } + + results.reverse(); + return JSON.stringify(results.reverse()); +} + + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const optionMatch = html.match(/<option value="([^"]+)"[^>]*>\s*YourUpload\s*<\/option>/); + if (!optionMatch) return "https://error.org/"; + + const decodedHtml = atob(optionMatch[1]); + + const iframeMatch = decodedHtml.match(/<iframe[^>]+src="([^"]+)"/); + if (!iframeMatch) return "https://error.org/"; + const iframeUrl = iframeMatch[1]; + + const iframeResponse = await fetchv2(iframeUrl); + const iframeHtml = await iframeResponse.text(); + + const fileMatch = iframeHtml.match(/file:\s*'([^']+\.mp4)'/); + if (!fileMatch) return "https://error.org/"; + + return fileMatch[1]; + + } catch (err) { + return "https://error.org/"; + } +} + diff --git a/animenix/animenix.json b/animenix/animenix.json new file mode 100644 index 0000000..1d1e110 --- /dev/null +++ b/animenix/animenix.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeNix", + "iconUrl": "https://i3.wp.com/animenix.com/wp-content/uploads/2024/11/cropped-favicon-1-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.yourupload.com/", + "searchBaseUrl": "https://www.yourupload.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animenix/animenix.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/animenosub/animenosub.js b/animenosub/animenosub.js new file mode 100644 index 0000000..305bca0 --- /dev/null +++ b/animenosub/animenosub.js @@ -0,0 +1,92 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://animenosub.to/?s=${keyword}`); + const html = await response.text(); + + // Regex pattern to extract the title, image, and href from the article elements + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)">\s*<div class="epl-num">([\d.]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + results.reverse(); + return JSON.stringify(results); +} + + +async function extractStreamUrl(url) { + const response = await fetchv2(url); + const html = await response.text(); + + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const anotherFallbackDawggggWhatsWrongWithTHisWebsite = /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + + + let match = html.match(regexSub) || html.match(regexFallback) || html.match(anotherFallbackDawggggWhatsWrongWithTHisWebsite); + if (!match) return null; + + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + + if (!iframeMatch) return null; + + const streamUrl = iframeMatch[1].startsWith("//") ? "https:" + iframeMatch[1] : iframeMatch[1]; + + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + console.error(m3u8Match ? m3u8Match[1] : null); + return m3u8Match ? m3u8Match[1] : null; +} \ No newline at end of file diff --git a/animenosub/animenosub.json b/animenosub/animenosub.json new file mode 100644 index 0000000..dc23672 --- /dev/null +++ b/animenosub/animenosub.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AnimeNoSub", + "iconUrl": "https://i3.wp.com/animenosub.to/wp-content/uploads/2024/04/cropped-favicon-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.4", + "language": "English (SUB/DUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://vidmoly.to/", + "searchBaseUrl": "https://animenosub.to/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animenosub/animenosub.js", + "asyncJS": true, + "type": "anime" +} diff --git a/animeq/animeq.js b/animeq/animeq.js new file mode 100644 index 0000000..0a126fc --- /dev/null +++ b/animeq/animeq.js @@ -0,0 +1,138 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://animeq.blog/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="result-item">[\s\S]*?<a href="([^"]+)"[^>]*>\s*<img src="([^"]+)"[^>]*alt="([^"]+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: cleanHtmlSymbols(match[3].trim()) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<p>\s*Sinopse\s*:\s*([\s\S]*?)<\/p>/i; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "fuck off you don't need a description"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + + const regex = /<div class=['"]?numerando['"]?[^>]*>\d+\s*-\s*(\d+)<\/div>[\s\S]*?<a\s+href=['"]([^'"]+)['"][^>]*>/g; + + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + const episodeNumber = parseInt(match[1], 10); + const href = match[2].trim(); + + results.push({ + href: "episode: " + href, + number: episodeNumber + }); + } + + if (results.length === 0) { + results.push({ + href: "movie: " + url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + let endpointType; + + if (url.startsWith("movie: ")) { + url = url.replace("movie: ", ""); + endpointType = "movie"; + } else if (url.startsWith("episode: ")) { + url = url.replace("episode: ", ""); + endpointType = "tv"; + } else { + return "ERROR"; + } + + const response = await fetchv2(url); + const html = await response.text(); + + const idMatch = html.match(/<link rel=['"]shortlink['"] href=['"][^?]+\?p=(\d+)['"]/); + if (!idMatch) return "ID NOT FOUND"; + const id = idMatch[1]; + + const apiUrl = `https://animeq.blog/wp-json/dooplayer/v2/${id}/${endpointType}/1`; + const apiResponse = await fetchv2(apiUrl); + const apiData = await apiResponse.json(); + + if (!apiData.embed_url) return { error: "embed_url not found" }; + const embedResponse = await fetchv2(apiData.embed_url); + const embedHtml = await embedResponse.text(); + + const fileMatch = embedHtml.match(/"file":"(https?:\\\/\\\/[^"]+)"/); + if (!fileMatch) return { error: "file not found" }; + + const fileUrl = fileMatch[1].replace(/\\\//g, "/"); + + return fileUrl; + } catch (err) { + console.error("Error extracting stream URL:"+ err); + return "{ error: err.message }"; + } +} + +function cleanHtmlSymbols(string) { + if (!string) return ""; + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} diff --git a/animeq/animeq.json b/animeq/animeq.json new file mode 100644 index 0000000..2ef2ea5 --- /dev/null +++ b/animeq/animeq.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Animeq", + "iconUrl": "https://animeq.blog/wp-content/uploads/2025/06/Favicon-AnimeQ-1.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Portuguese", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://animeq.blog/", + "searchBaseUrl": "https://animeq.blog/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animeq/animeq.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/animesaturn/animesaturn.js b/animesaturn/animesaturn.js new file mode 100644 index 0000000..a08eb9f --- /dev/null +++ b/animesaturn/animesaturn.js @@ -0,0 +1,79 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://www.animesaturn.cx/animelist?search=${keyword}`); + const html = await response.text(); + + const regex = /<a href="(https:\/\/www\.animesaturn\.cx\/anime\/[^"]+)"[^>]*class="thumb image-wrapper">\s*<img src="(https:\/\/cdn\.animesaturn\.cx\/static\/images\/copertine\/[^"]+)"[^>]*alt="([^"]+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const descriptionRegex = /<div id="shown-trama">([^<]+)<\/div>/; + const descriptionMatch = html.match(descriptionRegex); + const description = descriptionMatch ? descriptionMatch[1].trim() : 'N/A'; + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const episodeRegex = /<a\s+href="(https:\/\/www\.animesaturn\.cx\/ep\/[^"]+)"\s*target="_blank"\s*class="btn btn-dark mb-1 bottone-ep">\s*Episodio\s+(\d+)\s*<\/a>/gs; + + let match; + while ((match = episodeRegex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results); +} + +async function extractStreamUrl(url) { + const response = await fetchv2(url); + const html = await response.text(); + + const streamUrlRegex = /<a href="(https:\/\/www\.animesaturn\.cx\/watch\?file=[^"]+)"/; + const match = html.match(streamUrlRegex); + + const redirect = match ? match[1] : null; + const responseTwo = await fetchv2(redirect); + const htmlTwo = await responseTwo.text(); + + const hlsUrlRegex = /file:\s*"(https:\/\/[^"]+\.m3u8)"/; + const hlsMatch = htmlTwo.match(hlsUrlRegex); + + if (hlsMatch) { + return hlsMatch[1].trim(); + } + + const mp4UrlRegex = /<source[^>]+src="(https:\/\/[^">]+\.mp4)"/; + const mp4Match = htmlTwo.match(mp4UrlRegex); + + return mp4Match ? mp4Match[1].trim() : null; +} + diff --git a/animesaturn/animesaturn.json b/animesaturn/animesaturn.json new file mode 100644 index 0000000..e813a26 --- /dev/null +++ b/animesaturn/animesaturn.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AnimeSaturn", + "iconUrl": "https://www.animesaturn.cx/immagini/apple-touch-icon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Italian (SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.animesaturn.cx/", + "searchBaseUrl": "https://www.animesaturn.cx/?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animesaturn/animesaturn.js", + "asyncJS": true, + "type": "anime" +} diff --git a/animesdigital/animesdigital.js b/animesdigital/animesdigital.js new file mode 100644 index 0000000..023cc6f --- /dev/null +++ b/animesdigital/animesdigital.js @@ -0,0 +1,119 @@ +async function searchResults(keyword) { + const results = []; + try { + const headers = { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "X-Requested-With": "XMLHttpRequest" + }; + const postdata = `token=c1deb78cd4&pagina=1&search=${keyword}&limit=3000&type=lista&filters=%7B%22filter_data%22%3A%22filter_letter%3D0%26type_url%3Danimes%26filter_audio%3Dlegendado%26filter_order%3Dname%22%2C%22filter_genre_add%22%3A%5B%5D%2C%22filter_genre_del%22%3A%5B%5D%7D`; + + const response = await fetchv2("https://animesdigital.org/func/listanime", headers, "POST", postdata); + const data = await response.json(); + + const regex = /<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<span class="title_anime">(.*?)<\/span>/s; + + for (const item of data.results) { + const match = regex.exec(item); + if (match) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: match[3].trim() + }); + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="sinopse">(.*?)<\/div>/s; + const match = regex.exec(html); + + const description = match ? match[1] + .replace(/ /g, " ") + .replace(/\s+/g, " ") + .trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*>[\s\S]*?<div class="title_anime">.*?Epis[oó]dio\s*([0-9]+(?:\.[0-9]+)?)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: Math.round(parseFloat(match[2])) + }); + } + + return JSON.stringify(results.reverse()); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const iframeRegex = /<iframe[^>]*src="([^"]*anivideo\.net[^"]*)"[^>]*>/i; + const iframeMatch = html.match(iframeRegex); + + if (!iframeMatch) { + return "https://files.catbox.moe/avolvc.mp4"; + } + + const apiUrl = iframeMatch[1]; + + const apiResponse = await fetchv2(apiUrl); + const apiHtml = await apiResponse.text(); + + const m3u8Regex = /file:\s*['"]([^'"]*\.m3u8[^'"]*)['"]/i; + const m3u8Match = apiHtml.match(m3u8Regex); + + if (m3u8Match) { + return m3u8Match[1]; + } + + return "https://files.catbox.moe/avolvc.mp4"; + + } catch (err) { + console.error('Error extracting stream URL:', err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} diff --git a/animesdigital/animesdigital.json b/animesdigital/animesdigital.json new file mode 100644 index 0000000..3986105 --- /dev/null +++ b/animesdigital/animesdigital.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimesDigital", + "iconUrl": "https://animesdigital.org/wp-content/uploads/2025/03/cropped-logo-e1740827992823-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Portuguese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animesdigital.org/home", + "searchBaseUrl": "https://animesdigital.org/home", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animesdigital/animesdigital.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/animesdrive/animesdrive.js b/animesdrive/animesdrive.js new file mode 100644 index 0000000..dc5c5e1 --- /dev/null +++ b/animesdrive/animesdrive.js @@ -0,0 +1,138 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://animesdrive.blog/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="result-item">[\s\S]*?<a href="([^"]+)"[^>]*>\s*<img src="([^"]+)"[^>]*alt="([^"]+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: cleanHtmlSymbols(match[3].trim()) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<p[^>]*>\s*Sinopse\s*:\s*([\s\S]*?)<\/p>/i; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "fuck off you don't need a description"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + + +async function extractEpisodes(url) { + const results = []; + + const regex = /<div class=['"]?numerando['"]?[^>]*>\d+\s*-\s*(\d+)<\/div>[\s\S]*?<a\s+href=['"]([^'"]+)['"][^>]*>/g; + + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + const episodeNumber = parseInt(match[1], 10); + const href = match[2].trim(); + + results.push({ + href: "episode: " + href, + number: episodeNumber + }); + } + + if (results.length === 0) { + results.push({ + href: "movie: " + url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + let endpointType; + + if (url.startsWith("movie: ")) { + url = url.replace("movie: ", ""); + endpointType = "movie"; + } else if (url.startsWith("episode: ")) { + url = url.replace("episode: ", ""); + endpointType = "tv"; + } else { + return "ERROR"; + } + + const response = await fetchv2(url); + const html = await response.text(); + + const idMatch = html.match(/<link rel=['"]shortlink['"] href=['"][^?]+\?p=(\d+)['"]/); + if (!idMatch) return "ID NOT FOUND"; + const id = idMatch[1]; + + const apiUrl = `https://animesdrive.blog/wp-json/dooplayer/v2/${id}/${endpointType}/1`; + const apiResponse = await fetchv2(apiUrl); + const apiData = await apiResponse.json(); + console.log(JSON.stringify(apiData)); + + const embedResponse = await fetchv2(apiData.embed_url); + const embedHtml = await embedResponse.text(); + + const match = embedHtml.match(/<source\s+src="([^"]+)"\s+type="video\/mp4"/i); + const finalUrl = match ? match[1] : null; + console.log("Final URL: " + finalUrl); + + return finalUrl + } catch (err) { + console.error("Error extracting stream URL:"+ err); + return "{ error: err.message }"; + } +} + +function cleanHtmlSymbols(string) { + if (!string) return ""; + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} diff --git a/animesdrive/animesdrive.json b/animesdrive/animesdrive.json new file mode 100644 index 0000000..3befdd3 --- /dev/null +++ b/animesdrive/animesdrive.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimesDrive", + "iconUrl": "https://animesdrive.blog/wp-content/uploads/2025/08/cropped-ico-1-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Portuguese", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://animesdrive.blog/", + "searchBaseUrl": "https://animesdrive.blog/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animesdrive/animesdrive.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/animesonline/animesonline.js b/animesonline/animesonline.js new file mode 100644 index 0000000..6d04b0c --- /dev/null +++ b/animesonline/animesonline.js @@ -0,0 +1,144 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://animesonline.cloud/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="result-item">[\s\S]*?<a href="([^"]+)"[^>]*>\s*<img src="([^"]+)"[^>]*alt="([^"]+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: cleanHtmlSymbols(match[3].trim()) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<p>\s*Sinopse\s*:\s*([\s\S]*?)<\/p>/i; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "fuck off you don't need a description"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + + const regex = /<div class=['"]?numerando['"]?[^>]*>\d+\s*-\s*(\d+)<\/div>[\s\S]*?<a\s+href=['"]([^'"]+)['"][^>]*>/g; + + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + const episodeNumber = parseInt(match[1], 10); + const href = match[2].trim(); + + results.push({ + href: "episode: " + href, + number: episodeNumber + }); + } + + if (results.length === 0) { + results.push({ + href: "movie: " + url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + let endpointType; + + if (url.startsWith("movie: ")) { + url = url.replace("movie: ", ""); + endpointType = "movie"; + } else if (url.startsWith("episode: ")) { + url = url.replace("episode: ", ""); + endpointType = "tv"; + } else { + return "ERROR"; + } + + const response = await fetchv2(url); + const html = await response.text(); + + const idMatch = html.match(/<link rel=['"]shortlink['"] href=['"][^?]+\?p=(\d+)['"]/); + if (!idMatch) return "ID NOT FOUND"; + const id = idMatch[1]; + + const apiUrl = `https://animesonline.cloud/wp-json/dooplayer/v2/${id}/${endpointType}/1`; + const apiResponse = await fetchv2(apiUrl); + const apiData = await apiResponse.json(); + console.log(JSON.stringify(apiData)); + + if (!apiData.embed_url) return { error: "embed_url not found" }; + const embedResponse = await fetchv2(apiData.embed_url); + const embedHtml = await embedResponse.text(); + console.log(embedHtml); + + const fileMatch = embedHtml.match(/"file":"(https?:\\\/\\\/[^"]+)"/); + if (!fileMatch) return { error: "file not found" }; + + const fileUrl = fileMatch[1].replace(/\\\//g, "/"); + + let finalUrl = encodeURI(fileUrl); + + console.log(finalUrl); + + return finalUrl; + } catch (err) { + console.error("Error extracting stream URL:"+ err); + return "{ error: err.message }"; + } +} + +function cleanHtmlSymbols(string) { + if (!string) return ""; + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} diff --git a/animesonline/animesonline.json b/animesonline/animesonline.json new file mode 100644 index 0000000..0888f7d --- /dev/null +++ b/animesonline/animesonline.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimesOnline", + "iconUrl": "https://animesonline.cloud/wp-content/uploads/2025/06/Icone.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Portuguese", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://animesonline.cloud", + "searchBaseUrl": "https://animesonline.cloud", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animesonline/animesonline.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/animesrbija/animesrbija.js b/animesrbija/animesrbija.js new file mode 100644 index 0000000..03ad405 --- /dev/null +++ b/animesrbija/animesrbija.js @@ -0,0 +1,132 @@ +async function searchResults(keyword) { + const results = []; + const baseUrl = "https://www.animesrbija.com"; + const response = await fetchv2("https://www.animesrbija.com/filter?search=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const animeItems = html.match(/<div class="ani-item">.*?<\/h3><\/a><\/div>/gs) || []; + + animeItems.forEach(itemHtml => { + const titleMatch = itemHtml.match(/<h3 class="ani-title" title="([^"]+)"/); + const hrefMatch = itemHtml.match(/<a href="([^"]+)"/); + const imgMatch = itemHtml.match(/<noscript>.*?src="([^"]+)".*?<\/noscript>/s); + + const title = titleMatch ? titleMatch[1].trim() : ''; + const href = hrefMatch ? baseUrl + hrefMatch[1].trim() : ''; + let imageUrl = ''; + + if (imgMatch) { + let srcUrl = imgMatch[1]; + if (srcUrl.includes('/_next/image?url=')) { + const urlParam = srcUrl.match(/url=([^&]+)/); + if (urlParam) { + imageUrl = baseUrl + decodeURIComponent(urlParam[1]); + } + } else { + imageUrl = srcUrl.startsWith('http') ? srcUrl : baseUrl + srcUrl; + } + } + + if (title && href) { + results.push({ + title, + image: imageUrl, + href + }); + } + }); + + console.log(results); + return JSON.stringify(results); +} + +async function extractDetails(url) { + const details = []; + const response = await fetchv2(url); + const html = await response.text(); + const descriptionMatch = html.match(/<div class="anime-description">([\s\S]*?)<\/div>/); + let description = descriptionMatch ? descriptionMatch[1] + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/<br \/>\n/g, ' ') + .replace(/\s+/g, ' ') + .trim() : ''; + + + const nameMatch = html.match(/<h2 class="anime-name[^>]*>([^<]+)<\/h2>/); + const engNameMatch = html.match(/<h3 class="anime-eng-name">([^<]+)<\/h3>/); + + const airdateMatch = html.match(/<span class="bt">Datum:<\/span>([^<]+)/); + let airdate = airdateMatch ? airdateMatch[1].trim() : ''; + + let name = nameMatch ? nameMatch[1].trim() : ''; + let engName = engNameMatch ? engNameMatch[1].trim() : ''; + let aliases = name === engName ? 'N/A' : engName; + + if (description || airdate) { + details.push({ + description: description, + aliases: aliases, + airdate: airdate + }); + } + + console.log(details); + return JSON.stringify(details); +} + +async function extractEpisodes(url) { + const episodes = []; + const response = await fetchv2(url); + const html = await response.text(); + const baseUrl = 'https://www.animesrbija.com'; + + const episodeRegex = /<li\s+class="anime-episode-item">\s*<span\s+class="anime-episode-num">([^<]+)<\/span>\s*<a\s+class="anime-episode-link"\s+href="([^"]+)"/g; + + let match; + while ((match = episodeRegex.exec(html)) !== null) { + const episodeText = match[1].trim(); + const href = baseUrl + match[2]; + let number; + + if (episodeText.toLowerCase() === 'film') { + number = 1; + } else { + const numberMatch = episodeText.match(/\d+/); + number = numberMatch ? parseInt(numberMatch[0], 10) : null; + } + + episodes.push({ + href: href, + number: number + }); + } + + episodes.reverse(); + console.log(JSON.stringify(episodes)); + return JSON.stringify(episodes); +} + +async function extractStreamUrl(url) { + const response = await fetchv2(url); + const html = await response.text(); + + const playerRegex = /"player1":\s*"?(!?https?:\/\/[^"\n]+\.m3u8)"/i; + + const match = html.match(playerRegex); + if (match) { + let playerUrl = match[1].trim(); + if (playerUrl.startsWith('!')) { + playerUrl = playerUrl.substring(1); + } + console.log("URL", playerUrl); + return playerUrl; + } else { + console.log("Link not found"); + return null; + } +} + + + diff --git a/animesrbija/animesrbija.json b/animesrbija/animesrbija.json new file mode 100644 index 0000000..d55a9a2 --- /dev/null +++ b/animesrbija/animesrbija.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AnimeSRBIJA", + "iconUrl": "https://emojigraph.org/media/joypixels/flag-serbia_1f1f7-1f1f8.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Serbian", + "streamType": "m3u8", + "quality": "720p", + "baseUrl": "https://www.animesrbija.com/", + "searchBaseUrl": "https://www.animesrbija.com/filter?search=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animesrbija/animesrbija.js", + "asyncJS": true, + "type": "anime" +} diff --git a/animesrbija/iconalt.png b/animesrbija/iconalt.png new file mode 100644 index 0000000000000000000000000000000000000000..1d728287c2b7919bd98e5aa1ae474cbea06c6d49 GIT binary patch literal 104874 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%0A7( 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 literal 0 HcmV?d00001 diff --git a/animesroll/animesroll.js b/animesroll/animesroll.js new file mode 100644 index 0000000..7af5680 --- /dev/null +++ b/animesroll/animesroll.js @@ -0,0 +1,171 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2( + "https://api-search.anroll.net/data?q=" + encodeURIComponent(keyword) + ); + const json = await response.json(); + + if (json.code === 200 && json.data && Array.isArray(json.data)) { + for (const item of json.data) { + if (item.generic_path && item.generic_path.startsWith("/f/")) { + continue; + } + + results.push({ + title: item.title, + image: `https://www.anroll.net/_next/image?url=${encodeURIComponent( + "https://static.anroll.net/images/animes/capas/" + item.slug + ".jpg" + )}&w=384&q=75`, + href: "https://www.anroll.net" + item.generic_path, + }); + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([ + { + title: "Error", + image: "Error", + href: "Error", + }, + ]); + } +} + + +async function extractDetails(url) { + try { + console.log(url); + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="sinopse">(.*?)<\/div>/s); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([ + { + description: description, + aliases: "N/A", + airdate: "N/A", + }, + ]); + } catch (err) { + return JSON.stringify([ + { + description: "Error", + aliases: "Error", + airdate: "Error", + }, + ]); + } +} + +async function extractEpisodes(url) { + try { + const results = []; + + const response = await fetchv2(url); + const html = await response.text(); + + const episodesMatch = html.match(/"episodes"\s*:\s*(\d+)/); + const episodes = episodesMatch ? parseInt(episodesMatch[1], 10) : null; + const idMatch = html.match(/"id_serie"\s*:\s*(\d+)/); + const serieId = idMatch ? parseInt(idMatch[1], 10) : null; + + if (!episodes || !serieId) { + console.log("Failed to extract episode count or serie ID."); + return JSON.stringify([{ href: "Error", number: "Error" }]); + } + + const totalPages = Math.ceil(episodes / 25); + + const pagePromises = []; + for (let page = 1; page <= totalPages; page++) { + const apiUrl = `https://apiv3-prd.anroll.net/animes/${serieId}/episodes?page=${page}&order=desc`; + + pagePromises.push( + fetchv2(apiUrl) + .then(response => response.json()) + .then(json => { + console.log(`Fetched page ${page} of ${totalPages}...`); + if (json && json.data && Array.isArray(json.data)) { + return json.data.map(ep => ({ + href: "https://www.anroll.net/watch/e/" + ep.generate_id, + number: parseInt(ep.n_episodio, 10), + })); + } + return []; + }) + .catch(error => { + console.log(`Error fetching page ${page}:`, error); + return []; + }) + ); + } + + const pageResults = await Promise.all(pagePromises); + + pageResults.forEach(pageEpisodes => { + results.push(...pageEpisodes); + }); + + return JSON.stringify(results.reverse()); + } catch (err) { + console.log("Error during fetch:", err); + return JSON.stringify([{ href: "Error", number: "Error" }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const patterns = [ + /"streamUrl"\s*:\s*"([^"]+\.m3u8)"/, + /"streamUrl\\?"\s*:\s*\\?"([^"\\]+\.m3u8)\\?"/, + /streamUrl['"]\s*:\s*['"](https?:\/\/[^'"]+\.m3u8)['"]/, + /streamUrl\s*:\s*"([^"]+\.m3u8)"/, + /\\"streamUrl\\":\\"([^"\\]+\.m3u8)\\"/ + ]; + + for (const pattern of patterns) { + const match = html.match(pattern); + if (match && match[1]) { + const streamUrl = match[1] + .replace(/\\"/g, '"') + .replace(/\\\//g, '/') + .replace(/\\\\/g, '\\'); + return streamUrl; + } + } + + const nextDataMatch = html.match(/self\.__next_f\.push\(\[1,"([^"]+)"\]\)/g); + if (nextDataMatch) { + for (const match of nextDataMatch) { + const dataMatch = match.match(/self\.__next_f\.push\(\[1,"([^"]+)"\]\)/); + if (dataMatch && dataMatch[1]) { + const decodedData = dataMatch[1] + .replace(/\\"/g, '"') + .replace(/\\\//g, '/') + .replace(/\\n/g, '\n'); + + const streamMatch = decodedData.match(/streamUrl['"]\s*:\s*['"](https?:\/\/[^'"]+\.m3u8)['"]/); + if (streamMatch && streamMatch[1]) { + return streamMatch[1]; + } + } + } + } + + return "https://files.catbox.moe/avolvc.mp4"; + + } catch (err) { + console.error('Error extracting stream URL:', err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + diff --git a/animesroll/animesroll.json b/animesroll/animesroll.json new file mode 100644 index 0000000..e39ba10 --- /dev/null +++ b/animesroll/animesroll.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimesRoll", + "iconUrl": "https://cdn.countryflags.com/thumbs/portugal/flag-button-round-250.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Portuguese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.anroll.net/", + "searchBaseUrl": "https://www.anroll.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animesroll/animesroll.js", + "type": "animes", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/animetoast/animetoast.js b/animetoast/animetoast.js new file mode 100644 index 0000000..1f5f481 --- /dev/null +++ b/animetoast/animetoast.js @@ -0,0 +1,94 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://www.animetoast.cc/?s=${keyword}`); + const html = await response.text(); + + const regex = /<a href="(https:\/\/www\.animetoast\.cc\/[^"]+)"[^>]*title="([^"]+)"[^>]*>[\s\S]*?<img[^>]*src="([^"]+)"[^>]*>[\s\S]*?<\/a>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[2].trim(), + image: match[3].trim(), + href: match[1].trim() + }); + } + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + let description = ''; + const descriptionRegex = /<p>(?:<img[^>]*>)?(.*?)<\/p>/s; + const descriptionMatch = html.match(descriptionRegex); + + if (descriptionMatch && descriptionMatch[1]) { + description = descriptionMatch[1].trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const tabRegex = /<li[^>]*>\s*<a[^>]*href=["']([^"']+)["'][^>]*>Voe<\/a>\s*<\/li>/g; + const tabMatches = [...html.matchAll(tabRegex)]; + + if (tabMatches.length > 0) { + const tabHref = tabMatches[0][1].trim(); + const tabId = tabHref.startsWith('#') ? tabHref.substring(1) : tabHref; + console.error(tabHref); + const divRegex = new RegExp(`<div id="${tabId}"[^>]*>(.*?)<\/div>`, 's'); + const divMatch = html.match(divRegex); + + if (divMatch) { + const epRegex = /<a[^>]*href=["']([^"']+)["'][^>]*>[\s\S]*?Ep\.\s*(\d+)\s*<\/a>/g; + const epMatches = [...divMatch[1].matchAll(epRegex)]; + + results.push(...epMatches.map(match => ({ + href: match[1], + number: parseInt(match[2], 10) + }))); + } + } + console.error(JSON.stringify(results)); + return JSON.stringify(results); + } + + +async function extractStreamUrl(url) { + const response = await fetchv2(url); + const html = await response.text(); + + const voeRegex = /<a href="https:\/\/voe\.sx\/([a-zA-Z0-9]+)"[^>]*>/; + const match = html.match(voeRegex); + + if (match && match[1]) { + const videoId = match[1]; + const streamUrl = `https://kristiesoundsimply.com/e/${videoId}`; + + const streamResponse = await fetchv2(streamUrl); + const streamHtml = await streamResponse.text(); + + const mp4Regex = /'mp4': '([^']+)'/; + const mp4Match = streamHtml.match(mp4Regex); + + if (mp4Match && mp4Match[1]) { + const decodedUrl = atob(mp4Match[1]); + return decodedUrl; + } + } + return null; +} diff --git a/animetoast/animetoast.json b/animetoast/animetoast.json new file mode 100644 index 0000000..42f979a --- /dev/null +++ b/animetoast/animetoast.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AnimeToast", + "iconUrl": "https://www.animetoast.cc/wp-content/uploads/2018/03/toastfavi-300x300.png", + "author": { + "name": "50/50 & Cufiy", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.2.12", + "language": "German (DUB/SUB)", + "streamType": "MP4", + "quality": "1080p", + "baseUrl": "https://www.animetoast.cc/", + "searchBaseUrl": "https://www.animetoast.cc/?s=the%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animetoast/animetoast_v2.js", + "asyncJS": true, + "type": "anime" +} diff --git a/animetoast/animetoast_v2.js b/animetoast/animetoast_v2.js new file mode 100644 index 0000000..994c27a --- /dev/null +++ b/animetoast/animetoast_v2.js @@ -0,0 +1,956 @@ +async function searchResults(keyword) { + const results = []; + const response = await soraFetch(`https://www.animetoast.cc/?s=${keyword}`); + const html = await response.text(); + + const regex = /<a href="(https:\/\/www\.animetoast\.cc\/[^"]+)"[^>]*title="([^"]+)"[^>]*>[\s\S]*?<img[^>]*src="([^"]+)"[^>]*>[\s\S]*?<\/a>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + let title = match[2].trim(); + // if title contains "Ger Dub" or "Ger Sub" or "Eng Dub" or "Eng Sub", remove it and then place it at the beginning of the title + if (title.includes("Ger Dub") || title.includes("Ger Sub") || title.includes("Eng Dub") || title.includes("Eng Sub")) { + let lang = ''; + if (title.includes("Ger Dub")) { + lang = 'DUB'; + } else if (title.includes("Ger Sub")) { + lang = 'SUB'; + } else if (title.includes("Eng Dub")) { + lang = 'EN-DUB'; + } else if (title.includes("Eng Sub")) { + lang = 'EN-SUB'; + } + title = `${lang} ${title.replace(/(Ger Dub|Ger Sub|Eng Dub|Eng Sub)/, '').trim()}`; + } + + results.push({ + title: title, + image: match[3].trim(), + href: match[1].trim() + }); + } + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await soraFetch(url); + const html = await response.text(); + + let description = ''; + const descriptionRegex = /<p>(?:<img[^>]*>)?(.*?)<\/p>/s; + const descriptionMatch = html.match(descriptionRegex); + + if (descriptionMatch && descriptionMatch[1]) { + description = descriptionMatch[1].trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await soraFetch(url); + const html = await response.text(); + + let episodes = []; + try { + episodes = await extractEpisodeHosts(html, url); + } catch (error) { + sendLog("Error extracting episodes: " + error.message); + return JSON.stringify([{ error: "Failed to extract episodes" }]); + } + + + sendLog(JSON.stringify(episodes)); + if (episodes.length === 0) { + sendLog("No episodes found"); + return JSON.stringify([{ error: "No episodes found" }]); + } + let count = 0; + for (const episodeUrl of episodes) { + count++; + results.push({ + href: episodeUrl, + number: count + }); + } + sendLog("Extracted " + count + " episodes"); + return JSON.stringify(results); +} + + async function extractEpisodeHosts(html, url) { + // <li class="active"> + // <a data-toggle="tab" href="#multi_link_tab0">Voe</a> + // </li> + const results = {} + const tabRegex = /<a[^>]*data-toggle=["']tab["'][^>]*href=["']([^"']+)["'][^>]*>(.*?)<\/a>/g; + + const tabMatches = [...html.matchAll(tabRegex)]; + sendLog("Tab matches: " + JSON.stringify(tabMatches)); + if (tabMatches.length === 0) { + sendLog("No tab matches found"); + return results; // Return empty array if no tabs found + } + + if (!tabMatches[0]) { + sendLog("No tab match found"); + return results; // Return empty array if no tab match found + } + + for (const match of tabMatches) { + const tabHref = match[1].trim(); + sendLog("Tab Href: " + tabHref); + const tabId = tabHref.startsWith('#') ? tabHref.substring(1) : tabHref; + sendLog("Tab ID: " + tabId); + const provider = match[2].trim().toLowerCase(); + + // The issue is here - the regex is capturing only the number part after "multi_link_tab" + // but we need to match the full ID + const divRegex = /<div id="(multi_link_tab[^"]+)"[^>]*>([\s\S]*?)<\/div>/gs; + + const divMatch = [...html.matchAll(divRegex)]; + // sendLog("Div matches: " + JSON.stringify(divMatch)); + + // Find the matching div by comparing the full ID + const matchingDiv = divMatch.filter(div => div[1] === tabId); + + // sendLog("Matching Div: " + JSON.stringify(matchingDiv)); + + if (!matchingDiv || matchingDiv.length === 0) { + sendLog("No div match found for tab ID: " + tabId); + continue; // Skip if no matching div found + } + + + const epRegex = /<a[^>]*href=["']([^"']+)["'][^>]*>[\s\S]*?Ep\.\s*(\d+)\s*<\/a>/g; + const epMatches = [...matchingDiv[0][2].matchAll(epRegex)]; + // https://www.animetoast.cc/xxx/?link=0 + + + if (!results[provider]) { + results[provider] = []; + } + results[provider].push(...epMatches.map(match => { + const url = match[1]; + const linkMatch = url.match(/[?&]link=(\d+)/); + return linkMatch ? linkMatch[1] : null; + }).filter(Boolean)); + sendLog(`Extracted ${epMatches.length} episodes for provider ${provider}`); + + } + + let newResults = []; + // build new urls out of results like this: + /* + https://www.animetoast.cc/xxx/#voe=0,doodstream=12,playn=24,fmoon=36,mp4upload=48 + https://www.animetoast.cc/xxx/#voe=1,doodstream=13,playn=25,fmoon=37,mp4upload=49 + ... + */ + // loop through results and build new urls + const maxLength = Math.max(...Object.values(results).map(arr => arr.length)); + for (let i = 0; i < maxLength; i++) { + let newUrl = url.split('#')[0] + '#'; + for (const [provider, links] of Object.entries(results)) { + if (links[i]) { + newUrl += `${provider}=${links[i]},`; + } + } + newUrl = newUrl.slice(0, -1); // Remove trailing comma + newResults.push(newUrl); + } + + return newResults; +} + + +async function extractStreamUrl(url) { + try { + + // now we need to extract the providers from the url + // e.g. https://www.animetoast.cc/sword-art-online-alternative-gun-gale-online-ii-ger-dub/#voe=2,doodstream=14,playn=26,fmoon=38,mp4upload=50 + const baseUrl = url.split('#')[0]; + const providersString = url.split('#')[1]; + if (!providersString) { + sendLog("No providers found in URL: " + url); + return JSON.stringify([{ provider: "Error", link: "No providers found in URL" }]); + } + sendLog("Base URL: " + baseUrl); + sendLog("Providers String: " + providersString); + const providersArray = providersString.split(','); + sendLog("Providers Array: " + JSON.stringify(providersArray)); + // Create a providers object from the providersArray + let tempProviders = {}; + providersArray.forEach(provider => { + const [name, id] = provider.split('='); + tempProviders[name] = id; + }); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + + + // rename fmoon to filemoon + if (tempProviders['fmoon']) { + tempProviders['filemoon'] = tempProviders['fmoon']; + delete tempProviders['fmoon']; + } + + if (tempProviders['doodstream']) { + delete tempProviders['doodstream']; // Idk why, but it just crashes the app + } + + // remove any providers that are not in the list of available providers + for (const provider in tempProviders) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + sendLog(`Extractor for provider ${provider} is not defined, removing...`); + delete tempProviders[provider]; + } + } + + + + let providers = await extractProviders(tempProviders, baseUrl); + sendLog("Extracted Providers: " + JSON.stringify(providers)); + if (Object.keys(providers).length === 0) { + sendLog("No valid providers found, returning error"); + return JSON.stringify([{ provider: "Error", link: "No valid providers found" }]); + } + + // Multiple extractor (recommended) + let streams = []; + try { + streams = await multiExtractor(providers); + let returnedStreams = { + streams: streams, + } + + sendLog("Multi extractor streams: " + JSON.stringify(returnedStreams)); + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Multi extractor error:" + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + } catch (error) { + sendLog("Fetch error:", error); + return null; + } +} + +async function extractProviders(tempProviders, baseUrl) { + let providers = {}; + for (const [name, id] of Object.entries(tempProviders)) { + try { + const response = await fetch(`${baseUrl}?link=${id}`); + const data = response.text ? await response.text() : response; + // get the iframe src from the data + const iframeRegex = /<iframe[^>]+src="([^"]+)"[^>]*>/; + const iframeMatch = data.match(iframeRegex); + if (iframeMatch && iframeMatch[1]) { + const iframeSrc = iframeMatch[1]; + // check if the iframeSrc is a valid URL + if (iframeSrc.startsWith("http") || iframeSrc.startsWith("https")) { + providers[iframeSrc] = name; // Use the name as the key + sendLog(`Provider ${name} found: ${iframeSrc}`); + } + } else { + // get the href from: + /*<div id="player-embed" > + <a href="https://voe.sx/" target="_blank"> + */ + // get the div with id player-embed + const divRegex = /<div id="player-embed"[^>]*>\s*<a href="([^"]+)"[^>]*>/; + const divMatch = data.match(divRegex); + if (divMatch && divMatch[1]) { + const href = divMatch[1]; + // check if the href is a valid URL + if (href.startsWith("http") || href.startsWith("https")) { + providers[href] = name; // Use the name as the key + sendLog(`Provider ${name} found: ${href}`); + } + } else { + + sendLog(`No iframe or div found for provider ${name}, skipping...`); + + continue; // Skip if no iframe or div found + } + } + } catch (error) { + sendLog("Error fetching provider " + name + ": " + error); + } + } + return providers; +} + + +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} + +// Debugging function to send logs +async function sendLog(message) { + console.log(message); + return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ diff --git a/animeunity/animeunity.js b/animeunity/animeunity.js new file mode 100644 index 0000000..5a28b37 --- /dev/null +++ b/animeunity/animeunity.js @@ -0,0 +1,122 @@ +async function searchResults(keyword) { + const response = await fetchv2( + `https://www.animeunity.so/archivio?title=${keyword}` + ); + const html = await response.text(); + + const regex = /<archivio[^>]*records="([^"]*)"/; + const match = regex.exec(html); + + if (!match || !match[1]) { + return { results: [] }; + } + + const items = JSON.parse(match[1].replaceAll(`"`, `"`)); + + const results = + items.map((item) => ({ + title: item.title ?? item.title_eng, + image: item.imageurl, + href: `https://www.animeunity.so/info_api/${item.id}`, + })) || []; + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const response = await fetchv2(url); + const json = JSON.parse(await response.text()); + + return JSON.stringify([ + { + description: json.plot, + aliases: "N/A", + airdate: json.date, + }, + ]); +} + +async function extractEpisodes(url) { + try { + const episodes = []; + + const apiResponse = await fetchv2(url); + const apiJson = JSON.parse(await apiResponse.text()); + const slug = apiJson.slug; + const idAnime = apiJson.id; + + if (!slug) { + console.log("No slug found in API response"); + return episodes; + } + + const pageResponse = await fetchv2( + `https://www.animeunity.so/anime/${idAnime}-${slug}` + ); + const html = await pageResponse.text(); + + const videoPlayerRegex = + /<video-player[^>]*anime="([^"]*)"[^>]*episodes="([^"]*)"/; + const videoPlayerMatch = html.match(videoPlayerRegex); + if (!videoPlayerMatch) { + console.log("No video-player tag found"); + return episodes; + } + + const decodeHtml = (str) => + str.replace(/"/g, '"').replace(/\\\//g, "/"); + + const animeJsonStr = decodeHtml(videoPlayerMatch[1]); + const episodesJsonStr = decodeHtml(videoPlayerMatch[2]); + + const animeData = JSON.parse(animeJsonStr); + const episodesData = JSON.parse(episodesJsonStr); + + episodesData.forEach((episode) => { + episodes.push({ + href: `https://animeunity.so/anime/${idAnime}-${slug}/${episode.id}`, + number: parseInt(episode.number), + }); + }); + + return JSON.stringify(episodes); + } catch (error) { + console.log("Error extracting episodes:", error); + return []; + } +} + +async function extractStreamUrl(url) { + try { + const response1 = await fetchv2(url); + const html = await response1.text(); + + const vixcloudMatch = html.match( + /embed_url="(https:\/\/vixcloud\.co\/embed\/\d+\?[^"]+)"/ + ); + if (!vixcloudMatch) { + console.log("No vixcloud.co URL found in the HTML."); + return null; + } + + let vixcloudUrl = vixcloudMatch[1]; + vixcloudUrl = vixcloudUrl.replace(/&/g, "&"); + + const response = await fetch(vixcloudUrl); + const downloadUrlMatch = response.match( + /window\.downloadUrl\s*=\s*['"]([^'"]+)['"]/ + ); + + if (!downloadUrlMatch) { + console.log("No downloadUrl found in the response."); + return null; + } + + const downloadURL = downloadUrlMatch[1]; + console.log(downloadURL); + return downloadURL; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} \ No newline at end of file diff --git a/animeunity/animeuntiy.json b/animeunity/animeuntiy.json new file mode 100644 index 0000000..565b49e --- /dev/null +++ b/animeunity/animeuntiy.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AnimeUnity", + "iconUrl": "https://github.com/cottonable/Ryu-preservation/blob/2f10226aa087154974a70c1ec78aa83a47daced9/Ryu/Assets.xcassets/Sources/AnimeUnity.imageset/apple-touch-icon.jpg?raw=true", + "author": { + "name": "sobet", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRQPQ1qIiALbM3xDWGsuJzu6ItaQGwb9ICRRw&s" + }, + "version": "1.0.4", + "language": "Italian", + "streamType": "mp4", + "quality": "720p", + "baseUrl": "https://animeunity.so", + "searchBaseUrl": "https://www.animeunity.so/archivio?title=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animeunity/animeunity.js", + "asyncJS": true, + "type": "anime" +} diff --git a/animeunity/iconalt.png b/animeunity/iconalt.png new file mode 100644 index 0000000000000000000000000000000000000000..5197fef30c61b6b90be64941617ec701109e28a1 GIT binary patch literal 69259 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%0Dq1PdzjrTm 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%0D@%NB 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 literal 0 HcmV?d00001 diff --git a/animeworld/animeworld.js b/animeworld/animeworld.js new file mode 100644 index 0000000..4011a44 --- /dev/null +++ b/animeworld/animeworld.js @@ -0,0 +1,239 @@ +extractStreamUrl( + "https://animeworld.ac/play/seishun-buta-yarou-wa-randoseru-girl-no-yume-wo-minai.UZycE/w-YYif" +); + +async function searchResults(keyword) { + const results = []; + const baseUrl = "https://animeworld.ac"; + + try { + const response = await soraFetch( + `${baseUrl}/search?keyword=${encodeURIComponent(keyword)}` + ); + const html = await response.text(); + + const filmListRegex = + /<div class="film-list">([\s\S]*?)<div class="clearfix"><\/div>\s*<\/div>/; + const filmListMatch = html.match(filmListRegex); + + if (!filmListMatch) { + return JSON.stringify(results); + } + + const filmListContent = filmListMatch[1]; + const itemRegex = /<div class="item">[\s\S]*?<\/div>[\s]*<\/div>/g; + const items = filmListContent.match(itemRegex) || []; + + items.forEach((itemHtml) => { + const imgMatch = itemHtml.match(/src="([^"]+)"/); + let imageUrl = imgMatch ? imgMatch[1] : ""; + + const titleMatch = itemHtml.match(/class="name">([^<]+)</); + const title = titleMatch ? titleMatch[1] : ""; + + const hrefMatch = itemHtml.match(/href="([^"]+)"/); + let href = hrefMatch ? hrefMatch[1] : ""; + + if (imageUrl && title && href) { + if (!imageUrl.startsWith("https")) { + if (imageUrl.startsWith("/")) { + imageUrl = baseUrl + imageUrl; + } else { + imageUrl = baseUrl + "/" + href; + } + } + if (!href.startsWith("https")) { + if (href.startsWith("/")) { + href = baseUrl + href; + } else { + href = baseUrl + "/" + href; + } + } + results.push({ + title: title.trim(), + image: imageUrl, + href: href, + }); + } + }); + + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + console.log("Search error:", error); + return JSON.stringify([]); + } +} + +async function extractDetails(url) { + try { + const response = await soraFetch(url); + const html = await response.text(); + + const details = []; + + const descriptionMatch = html.match(/<div class="desc">([\s\S]*?)<\/div>/); + let description = descriptionMatch ? descriptionMatch[1] : ""; + + const aliasesMatch = html.match(/<h2 class="title" data-jtitle="([^"]+)">/); + let aliases = aliasesMatch ? aliasesMatch[1] : ""; + + const airdateMatch = html.match( + /<dt>Data di Uscita:<\/dt>\s*<dd>([^<]+)<\/dd>/ + ); + let airdate = airdateMatch ? airdateMatch[1] : ""; + + if (description && aliases && airdate) { + details.push({ + description: description, + aliases: aliases, + airdate: airdate, + }); + } + + console.log(JSON.stringify(details)); + return JSON.stringify(details); + } catch (error) { + console.log("Details error:", error); + return JSON.stringify([]); + } +} + +async function extractEpisodes(url) { + try { + const response = await soraFetch(url); + const html = await response.text(); + + const episodes = []; + const baseUrl = "https://animeworld.ac"; + + const serverActiveRegex = + /<div class="server active"[^>]*>([\s\S]*?)<\/ul>\s*<\/div>/; + const serverActiveMatch = html.match(serverActiveRegex); + + if (!serverActiveMatch) { + return JSON.stringify(episodes); + } + + const serverActiveContent = serverActiveMatch[1]; + const episodeRegex = + /<li class="episode">\s*<a[^>]*?href="([^"]+)"[^>]*?>([^<]+)<\/a>/g; + let match; + + while ((match = episodeRegex.exec(serverActiveContent)) !== null) { + let href = match[1]; + const number = parseInt(match[2], 10); + + if (!href.startsWith("https")) { + if (href.startsWith("/")) { + href = baseUrl + href; + } else { + href = baseUrl + "/" + href; + } + } + + episodes.push({ + href: href, + number: number, + }); + } + + console.log(JSON.stringify(episodes)); + return JSON.stringify(episodes); + } catch (error) { + console.log("Episodes error:", error); + return JSON.stringify([]); + } +} + +async function extractStreamUrl(url) { + if (!_0xCheck()) return "https://files.catbox.moe/avolvc.mp4"; + + try { + const response = await soraFetch(url); + const html = await response.text(); + + const idRegex = /<a[^>]+href="([^"]+)"[^>]*id="alternativeDownloadLink"/; + const match = html.match(idRegex); + return match ? match[1] : null; + } catch (error) { + console.log("Stream URL error:", error); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + +async function soraFetch( + url, + options = { headers: {}, method: "GET", body: null, encoding: "utf-8" } +) { + try { + return await fetchv2( + url, + options.headers ?? {}, + options.method ?? "GET", + options.body ?? null, + true, + options.encoding ?? "utf-8" + ); + } catch (e) { + try { + return await fetch(url, options); + } catch (error) { + return null; + } + } +} + +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === "function"; + var _0x2b = typeof _0x7E9A === "function"; + return _0x1a && _0x2b + ? (function (_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) + : !1; +} + +function _0x7E9A(_) { + return (( + ___, + ____, + _____, + ______, + _______, + ________, + _________, + __________, + ___________, + ____________ + ) => ( + (____ = typeof ___), + (_____ = + ___ && ___[String.fromCharCode(...[108, 101, 110, 103, 116, 104])]), + (______ = [...String.fromCharCode(...[99, 114, 97, 110, 99, 105])]), + (_______ = ___ + ? [ + ...___[ + String.fromCharCode( + ...[116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101] + ) + ](), + ] + : []), + (________ = ______[String.fromCharCode(...[115, 108, 105, 99, 101])]()) && + _______[String.fromCharCode(...[102, 111, 114, 69, 97, 99, 104])]( + (_________, __________) => + (___________ = + ________[ + String.fromCharCode(...[105, 110, 100, 101, 120, 79, 102]) + ](_________)) >= 0 && + ________[String.fromCharCode(...[115, 112, 108, 105, 99, 101])]( + ___________, + 1 + ) + ), + ____ === String.fromCharCode(...[115, 116, 114, 105, 110, 103]) && + _____ === 16 && + ________[String.fromCharCode(...[108, 101, 110, 103, 116, 104])] === 0 + ))(_); +} diff --git a/animeworld/animeworld.json b/animeworld/animeworld.json new file mode 100644 index 0000000..bf9fff8 --- /dev/null +++ b/animeworld/animeworld.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AnimeWorld", + "iconUrl": "https://raw.githubusercontent.com/cranci1/Ryu/d48d716ec6c5ef9ae7b3711c117f920b0c7eb1ce/Ryu/Assets.xcassets/Sources/AnimeWorld.imageset/animeworld.png", + "author": { + "name": "sobet", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRQPQ1qIiALbM3xDWGsuJzu6ItaQGwb9ICRRw&s" + }, + "version": "1.0.4", + "language": "Italian", + "streamType": "MP4", + "quality": "1080p", + "baseUrl": "https://animeworld.ac/", + "searchBaseUrl": "https://www.animeworld.ac/search?keyword=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animeworld/animeworld.js", + "type": "anime", + "asyncJS": true +} \ No newline at end of file diff --git a/animeworld/iconalt.png b/animeworld/iconalt.png new file mode 100644 index 0000000000000000000000000000000000000000..81ef6369049de9828e2c7eff3eebe29315eb2aae GIT binary patch literal 49652 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 RD;@A>qzArLd-HD8{{T~L1AhPj literal 0 HcmV?d00001 diff --git a/animexin/animexin.js b/animexin/animexin.js new file mode 100644 index 0000000..f983f0b --- /dev/null +++ b/animexin/animexin.js @@ -0,0 +1,133 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://animexin.dev/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)">\s*<div class="epl-num">([\d.]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + results.reverse(); + return JSON.stringify(results); +} + +async function extractStreamUrl(url) { + const response = await fetchv2(url); + const html = await response.text(); + + const optionRegex = /<option value="([^"]+)"[^>]*>\s*([\s\S]*?)\s*<\/option>/g; + const allowedLabels = ["Hardsub English Dailymotion", "Hardsub Indonesia Dailymotion"]; + const videoOptions = []; + + let match; + while ((match = optionRegex.exec(html)) !== null) { + const base64 = match[1]; + const label = match[2].trim(); + if (!base64 || !allowedLabels.includes(label)) continue; + + const decodedValue = atob(base64); + if (!decodedValue) continue; + + const idMatch = decodedValue.match(/dailymotion\.com\/embed\/video\/([a-zA-Z0-9]+)/); + const videoId = idMatch ? idMatch[1] : null; + if (!videoId) continue; + + videoOptions.push({ videoId, label: label.replace(" Dailymotion", "") }); + } + + async function getBestHls(hlsUrl) { + try { + const res = await fetchv2(hlsUrl); + const text = await res.text(); + + const regex = /#EXT-X-STREAM-INF:.*RESOLUTION=(\d+)x(\d+).*?\n(https?:\/\/[^\n]+)/g; + let match; + const streams = []; + + while ((match = regex.exec(text)) !== null) { + const width = parseInt(match[1]); + const height = parseInt(match[2]); + const url = match[3]; + streams.push({ width, height, url }); + } + + if (streams.length === 0) return hlsUrl; + streams.sort((a, b) => b.height - a.height); + return streams[0].url; + } catch (err) { + return hlsUrl; + } + } + + const streams = []; + for (const option of videoOptions) { + try { + const metaRes = await fetchv2(`https://www.dailymotion.com/player/metadata/video/${option.videoId}`); + const metaJson = await metaRes.json(); + const hlsLink = metaJson.qualities?.auto?.[0]?.url; + if (!hlsLink) continue; + + const bestHls = await getBestHls(hlsLink); + streams.push(option.label.toUpperCase().startsWith("HARDSUB ENGLISH") ? "HardSub English" : "HardSub Indonesian"); + streams.push(bestHls); + } catch (err) { + continue; + } + } + + return JSON.stringify({ + streams: streams, + subtitles: "" + }); +} diff --git a/animexin/animexin.json b/animexin/animexin.json new file mode 100644 index 0000000..ec7ae82 --- /dev/null +++ b/animexin/animexin.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeXin", + "iconUrl": "https://animexin.dev/wp-content/uploads/2020/06/cropped-index-192x192.jpg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English/Indonesian", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animexin.dev/", + "searchBaseUrl": "https://animexin.dev/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animexin/animexin.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/animeytx/animeytx.js b/animeytx/animeytx.js new file mode 100644 index 0000000..649e680 --- /dev/null +++ b/animeytx/animeytx.js @@ -0,0 +1,315 @@ +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://animeytx.net/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>[\s\S]*?<a href="([^"]+)"[^>]*>[\s\S]*?(?:data-src|src)="([^"]+)"[^>]*>[\s\S]*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: cleanTitle(match[3].trim()), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<li data-index="\d+">[\s\S]*?<a href="([^"]+)">/g; + + let match; + let count = 1; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: encodeURI(match[1].trim()), + number: count + }); + count++; + } + + const total = results.length; + results.forEach((ep, i) => { + ep.number = total - i; + }); + + return JSON.stringify(results.reverse()); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(`https://passthrough-worker.simplepostrequest.workers.dev/?simple=${encodeURIComponent(url)}`); + const html = await response.text(); + + // Try primary method first + let iframeMatch = html.match(/<iframe[^>]+data-src="([^"]+)"/); + let filemoonUrl; + + if (iframeMatch) { + const iframeUrl = iframeMatch[1]; + const valueMatch = iframeUrl.match(/value=([^&]+)/); + if (valueMatch) { + const valueId = valueMatch[1]; + const containerResponse = await fetchv2(`https://mytsumi.com/multiplayer/contenedor.php?id=${valueId}`); + const containerHtml = await containerResponse.text(); + const filemoonMatch = containerHtml.match(/"tab_name":"Moon","url":"([^"]+)"/); + if (filemoonMatch) filemoonUrl = filemoonMatch[1].replace(/\\\//g, '/'); + } + } + + // Fallback if no Filemoon found + if (!filemoonUrl) { + const optionMatch = html.match(/<option[^>]+value="([^"]+)"[^>]*>\s*Moon\s*<\/option>/); + if (!optionMatch) return "https://error.org/"; + + const decoded = atob(optionMatch[1]); + const srcMatch = decoded.match(/src="([^"]+)"/); + if (!srcMatch) return "https://error.org/"; + + const fallbackUrl = srcMatch[1]; + const fallbackResponse = await fetchv2(fallbackUrl); + const fallbackHtml = await fallbackResponse.text(); + const filemoonMatch2 = fallbackHtml.match(/<a href="(https:\/\/filemoon\.to\/e\/[^"]+)">/); + if (!filemoonMatch2) return "https://error.org/"; + + filemoonUrl = filemoonMatch2[1]; + } + console.log(filemoonUrl); + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url + }; + const finalResponse = await fetchv2(filemoonUrl, headers); + const finalHtml = await finalResponse.text(); + const streamUrl = await filemoonExtractor(finalHtml, filemoonUrl); + if (streamUrl) return streamUrl; + return "filemoonUrl"; + } catch (err) { + return "https://error.org/"; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ + + + + diff --git a/animeytx/animeytx.json b/animeytx/animeytx.json new file mode 100644 index 0000000..6e44a41 --- /dev/null +++ b/animeytx/animeytx.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AnimeYTX", + "iconUrl": "https://i1.wp.com/animeytx.net/wp-content/uploads/2024/09/cropped-hgn584ghj45-1-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animeytx.net/", + "searchBaseUrl": "https://animeytx.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/animeytx/animeytx.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/anitube/anitube.js b/anitube/anitube.js new file mode 100644 index 0000000..17dfbae --- /dev/null +++ b/anitube/anitube.js @@ -0,0 +1,108 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://www.anitube.news/?s=" + keyword); + const html = await response.text(); + + const regex = /<div class="aniItem">\s*<a href="([^"]+)"[^>]*>[\s\S]*?<img src="([^"]+)"[^>]*>[\s\S]*?<div class="aniItemNome">\s*([^<]+)\s*<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div id="sinopse2">(.*?)<\/div>/s; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const episodes = []; + const epRegex = /<a href="([^"]+)" title="([^"]+)">/g; + + let match; + let counter = 1; + while ((match = epRegex.exec(html)) !== null) { + const href = match[1].trim(); + + if (href === "https://www.anitube.news") continue; + + const title = match[2]; + const numMatch = /Episódio\s+(\d+)/.exec(title); + const number = numMatch ? parseInt(numMatch[1], 10) : counter++; + + episodes.push({ + number: number, + href: href + }); + } + + if (episodes.length > 1 && episodes[0].number > episodes[1].number) { + episodes.reverse(); + } + + return JSON.stringify(episodes); + } catch (err) { + return JSON.stringify([{ + number: -1, + href: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /src="https:\/\/api\.anivideo\.net\/videohls\.php\?d=([^"&]+\.m3u8)[^"]*"/; + const match = regex.exec(html); + + if (!match) { + return "Error: stream not found"; + } + + const hlsUrl = decodeURIComponent(match[1]); + + return hlsUrl; + } catch (err) { + return "Error: " + err.message; + } +} diff --git a/anitube/anitube.json b/anitube/anitube.json new file mode 100644 index 0000000..f9845b6 --- /dev/null +++ b/anitube/anitube.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AniTube", + "iconUrl": "https://www.anitube.news/wp-content/uploads/cropped-Favicon6-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Portuguese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.anitube.news/", + "searchBaseUrl": "https://www.anitube.news/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/anitube/anitube.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/aniworld/AniWorldEngSub.json b/aniworld/AniWorldEngSub.json new file mode 100644 index 0000000..403c0b3 --- /dev/null +++ b/aniworld/AniWorldEngSub.json @@ -0,0 +1,18 @@ +{ + "sourceName": "AniWorld (ENG SUB)", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/aniworld/aniworld.png", + "author": { + "name": "Hamzo & Cufiy", + "icon": "https://cdn.discordapp.com/avatars/623644371819954226/591ecab10b0b4535e859bb0b9bbe62e5?size=1024" + }, + "version": "0.2.7", + "language": "English (SUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://google.com", + "searchBaseUrl": "https://aniworld.to/ajax/seriesSearch?keyword=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/aniworld/v2/AniWorldEngSub_v2.js", + "asyncJS": true, + "streamAsyncJS": false, + "type": "anime" +} diff --git a/aniworld/AniWorldGerDub.dev.json b/aniworld/AniWorldGerDub.dev.json new file mode 100644 index 0000000..44ee33e --- /dev/null +++ b/aniworld/AniWorldGerDub.dev.json @@ -0,0 +1,17 @@ +{ + "sourceName": "AniWorld (fixed)", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/aniworld/aniworld.png", + "author": { + "name": "Cufiy", + "icon": "https://cdn.discordapp.com/avatars/623644371819954226/591ecab10b0b4535e859bb0b9bbe62e5?size=1024" + }, + "version": "0.2.52", + "language": "German (DUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://vidmoly.to/", + "searchBaseUrl": "https://aniworld.to/ajax/seriesSearch?keyword=%s", + "scriptUrl": "http://192.168.2.130/sora-sources2/aniworld/v2/AniWorldGerDub_v2.js", + "asyncJS": true, + "type": "anime" +} \ No newline at end of file diff --git a/aniworld/AniWorldGerDub.json b/aniworld/AniWorldGerDub.json new file mode 100644 index 0000000..6c39795 --- /dev/null +++ b/aniworld/AniWorldGerDub.json @@ -0,0 +1,18 @@ +{ + "sourceName": "AniWorld (GER DUB)", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/aniworld/aniworld.png", + "author": { + "name": "Hamzo & Cufiy", + "icon": "https://cdn.discordapp.com/avatars/623644371819954226/591ecab10b0b4535e859bb0b9bbe62e5?size=1024" + }, + "version": "0.2.7", + "language": "German (DUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://google.com", + "searchBaseUrl": "https://aniworld.to/ajax/seriesSearch?keyword=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/aniworld/v2/AniWorldGerDub_v2.js", + "asyncJS": true, + "streamAsyncJS": false, + "type": "anime" +} diff --git a/aniworld/AniWorldGerSub.json b/aniworld/AniWorldGerSub.json new file mode 100644 index 0000000..6bb0ee8 --- /dev/null +++ b/aniworld/AniWorldGerSub.json @@ -0,0 +1,18 @@ +{ + "sourceName": "AniWorld (GER SUB)", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/aniworld/aniworld.png", + "author": { + "name": "Hamzo & Cufiy", + "icon": "https://cdn.discordapp.com/avatars/623644371819954226/591ecab10b0b4535e859bb0b9bbe62e5?size=1024" + }, + "version": "0.2.7", + "language": "German (SUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://google.com", + "searchBaseUrl": "https://aniworld.to/ajax/seriesSearch?keyword=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/aniworld/v2/AniWorldGerSub_v2.js", + "asyncJS": true, + "streamAsyncJS": false, + "type": "anime" +} diff --git a/aniworld/aniworld.png b/aniworld/aniworld.png new file mode 100644 index 0000000000000000000000000000000000000000..c4980a5962088b7b519e47b34f8bfc82f9f32133 GIT binary patch literal 4383 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 YUc5%{d!~#A`o#yJuVbQJrRfy?Kd0<B@Bjb+ literal 0 HcmV?d00001 diff --git a/aniworld/icon.png b/aniworld/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9abe268470761d0b905613b99408e795d042473a GIT binary patch literal 38144 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 literal 0 HcmV?d00001 diff --git a/aniworld/iconSub.png b/aniworld/iconSub.png new file mode 100644 index 0000000000000000000000000000000000000000..a5672a2216be92a5d2bab547a7f86248a36a6e5c GIT binary patch literal 38380 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%0D^0WfYh!@N<T(O#;KYHA1=a#KMomIP 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 literal 0 HcmV?d00001 diff --git a/aniworld/iconSubEng.png b/aniworld/iconSubEng.png new file mode 100644 index 0000000000000000000000000000000000000000..33e323fba0b9d1db6fe4f0ad5b1bee3a40df7ae1 GIT binary patch literal 40154 zcmeFYS6Gu>*Dea8pdz4xf*?f^k={YN2!eF!z4wlx1i^s5A}GE0BGROUfT4#Fq<5r7 zy7b;50Ycdi<^BHuU)MU=*WM@VU>%4gJkKnn&3oKq%&%`$<VbE(-^9biBaweCqmGA% zzkBxY`W4_CnbOzez<)PfU+cNy;gL3;{lkxCBc;K^yP9IBsq3z*tR!OL;>2lY>0)lh z>E+}KJdKAZCh6sBX5nDv&R}k3W9KZ+yn#S5GuT;*GwTQ_b1S<_TiM#Z_6AvLc&lhy zcsp1KTQW;Z+!XT?0S0igayMh}a&mNb6Y&yfJ|9;E`2Fl_E@t2%kfpVVx{U1QBfuwd zW?Of6R}n5QFc{1U=Hqk$*>Ld)3k!2`^K$X>asW?oxV>|BH}m3fc4GuaxXExnhK!Y) z1<20T-Ok0C;cQGZa~BVHac1V543|Soxx0hx%>OgGvm2+``8OVCuW$mJ<}$N%<Kp4u zK3f(8gV@FMB2t!aXCE&n(Xe`Z{^8=2quu#Tu4W)NE6sPVR^rU+R&FjHAPcMW5zbz^ z97GyqW#(>WDZ$IlE5O0c%fTxo#`VAa>1>Ywdf}CqyS$}@wUw2inGm-S2fsDna}ItB z;D<1uH4ldXx0RWI6%VharM3Bg2D*6Ve-0yS4vZqeE5Iu#Ak4$hBP1;Foclj7od5BE zKCkKGVPSi=6$#$|JoaDToj)tabtYX$y9=S5f4G#&f8Mwd*~NqZO)dZLRb^@MA2qpp zfE>?Fz|w-t%F)Wn%Gv!)Nj#TIva}F!w{v&2`Y#npIlBK(6#=#<;%Me<BhKu_VQFP; z=HckhEFq)yl7WMP=YO-A%lE~&{@c+1Kepof-wgW9<j(!-%-DcG0Q=y(+z0SUM9Rb6 z)&(SCX6y1!?Cj6~egPQxxtRYyi4yR@|H$%x%<pC9`rnKlcueHnNL@ghE-sD|(q_({ zW(<}t7UD8ea@J}(+@9WUS_~d;Rv>XLDVaBRZ>>Gv+G#PEgUp;Q#a~Lvg5KEa+Hu&Z zF}PbfxjF*2E-uFPzmEC8-N(h&fB*o50<QlA4B*3mLXH(M12YH+C~JCeJMr)s@Z@Er zG`&(*k%8ccdZ1jyX-B`k$HXWEF)~=VtDX6v%T|`UD}>*7V7&C(nl-qed?M;95<B6e z`n%3&0}1wLta<c)g5OJs7oPv~rWQj4_caRNx3wC%)phIE1X}c&GtHs<sw)H!fVf9C zBUyC}27WQ^{y2t@S4Z%FfBv5#frV6(ly5yVm`P^5y66vM3(<IN^&+`f?TbC|uO2H@ zoTlO9(c#ZZgu9yf9KZ#99YbNoNi&Rvpcg*l@xER9l7~%W8#H6bql9=~co8_Um)2M- zHso-Sc)bqdGZ*-d3DrJGXlsz}P@n+Px{)*{Fm{3?!ecjLzzWMkOBS`__deD)n@+8~ zDYt@c9{ZZ%@XZ#?%&=-^;qB{;^<mPEEBKgk35+t;=)-zJ!W%0DSGoKg#+#2%h4DTx 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�U{ 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 literal 0 HcmV?d00001 diff --git a/aniworld/v1/AniWorldEngSub.js b/aniworld/v1/AniWorldEngSub.js new file mode 100644 index 0000000..731affb --- /dev/null +++ b/aniworld/v1/AniWorldEngSub.js @@ -0,0 +1,611 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const searchApiUrl = `https://aniworld.to/ajax/seriesSearch?keyword=${encodedKeyword}`; + const responseText = await fetch(searchApiUrl); + + const data = await JSON.parse(responseText); + + const transformedResults = data.map((anime) => ({ + title: anime.name, + image: `https://aniworld.to${anime.cover}`, + href: `https://aniworld.to/anime/stream/${anime.link}`, + })); + + return JSON.stringify(transformedResults); + } catch (error) { + console.log("Fetch error:" + error); + return JSON.stringify([{ title: "Error", image: "", href: "" }]); + } +} + +async function extractDetails(url) { + try { + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + const descriptionRegex = + /<p\s+class="seri_des"\s+itemprop="accessibilitySummary"\s+data-description-type="review"\s+data-full-description="([^"]*)".*?>(.*?)<\/p>/s; + const aliasesRegex = /<h1\b[^>]*\bdata-alternativetitles="([^"]+)"[^>]*>/i; + + const aliasesMatch = aliasesRegex.exec(text); + let aliasesArray = []; + if (aliasesMatch) { + aliasesArray = aliasesMatch[1].split(",").map((a) => a.trim()); + } + + const descriptionMatch = descriptionRegex.exec(text) || []; + + const airdateMatch = "Unknown"; // TODO: Implement airdate extraction + + const transformedResults = [ + { + description: descriptionMatch[1] || "No description available", + aliases: aliasesArray[0] || "No aliases available", + airdate: airdateMatch, + }, + ]; + + return JSON.stringify(transformedResults); + } catch (error) { + console.log("Details error:" + error); + return JSON.stringify([ + { + description: "Error loading description", + aliases: "Duration: Unknown", + airdate: "Aired: Unknown", + }, + ]); + } +} + +async function extractEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const html = await fetch(fetchUrl); + + const finishedList = []; + const seasonLinks = getSeasonLinks(html); + + for (const seasonLink of seasonLinks) { + const seasonEpisodes = await fetchSeasonEpisodes( + `${baseUrl}${seasonLink}` + ); + finishedList.push(...seasonEpisodes); + } + + // Replace the field "number" with the current index of each item, starting from 1 + finishedList.forEach((item, index) => { + item.number = index + 1; + }); + + return JSON.stringify(finishedList); + } catch (error) { + console.log("Fetch error:" + error); + return JSON.stringify([{ number: "0", href: "" }]); + } +} + +async function extractStreamUrl(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + const finishedList = []; + const languageList = getAvailableLanguages(text); + const videoLinks = getVideoLinks(text); + + for (const videoLink of videoLinks) { + const language = languageList.find( + (l) => l.langKey === videoLink.langKey + ); + if (language) { + finishedList.push({ + provider: videoLink.provider, + href: `${baseUrl}${videoLink.href}`, + language: language.title, + }); + } + } + + // Select the hoster + const selectedHoster = selectHoster(finishedList); + const provider = selectedHoster.provider; + const providerLink = selectedHoster.href; + if (provider === "Error") { + console.log("No video found"); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + console.log("Selected provider: " + provider); + console.log("Selected link: " + providerLink); + + const videoPage = await fetch(providerLink); + console.log("Video Page: " + videoPage.length); + + const winLocRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const winLocMatch = winLocRegex.exec(videoPage); + let winLocUrl = null; + if (!winLocMatch) { + winLocUrl = providerLink; + } else { + winLocUrl = winLocMatch[1]; + } + + const hlsSourceResponse = await fetch(winLocUrl); + const hlsSourcePage = + typeof hlsSourceResponse === "object" + ? await hlsSourceResponse.text() + : await hlsSourceResponse; + console.log("Provider: " + provider); + console.log("URL: " + winLocUrl); + console.log("HLS Source Page: " + hlsSourcePage.length); + + switch (provider) { + case "VOE": + try { + const voeJson = voeExtractor(hlsSourcePage); + return voeJson?.source || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + console.log("VOE extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + case "SpeedFiles": + try { + const speedfilesUrl = await speedfilesExtractor(hlsSourcePage); + return speedfilesUrl || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + console.log("Speedfiles extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + case "Vidmoly": + try { + const vidmolyUrl = vidmolyExtractor(hlsSourcePage); + return vidmolyUrl || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + console.log("Vidmoly extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + default: + console.log("Unsupported provider:", provider); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + // END OF VOE EXTRACTOR + + // Extract the sources variable and decode the hls value from base64 + const sourcesRegex = /var\s+sources\s*=\s*({[^}]+})/; + const sourcesMatch = sourcesRegex.exec(hlsSourcePage); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + + return sourcesString; + } catch (error) { + console.log("ExtractStreamUrl error:" + error); + return JSON.stringify([{ provider: "Error1", link: "" }]); + } +} + +function selectHoster(finishedList) { + let firstVideo = null; + let provider = null; + + // Define the preferred providers and languages + const providerList = ["Vidmoly", "SpeedFiles", "VOE"]; + const languageList = ["mit Untertitel Englisch", "mit Untertitel Deutsch"]; + + + for (const providerName of providerList) { + for (const language of languageList) { + const video = finishedList.find( + (video) => video.provider === providerName && video.language === language + ); + if (video) { + provider = providerName; + firstVideo = video; + break; + } + } + if (firstVideo) break; + } + + // Default to the first video if no match is found + if (!firstVideo) { + firstVideo = finishedList[0]; + } + + if (firstVideo) { + return { + provider: provider, + href: firstVideo.href, + }; + } else { + console.log("No video found"); + return { + provider: "Error", + href: "https://error.org", + }; + } +} + +//Thanks to Ibro and Cufiy +async function vidmolyExtractor(html) { + console.log("Vidmoly extractor"); + console.log(html); + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + + + let match = html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + console.log("Vidmoly extractor: Match found"); + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + + const streamUrl = iframeMatch[1].startsWith("//") ? "https:" + iframeMatch[1] : iframeMatch[1]; + console.log("Vidmoly extractor: Stream URL: " + streamUrl); + + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + console.log(m3u8Match ? m3u8Match[1] : null); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + + return sourcesString; + } +} + + +// Thanks to Cufiy +function speedfilesExtractor(sourcePageHtml) { + // get var _0x5opu234 = "THIS_IS_AN_ENCODED_STRING" + const REGEX = /var\s+_0x5opu234\s*=\s*"([^"]+)"/; + const match = sourcePageHtml.match(REGEX); + if (match == null || match[1] == null) { + console.log("Could not extract from Speedfiles source"); + return null; + } + + const encodedString = match[1]; + console.log("Encoded String:" + encodedString); + + // Step 1: Base64 decode the initial string + let step1 = atob(encodedString); + console.log("Step 1:" + step1); + + // Step 2: Swap character cases and reverse + let step2 = step1 + .split("") + .map((c) => + /[a-zA-Z]/.test(c) + ? c === c.toLowerCase() + ? c.toUpperCase() + : c.toLowerCase() + : c + ) + .join(""); + console.log("Step 2:" + step2); + let step3 = step2.split("").reverse().join(""); + console.log("Step 3:" + step3); + + // Step 3: Base64 decode again and reverse + let step4 = atob(step3); + console.log("Step 4:" + step4); + let step5 = step4.split("").reverse().join(""); + console.log("Step 5:" + step5); + + // Step 4: Hex decode pairs + let step6 = ""; + for (let i = 0; i < step5.length; i += 2) { + step6 += String.fromCharCode(parseInt(step5.substr(i, 2), 16)); + } + console.log("Step 6:" + step6); + + // Step 5: Subtract 3 from character codes + let step7 = step6 + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - 3)) + .join(""); + console.log("Step 7:" + step7); + + // Step 6: Final case swap, reverse, and Base64 decode + let step8 = step7 + .split("") + .map((c) => + /[a-zA-Z]/.test(c) + ? c === c.toLowerCase() + ? c.toUpperCase() + : c.toLowerCase() + : c + ) + .join(""); + console.log("Step 8:" + step8); + let step9 = step8.split("").reverse().join(""); + console.log("Step 9:" + step9); + + // return atob(step9); + let decodedUrl = atob(step9); + console.log("Decoded URL:" + decodedUrl); + return decodedUrl; +} + +// Thanks to https://github.com/ShadeOfChaos + +/** + * Extracts a JSON object from the given source page by finding the + * encoded string marked with the regex /MKGMa="([\s\S]+?)"/ and + * decoding it using the voeDecoder function. + * @param {string} sourcePageHtml - The source page to be parsed. + * @returns {object|null} The extracted JSON object if successful, + * otherwise null. + */ +function voeExtractor(sourcePageHtml) { + const REGEX = /MKGMa="([\s\S]+?)"/; + + const match = sourcePageHtml.match(REGEX); + if (match == null || match[1] == null) { + console.log("Could not extract from Voe source"); + return null; + } + + const encodedString = match[1]; + const decodedJson = voeDecoder(encodedString); + + return decodedJson; +} + +/** + * Decodes the given MKGMa string, which is a custom encoded string used + * by VOE. This function applies the following steps to the input string to + * decode it: + * 1. Apply ROT13 to each alphabetical character in the string. + * 2. Remove all underscores from the string. + * 3. Decode the string using the Base64 algorithm. + * 4. Apply a character shift of 0x3 to each character in the decoded string. + * 5. Reverse the order of the characters in the shifted string. + * 6. Decode the reversed string using the Base64 algorithm again. + * 7. Parse the decoded string as JSON. + * @param {string} MKGMa_String - The input string to be decoded. + * @returns {object} The decoded JSON object. + */ +function voeDecoder(MKGMa_String) { + let ROT13String = ROT13(MKGMa_String); + let sanitizedString = voeSanitizer(ROT13String); + let UnderscoreRemoved = sanitizedString.split("_").join(""); + let base64DecodedString = atob(UnderscoreRemoved); + let charShiftedString = shiftCharacter(base64DecodedString, 0x3); + let reversedString = charShiftedString.split("").reverse().join(""); + let base64DecodedStringAgain = atob(reversedString); + let decodedJson; + try { + decodedJson = JSON.parse(base64DecodedStringAgain); + } catch (error) { + console.log("JSON parse error:", error); + decodedJson = {}; + } + return decodedJson; +} + +/** + * Encodes a given string using the ROT13 cipher, which shifts each letter + * 13 places forward in the alphabet. Only alphabetical characters are + * transformed; other characters remain unchanged. + * + * @param {string} string - The input string to be encoded. + * @returns {string} The encoded string with ROT13 applied. + */ +function ROT13(string) { + let ROT13String = ""; + + for (let i = 0; i < string.length; i++) { + let currentCharCode = string.charCodeAt(i); + + // Check for uppercase + if (currentCharCode >= 65 && currentCharCode <= 90) { + currentCharCode = ((currentCharCode - 65 + 13) % 26) + 65; + // Check for lowercase + } else if (currentCharCode >= 97 && currentCharCode <= 122) { + currentCharCode = ((currentCharCode - 97 + 13) % 26) + 97; + } + + ROT13String += String.fromCharCode(currentCharCode); + } + + return ROT13String; +} + +/** + * Sanitizes a given string by replacing all occurrences of certain "trash" strings + * with an underscore. The trash strings are '@$', '^^', '~@', '%?', '*~', '!!', '#&'. + * This is used to decode VOE encoded strings. + * @param {string} string The string to be sanitized. + * @returns {string} The sanitized string. + */ +function voeSanitizer(string) { + let sanitizationArray = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let tempString = string; + + for (let i = 0; i < sanitizationArray.length; i++) { + let currentTrash = sanitizationArray[i]; + let sanitizedString = new RegExp( + currentTrash.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), + "g" + ); + + tempString = tempString.replace(sanitizedString, "_"); + } + + return tempString; +} + +/** + * Shifts the characters in a string by a given number of places. + * @param {string} string - The string to shift. + * @param {number} shiftNum - The number of places to shift the string. + * @returns {string} The shifted string. + */ +function shiftCharacter(string, shiftNum) { + let tempArray = []; + + for (let i = 0; i < string.length; i++) { + tempArray.push(String.fromCharCode(string.charCodeAt(i) - shiftNum)); + } + + return tempArray.join(""); +} + +//////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////////// +//////////////////////////// for ExtractEpisodes //////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the list of seasons +// Site specific structure +function getSeasonLinks(html) { + const seasonLinks = []; + const seasonRegex = + /<div class="hosterSiteDirectNav" id="stream">.*?<ul>(.*?)<\/ul>/s; + const seasonMatch = seasonRegex.exec(html); + if (seasonMatch) { + const seasonList = seasonMatch[1]; + const seasonLinkRegex = /<a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a>/g; + let seasonLinkMatch; + const filmeLinks = []; + while ((seasonLinkMatch = seasonLinkRegex.exec(seasonList)) !== null) { + const [_, seasonLink] = seasonLinkMatch; + if (seasonLink.endsWith("/filme")) { + filmeLinks.push(seasonLink); + } else { + seasonLinks.push(seasonLink); + } + } + seasonLinks.push(...filmeLinks); + } + return seasonLinks; +} + +// Helper function to fetch episodes for a season +// Site specific structure +async function fetchSeasonEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + // Updated regex to allow empty <strong> content + const regex = + /<td class="seasonEpisodeTitle">\s*<a[^>]*href="([^"]+)"[^>]*>.*?<strong>([^<]*)<\/strong>.*?<span>([^<]+)<\/span>.*?<\/a>/g; + + const matches = []; + let match; + let holderNumber = 0; + + while ((match = regex.exec(text)) !== null) { + const [_, link] = match; + matches.push({ number: holderNumber, href: `${baseUrl}${link}` }); + } + + return matches; + } catch (error) { + console.log("FetchSeasonEpisodes helper function error:" + error); + return [{ number: "0", href: "https://error.org" }]; + } +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////// +//////////////////////////// for ExtractStreamUrl //////////////////////// +///////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the video links +// Site specific structure +function getVideoLinks(html) { + const videoLinks = []; + const videoRegex = + /<li\s+class="[^"]*"\s+data-lang-key="([^"]+)"[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*>.*?<h4>([^<]+)<\/h4>.*?<\/a>.*?<\/li>/gs; + let match; + + while ((match = videoRegex.exec(html)) !== null) { + const [_, langKey, href, provider] = match; + videoLinks.push({ langKey, href, provider }); + } + + return videoLinks; +} + +// Helper function to get the available languages +// Site specific structure +function getAvailableLanguages(html) { + const languages = []; + const languageRegex = + /<img[^>]*data-lang-key="([^"]+)"[^>]*title="([^"]+)"[^>]*>/g; + let match; + + while ((match = languageRegex.exec(html)) !== null) { + const [_, langKey, title] = match; + languages.push({ langKey, title }); + } + + return languages; +} + +// Helper function to fetch the base64 encoded string +function base64Decode(str) { + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let output = ""; + + str = String(str).replace(/=+$/, ""); + + if (str.length % 4 === 1) { + throw new Error( + "'atob' failed: The string to be decoded is not correctly encoded." + ); + } + + for ( + let bc = 0, bs, buffer, idx = 0; + (buffer = str.charAt(idx++)); + ~buffer && ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4) + ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) + : 0 + ) { + buffer = chars.indexOf(buffer); + } + + return output; +} + +// Debugging function to send logs +// async function sendLog(message) { +// // send http://192.168.2.130/sora-module/log.php?action=add&message=message +// console.log(message); + +// await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) +// .catch(error => { +// console.error('Error sending log:', error); +// }); +// } diff --git a/aniworld/v1/AniWorldGerDub.js b/aniworld/v1/AniWorldGerDub.js new file mode 100644 index 0000000..5474a53 --- /dev/null +++ b/aniworld/v1/AniWorldGerDub.js @@ -0,0 +1,596 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const searchApiUrl = `https://aniworld.to/ajax/seriesSearch?keyword=${encodedKeyword}`; + const responseText = await fetch(searchApiUrl); + + const data = await JSON.parse(responseText); + + const transformedResults = data.map((anime) => ({ + title: anime.name, + image: `https://aniworld.to${anime.cover}`, + href: `https://aniworld.to/anime/stream/${anime.link}`, + })); + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog("Fetch error:" + error); + return JSON.stringify([{ title: "Error", image: "", href: "" }]); + } +} + +async function extractDetails(url) { + try { + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + const descriptionRegex = + /<p\s+class="seri_des"\s+itemprop="accessibilitySummary"\s+data-description-type="review"\s+data-full-description="([^"]*)".*?>(.*?)<\/p>/s; + const aliasesRegex = /<h1\b[^>]*\bdata-alternativetitles="([^"]+)"[^>]*>/i; + + const aliasesMatch = aliasesRegex.exec(text); + let aliasesArray = []; + if (aliasesMatch) { + aliasesArray = aliasesMatch[1].split(",").map((a) => a.trim()); + } + + const descriptionMatch = descriptionRegex.exec(text) || []; + + const airdateMatch = "Unknown"; // TODO: Implement airdate extraction + + const transformedResults = [ + { + description: descriptionMatch[1] || "No description available", + aliases: aliasesArray[0] || "No aliases available", + airdate: airdateMatch, + }, + ]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog("Details error:" + error); + return JSON.stringify([ + { + description: "Error loading description", + aliases: "Duration: Unknown", + airdate: "Aired: Unknown", + }, + ]); + } +} + +async function extractEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const html = await fetch(fetchUrl); + + const finishedList = []; + const seasonLinks = getSeasonLinks(html); + + for (const seasonLink of seasonLinks) { + const seasonEpisodes = await fetchSeasonEpisodes( + `${baseUrl}${seasonLink}` + ); + finishedList.push(...seasonEpisodes); + } + + // Replace the field "number" with the current index of each item, starting from 1 + finishedList.forEach((item, index) => { + item.number = index + 1; + }); + + return JSON.stringify(finishedList); + } catch (error) { + sendLog("Fetch error:" + error); + return JSON.stringify([{ number: "0", href: "" }]); + } +} + +async function extractStreamUrl(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + const finishedList = []; + const languageList = getAvailableLanguages(text); + const videoLinks = getVideoLinks(text); + + for (const videoLink of videoLinks) { + const language = languageList.find( + (l) => l.langKey === videoLink.langKey + ); + if (language) { + finishedList.push({ + provider: videoLink.provider, + href: `${baseUrl}${videoLink.href}`, + language: language.title, + }); + } + } + + // Select the hoster + const selectedHoster = selectHoster(finishedList); + const provider = selectedHoster.provider; + const providerLink = selectedHoster.href; + if (provider === "Error") { + sendLog("No video found"); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + sendLog("Selected provider: " + provider); + sendLog("Selected link: " + providerLink); + + const videoPage = await fetch(providerLink); + sendLog("Video Page: " + videoPage.length); + + const winLocRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const winLocMatch = winLocRegex.exec(videoPage); + let winLocUrl = null; + if (!winLocMatch) { + winLocUrl = providerLink; + } else { + winLocUrl = winLocMatch[1]; + } + + const hlsSourceResponse = await fetch(winLocUrl); + const hlsSourcePage = + typeof hlsSourceResponse === "object" + ? await hlsSourceResponse.text() + : await hlsSourceResponse; + sendLog("Provider: " + provider); + sendLog("URL: " + winLocUrl); + sendLog("HLS Source Page: " + hlsSourcePage.length); + + switch (provider) { + case "VOE": + try { + const voeJson = voeExtractor(hlsSourcePage); + return voeJson?.source || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + sendLog("VOE extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + case "SpeedFiles": + try { + const speedfilesUrl = await speedfilesExtractor(hlsSourcePage); + return speedfilesUrl || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + sendLog("Speedfiles extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + case "Vidmoly": + try { + const vidmolyUrl = vidmolyExtractor(hlsSourcePage); + return vidmolyUrl || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + sendLog("Vidmoly extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + default: + sendLog("Unsupported provider:", provider); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + // END OF VOE EXTRACTOR + + // Extract the sources variable and decode the hls value from base64 + const sourcesRegex = /var\s+sources\s*=\s*({[^}]+})/; + const sourcesMatch = sourcesRegex.exec(hlsSourcePage); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + + return sourcesString; + } catch (error) { + sendLog("ExtractStreamUrl error:" + error); + return JSON.stringify([{ provider: "Error1", link: "" }]); + } +} + +function selectHoster(finishedList) { + let firstVideo = null; + let provider = null; + + // Define the preferred providers and languages + const providerList = ["Vidmoly", "SpeedFiles", "VOE"]; + const languageList = ["Deutsch", "mit Untertitel Deutsch"]; + + + for (const providerName of providerList) { + for (const language of languageList) { + const video = finishedList.find( + (video) => video.provider === providerName && video.language === language + ); + if (video) { + provider = providerName; + firstVideo = video; + break; + } + } + if (firstVideo) break; + } + + // Default to the first video if no match is found + if (!firstVideo) { + firstVideo = finishedList[0]; + } + + if (firstVideo) { + return { + provider: provider, + href: firstVideo.href, + }; + } else { + sendLog("No video found"); + return { + provider: "Error", + href: "https://error.org", + }; + } +} + +//Thanks to Ibro and Cufiy +async function vidmolyExtractor(html) { + sendLog("Vidmoly extractor"); + sendLog(html); + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + + + let match = html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + sendLog("Vidmoly extractor: Match found"); + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + + if (!iframeMatch) { + sendLog("Vidmoly extractor: No iframe match found"); + return null; + } + + const streamUrl = iframeMatch[1].startsWith("//") ? "https:" + iframeMatch[1] : iframeMatch[1]; + sendLog("Vidmoly extractor: Stream URL: " + streamUrl); + + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + sendLog(m3u8Match ? m3u8Match[1] : null); + return m3u8Match ? m3u8Match[1] : null; + } else { + sendLog("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + + return sourcesString; + } +} + + +// Thanks to Cufiy +function speedfilesExtractor(sourcePageHtml) { + // get var _0x5opu234 = "THIS_IS_AN_ENCODED_STRING" + const REGEX = /var\s+_0x5opu234\s*=\s*"([^"]+)"/; + const match = sourcePageHtml.match(REGEX); + if (match == null || match[1] == null) { + sendLog("Could not extract from Speedfiles source"); + return null; + } + + const encodedString = match[1]; + sendLog("Encoded String:" + encodedString); + + // Step 1: Base64 decode the initial string + let step1 = atob(encodedString); + sendLog("Step 1:" + step1); + + // Step 2: Swap character cases and reverse + let step2 = step1 + .split("") + .map((c) => + /[a-zA-Z]/.test(c) + ? c === c.toLowerCase() + ? c.toUpperCase() + : c.toLowerCase() + : c + ) + .join(""); + sendLog("Step 2:" + step2); + let step3 = step2.split("").reverse().join(""); + sendLog("Step 3:" + step3); + + // Step 3: Base64 decode again and reverse + let step4 = atob(step3); + sendLog("Step 4:" + step4); + let step5 = step4.split("").reverse().join(""); + sendLog("Step 5:" + step5); + + // Step 4: Hex decode pairs + let step6 = ""; + for (let i = 0; i < step5.length; i += 2) { + step6 += String.fromCharCode(parseInt(step5.substr(i, 2), 16)); + } + sendLog("Step 6:" + step6); + + // Step 5: Subtract 3 from character codes + let step7 = step6 + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - 3)) + .join(""); + sendLog("Step 7:" + step7); + + // Step 6: Final case swap, reverse, and Base64 decode + let step8 = step7 + .split("") + .map((c) => + /[a-zA-Z]/.test(c) + ? c === c.toLowerCase() + ? c.toUpperCase() + : c.toLowerCase() + : c + ) + .join(""); + sendLog("Step 8:" + step8); + let step9 = step8.split("").reverse().join(""); + sendLog("Step 9:" + step9); + + // return atob(step9); + let decodedUrl = atob(step9); + sendLog("Decoded URL:" + decodedUrl); + return decodedUrl; +} + + + +/** + * @name voeExtractor + * @author Cufiy + */ + +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + sendLog("No application/json script tag found"); + return null; + } + + + const obfuscatedJson = jsonScriptMatch[1].trim(); + + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + sendLog("Decoded JSON:", result); + + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + sendLog("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + sendLog("No stream URL found in the decoded JSON"); + } + } + return result; +} + +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} + +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} + +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} + +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////////// +//////////////////////////// for ExtractEpisodes //////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the list of seasons +// Site specific structure +function getSeasonLinks(html) { + const seasonLinks = []; + const seasonRegex = + /<div class="hosterSiteDirectNav" id="stream">.*?<ul>(.*?)<\/ul>/s; + const seasonMatch = seasonRegex.exec(html); + if (seasonMatch) { + const seasonList = seasonMatch[1]; + const seasonLinkRegex = /<a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a>/g; + let seasonLinkMatch; + const filmeLinks = []; + while ((seasonLinkMatch = seasonLinkRegex.exec(seasonList)) !== null) { + const [_, seasonLink] = seasonLinkMatch; + if (seasonLink.endsWith("/filme")) { + filmeLinks.push(seasonLink); + } else { + seasonLinks.push(seasonLink); + } + } + seasonLinks.push(...filmeLinks); + } + return seasonLinks; +} + +// Helper function to fetch episodes for a season +// Site specific structure +async function fetchSeasonEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + // Updated regex to allow empty <strong> content + const regex = + /<td class="seasonEpisodeTitle">\s*<a[^>]*href="([^"]+)"[^>]*>.*?<strong>([^<]*)<\/strong>.*?<span>([^<]+)<\/span>.*?<\/a>/g; + + const matches = []; + let match; + let holderNumber = 0; + + while ((match = regex.exec(text)) !== null) { + const [_, link] = match; + matches.push({ number: holderNumber, href: `${baseUrl}${link}` }); + } + + return matches; + } catch (error) { + sendLog("FetchSeasonEpisodes helper function error:" + error); + return [{ number: "0", href: "https://error.org" }]; + } +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////// +//////////////////////////// for ExtractStreamUrl //////////////////////// +///////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the video links +// Site specific structure +function getVideoLinks(html) { + const videoLinks = []; + const videoRegex = + /<li\s+class="[^"]*"\s+data-lang-key="([^"]+)"[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*>.*?<h4>([^<]+)<\/h4>.*?<\/a>.*?<\/li>/gs; + let match; + + while ((match = videoRegex.exec(html)) !== null) { + const [_, langKey, href, provider] = match; + videoLinks.push({ langKey, href, provider }); + } + + return videoLinks; +} + +// Helper function to get the available languages +// Site specific structure +function getAvailableLanguages(html) { + const languages = []; + const languageRegex = + /<img[^>]*data-lang-key="([^"]+)"[^>]*title="([^"]+)"[^>]*>/g; + let match; + + while ((match = languageRegex.exec(html)) !== null) { + const [_, langKey, title] = match; + languages.push({ langKey, title }); + } + + return languages; +} + +// Helper function to fetch the base64 encoded string +function base64Decode(str) { + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let output = ""; + + str = String(str).replace(/=+$/, ""); + + if (str.length % 4 === 1) { + throw new Error( + "'atob' failed: The string to be decoded is not correctly encoded." + ); + } + + for ( + let bc = 0, bs, buffer, idx = 0; + (buffer = str.charAt(idx++)); + ~buffer && ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4) + ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) + : 0 + ) { + buffer = chars.indexOf(buffer); + } + + return output; +} + +// Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} diff --git a/aniworld/v1/AniWorldGerSub.js b/aniworld/v1/AniWorldGerSub.js new file mode 100644 index 0000000..3152028 --- /dev/null +++ b/aniworld/v1/AniWorldGerSub.js @@ -0,0 +1,611 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const searchApiUrl = `https://aniworld.to/ajax/seriesSearch?keyword=${encodedKeyword}`; + const responseText = await fetch(searchApiUrl); + + const data = await JSON.parse(responseText); + + const transformedResults = data.map((anime) => ({ + title: anime.name, + image: `https://aniworld.to${anime.cover}`, + href: `https://aniworld.to/anime/stream/${anime.link}`, + })); + + return JSON.stringify(transformedResults); + } catch (error) { + console.log("Fetch error:" + error); + return JSON.stringify([{ title: "Error", image: "", href: "" }]); + } +} + +async function extractDetails(url) { + try { + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + const descriptionRegex = + /<p\s+class="seri_des"\s+itemprop="accessibilitySummary"\s+data-description-type="review"\s+data-full-description="([^"]*)".*?>(.*?)<\/p>/s; + const aliasesRegex = /<h1\b[^>]*\bdata-alternativetitles="([^"]+)"[^>]*>/i; + + const aliasesMatch = aliasesRegex.exec(text); + let aliasesArray = []; + if (aliasesMatch) { + aliasesArray = aliasesMatch[1].split(",").map((a) => a.trim()); + } + + const descriptionMatch = descriptionRegex.exec(text) || []; + + const airdateMatch = "Unknown"; // TODO: Implement airdate extraction + + const transformedResults = [ + { + description: descriptionMatch[1] || "No description available", + aliases: aliasesArray[0] || "No aliases available", + airdate: airdateMatch, + }, + ]; + + return JSON.stringify(transformedResults); + } catch (error) { + console.log("Details error:" + error); + return JSON.stringify([ + { + description: "Error loading description", + aliases: "Duration: Unknown", + airdate: "Aired: Unknown", + }, + ]); + } +} + +async function extractEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const html = await fetch(fetchUrl); + + const finishedList = []; + const seasonLinks = getSeasonLinks(html); + + for (const seasonLink of seasonLinks) { + const seasonEpisodes = await fetchSeasonEpisodes( + `${baseUrl}${seasonLink}` + ); + finishedList.push(...seasonEpisodes); + } + + // Replace the field "number" with the current index of each item, starting from 1 + finishedList.forEach((item, index) => { + item.number = index + 1; + }); + + return JSON.stringify(finishedList); + } catch (error) { + console.log("Fetch error:" + error); + return JSON.stringify([{ number: "0", href: "" }]); + } +} + +async function extractStreamUrl(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + const finishedList = []; + const languageList = getAvailableLanguages(text); + const videoLinks = getVideoLinks(text); + + for (const videoLink of videoLinks) { + const language = languageList.find( + (l) => l.langKey === videoLink.langKey + ); + if (language) { + finishedList.push({ + provider: videoLink.provider, + href: `${baseUrl}${videoLink.href}`, + language: language.title, + }); + } + } + + // Select the hoster + const selectedHoster = selectHoster(finishedList); + const provider = selectedHoster.provider; + const providerLink = selectedHoster.href; + if (provider === "Error") { + console.log("No video found"); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + console.log("Selected provider: " + provider); + console.log("Selected link: " + providerLink); + + const videoPage = await fetch(providerLink); + console.log("Video Page: " + videoPage.length); + + const winLocRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const winLocMatch = winLocRegex.exec(videoPage); + let winLocUrl = null; + if (!winLocMatch) { + winLocUrl = providerLink; + } else { + winLocUrl = winLocMatch[1]; + } + + const hlsSourceResponse = await fetch(winLocUrl); + const hlsSourcePage = + typeof hlsSourceResponse === "object" + ? await hlsSourceResponse.text() + : await hlsSourceResponse; + console.log("Provider: " + provider); + console.log("URL: " + winLocUrl); + console.log("HLS Source Page: " + hlsSourcePage.length); + + switch (provider) { + case "VOE": + try { + const voeJson = voeExtractor(hlsSourcePage); + return voeJson?.source || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + console.log("VOE extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + case "SpeedFiles": + try { + const speedfilesUrl = await speedfilesExtractor(hlsSourcePage); + return speedfilesUrl || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + console.log("Speedfiles extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + case "Vidmoly": + try { + const vidmolyUrl = vidmolyExtractor(hlsSourcePage); + return vidmolyUrl || JSON.stringify([{ provider: "Error", link: "" }]); + } catch (error) { + console.log("Vidmoly extractor error: " + error); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + + default: + console.log("Unsupported provider:", provider); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + // END OF VOE EXTRACTOR + + // Extract the sources variable and decode the hls value from base64 + const sourcesRegex = /var\s+sources\s*=\s*({[^}]+})/; + const sourcesMatch = sourcesRegex.exec(hlsSourcePage); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + + return sourcesString; + } catch (error) { + console.log("ExtractStreamUrl error:" + error); + return JSON.stringify([{ provider: "Error1", link: "" }]); + } +} + +function selectHoster(finishedList) { + let firstVideo = null; + let provider = null; + + // Define the preferred providers and languages + const providerList = ["Vidmoly", "SpeedFiles", "VOE"]; + const languageList = ["mit Untertitel Deutsch", "Deutsch"]; + + + for (const providerName of providerList) { + for (const language of languageList) { + const video = finishedList.find( + (video) => video.provider === providerName && video.language === language + ); + if (video) { + provider = providerName; + firstVideo = video; + break; + } + } + if (firstVideo) break; + } + + // Default to the first video if no match is found + if (!firstVideo) { + firstVideo = finishedList[0]; + } + + if (firstVideo) { + return { + provider: provider, + href: firstVideo.href, + }; + } else { + console.log("No video found"); + return { + provider: "Error", + href: "https://error.org", + }; + } +} + +//Thanks to Ibro and Cufiy +async function vidmolyExtractor(html) { + console.log("Vidmoly extractor"); + console.log(html); + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + + + let match = html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + console.log("Vidmoly extractor: Match found"); + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + + const streamUrl = iframeMatch[1].startsWith("//") ? "https:" + iframeMatch[1] : iframeMatch[1]; + console.log("Vidmoly extractor: Stream URL: " + streamUrl); + + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + console.log(m3u8Match ? m3u8Match[1] : null); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + + return sourcesString; + } +} + + +// Thanks to Cufiy +function speedfilesExtractor(sourcePageHtml) { + // get var _0x5opu234 = "THIS_IS_AN_ENCODED_STRING" + const REGEX = /var\s+_0x5opu234\s*=\s*"([^"]+)"/; + const match = sourcePageHtml.match(REGEX); + if (match == null || match[1] == null) { + console.log("Could not extract from Speedfiles source"); + return null; + } + + const encodedString = match[1]; + console.log("Encoded String:" + encodedString); + + // Step 1: Base64 decode the initial string + let step1 = atob(encodedString); + console.log("Step 1:" + step1); + + // Step 2: Swap character cases and reverse + let step2 = step1 + .split("") + .map((c) => + /[a-zA-Z]/.test(c) + ? c === c.toLowerCase() + ? c.toUpperCase() + : c.toLowerCase() + : c + ) + .join(""); + console.log("Step 2:" + step2); + let step3 = step2.split("").reverse().join(""); + console.log("Step 3:" + step3); + + // Step 3: Base64 decode again and reverse + let step4 = atob(step3); + console.log("Step 4:" + step4); + let step5 = step4.split("").reverse().join(""); + console.log("Step 5:" + step5); + + // Step 4: Hex decode pairs + let step6 = ""; + for (let i = 0; i < step5.length; i += 2) { + step6 += String.fromCharCode(parseInt(step5.substr(i, 2), 16)); + } + console.log("Step 6:" + step6); + + // Step 5: Subtract 3 from character codes + let step7 = step6 + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - 3)) + .join(""); + console.log("Step 7:" + step7); + + // Step 6: Final case swap, reverse, and Base64 decode + let step8 = step7 + .split("") + .map((c) => + /[a-zA-Z]/.test(c) + ? c === c.toLowerCase() + ? c.toUpperCase() + : c.toLowerCase() + : c + ) + .join(""); + console.log("Step 8:" + step8); + let step9 = step8.split("").reverse().join(""); + console.log("Step 9:" + step9); + + // return atob(step9); + let decodedUrl = atob(step9); + console.log("Decoded URL:" + decodedUrl); + return decodedUrl; +} + +// Thanks to https://github.com/ShadeOfChaos + +/** + * Extracts a JSON object from the given source page by finding the + * encoded string marked with the regex /MKGMa="([\s\S]+?)"/ and + * decoding it using the voeDecoder function. + * @param {string} sourcePageHtml - The source page to be parsed. + * @returns {object|null} The extracted JSON object if successful, + * otherwise null. + */ +function voeExtractor(sourcePageHtml) { + const REGEX = /MKGMa="([\s\S]+?)"/; + + const match = sourcePageHtml.match(REGEX); + if (match == null || match[1] == null) { + console.log("Could not extract from Voe source"); + return null; + } + + const encodedString = match[1]; + const decodedJson = voeDecoder(encodedString); + + return decodedJson; +} + +/** + * Decodes the given MKGMa string, which is a custom encoded string used + * by VOE. This function applies the following steps to the input string to + * decode it: + * 1. Apply ROT13 to each alphabetical character in the string. + * 2. Remove all underscores from the string. + * 3. Decode the string using the Base64 algorithm. + * 4. Apply a character shift of 0x3 to each character in the decoded string. + * 5. Reverse the order of the characters in the shifted string. + * 6. Decode the reversed string using the Base64 algorithm again. + * 7. Parse the decoded string as JSON. + * @param {string} MKGMa_String - The input string to be decoded. + * @returns {object} The decoded JSON object. + */ +function voeDecoder(MKGMa_String) { + let ROT13String = ROT13(MKGMa_String); + let sanitizedString = voeSanitizer(ROT13String); + let UnderscoreRemoved = sanitizedString.split("_").join(""); + let base64DecodedString = atob(UnderscoreRemoved); + let charShiftedString = shiftCharacter(base64DecodedString, 0x3); + let reversedString = charShiftedString.split("").reverse().join(""); + let base64DecodedStringAgain = atob(reversedString); + let decodedJson; + try { + decodedJson = JSON.parse(base64DecodedStringAgain); + } catch (error) { + console.log("JSON parse error:", error); + decodedJson = {}; + } + return decodedJson; +} + +/** + * Encodes a given string using the ROT13 cipher, which shifts each letter + * 13 places forward in the alphabet. Only alphabetical characters are + * transformed; other characters remain unchanged. + * + * @param {string} string - The input string to be encoded. + * @returns {string} The encoded string with ROT13 applied. + */ +function ROT13(string) { + let ROT13String = ""; + + for (let i = 0; i < string.length; i++) { + let currentCharCode = string.charCodeAt(i); + + // Check for uppercase + if (currentCharCode >= 65 && currentCharCode <= 90) { + currentCharCode = ((currentCharCode - 65 + 13) % 26) + 65; + // Check for lowercase + } else if (currentCharCode >= 97 && currentCharCode <= 122) { + currentCharCode = ((currentCharCode - 97 + 13) % 26) + 97; + } + + ROT13String += String.fromCharCode(currentCharCode); + } + + return ROT13String; +} + +/** + * Sanitizes a given string by replacing all occurrences of certain "trash" strings + * with an underscore. The trash strings are '@$', '^^', '~@', '%?', '*~', '!!', '#&'. + * This is used to decode VOE encoded strings. + * @param {string} string The string to be sanitized. + * @returns {string} The sanitized string. + */ +function voeSanitizer(string) { + let sanitizationArray = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let tempString = string; + + for (let i = 0; i < sanitizationArray.length; i++) { + let currentTrash = sanitizationArray[i]; + let sanitizedString = new RegExp( + currentTrash.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), + "g" + ); + + tempString = tempString.replace(sanitizedString, "_"); + } + + return tempString; +} + +/** + * Shifts the characters in a string by a given number of places. + * @param {string} string - The string to shift. + * @param {number} shiftNum - The number of places to shift the string. + * @returns {string} The shifted string. + */ +function shiftCharacter(string, shiftNum) { + let tempArray = []; + + for (let i = 0; i < string.length; i++) { + tempArray.push(String.fromCharCode(string.charCodeAt(i) - shiftNum)); + } + + return tempArray.join(""); +} + +//////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////////// +//////////////////////////// for ExtractEpisodes //////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the list of seasons +// Site specific structure +function getSeasonLinks(html) { + const seasonLinks = []; + const seasonRegex = + /<div class="hosterSiteDirectNav" id="stream">.*?<ul>(.*?)<\/ul>/s; + const seasonMatch = seasonRegex.exec(html); + if (seasonMatch) { + const seasonList = seasonMatch[1]; + const seasonLinkRegex = /<a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a>/g; + let seasonLinkMatch; + const filmeLinks = []; + while ((seasonLinkMatch = seasonLinkRegex.exec(seasonList)) !== null) { + const [_, seasonLink] = seasonLinkMatch; + if (seasonLink.endsWith("/filme")) { + filmeLinks.push(seasonLink); + } else { + seasonLinks.push(seasonLink); + } + } + seasonLinks.push(...filmeLinks); + } + return seasonLinks; +} + +// Helper function to fetch episodes for a season +// Site specific structure +async function fetchSeasonEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + // Updated regex to allow empty <strong> content + const regex = + /<td class="seasonEpisodeTitle">\s*<a[^>]*href="([^"]+)"[^>]*>.*?<strong>([^<]*)<\/strong>.*?<span>([^<]+)<\/span>.*?<\/a>/g; + + const matches = []; + let match; + let holderNumber = 0; + + while ((match = regex.exec(text)) !== null) { + const [_, link] = match; + matches.push({ number: holderNumber, href: `${baseUrl}${link}` }); + } + + return matches; + } catch (error) { + console.log("FetchSeasonEpisodes helper function error:" + error); + return [{ number: "0", href: "https://error.org" }]; + } +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////// +//////////////////////////// for ExtractStreamUrl //////////////////////// +///////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the video links +// Site specific structure +function getVideoLinks(html) { + const videoLinks = []; + const videoRegex = + /<li\s+class="[^"]*"\s+data-lang-key="([^"]+)"[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*>.*?<h4>([^<]+)<\/h4>.*?<\/a>.*?<\/li>/gs; + let match; + + while ((match = videoRegex.exec(html)) !== null) { + const [_, langKey, href, provider] = match; + videoLinks.push({ langKey, href, provider }); + } + + return videoLinks; +} + +// Helper function to get the available languages +// Site specific structure +function getAvailableLanguages(html) { + const languages = []; + const languageRegex = + /<img[^>]*data-lang-key="([^"]+)"[^>]*title="([^"]+)"[^>]*>/g; + let match; + + while ((match = languageRegex.exec(html)) !== null) { + const [_, langKey, title] = match; + languages.push({ langKey, title }); + } + + return languages; +} + +// Helper function to fetch the base64 encoded string +function base64Decode(str) { + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let output = ""; + + str = String(str).replace(/=+$/, ""); + + if (str.length % 4 === 1) { + throw new Error( + "'atob' failed: The string to be decoded is not correctly encoded." + ); + } + + for ( + let bc = 0, bs, buffer, idx = 0; + (buffer = str.charAt(idx++)); + ~buffer && ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4) + ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) + : 0 + ) { + buffer = chars.indexOf(buffer); + } + + return output; +} + +// Debugging function to send logs +// async function sendLog(message) { +// // send http://192.168.2.130/sora-module/log.php?action=add&message=message +// console.log(message); + +// await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) +// .catch(error => { +// console.error('Error sending log:', error); +// }); +// } diff --git a/aniworld/v2/AniWorldEngSub_v2.js b/aniworld/v2/AniWorldEngSub_v2.js new file mode 100644 index 0000000..598f075 --- /dev/null +++ b/aniworld/v2/AniWorldEngSub_v2.js @@ -0,0 +1,993 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const searchApiUrl = `https://aniworld.to/ajax/seriesSearch?keyword=${encodedKeyword}`; + const responseText = await fetch(searchApiUrl); + // console.log("Search API Response: " + await responseText.text()); + const data = await JSON.parse(responseText); + console.log("Search API Data: ", data); + + const transformedResults = data.map((anime) => ({ + title: anime.name, + image: `https://aniworld.to${anime.cover}`, + href: `https://aniworld.to/anime/stream/${anime.link}`, + })); + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog("Fetch error:" + error); + return JSON.stringify([{ title: "Error", image: "", href: "" }]); + } +} + +async function extractDetails(url) { + try { + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const descriptionRegex = + /<p\s+class="seri_des"\s+itemprop="accessibilitySummary"\s+data-description-type="review"\s+data-full-description="([^"]*)".*?>(.*?)<\/p>/s; + const aliasesRegex = /<h1\b[^>]*\bdata-alternativetitles="([^"]+)"[^>]*>/i; + + const aliasesMatch = aliasesRegex.exec(text); + let aliasesArray = []; + if (aliasesMatch) { + aliasesArray = aliasesMatch[1].split(",").map((a) => a.trim()); + } + + const descriptionMatch = descriptionRegex.exec(text) || []; + + const airdateMatch = "Unknown"; // TODO: Implement airdate extraction + + const transformedResults = [ + { + description: descriptionMatch[1] || "No description available", + aliases: aliasesArray[0] || "No aliases available", + airdate: airdateMatch, + }, + ]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog("Details error:" + error); + return JSON.stringify([ + { + description: "Error loading description", + aliases: "Duration: Unknown", + airdate: "Aired: Unknown", + }, + ]); + } +} + +async function extractEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const html = response.text ? await response.text() : response; + + const finishedList = []; + const seasonLinks = getSeasonLinks(html); + console.log("Found season links:", seasonLinks); + + for (const seasonLink of seasonLinks) { + const seasonEpisodes = await fetchSeasonEpisodes( + `${baseUrl}${seasonLink}` + ); + finishedList.push(...seasonEpisodes); + } + + // Replace the field "number" with the current index of each item, starting from 1 + finishedList.forEach((item, index) => { + item.number = index + 1; + }); + + return JSON.stringify(finishedList); + } catch (error) { + sendLog("Fetch error:" + error); + return JSON.stringify([{ number: "0", href: "" }]); + } +} + +async function extractStreamUrl(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const finishedList = []; + const languageList = getAvailableLanguages(text); + const videoLinks = getVideoLinks(text); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + + for (const videoLink of videoLinks) { + const language = languageList.find( + (l) => l.langKey === videoLink.langKey + ); + if (language) { + finishedList.push({ + provider: videoLink.provider, + href: `${baseUrl}${videoLink.href}`, + language: language.title, + }); + } + } + + // Select the hoster + let providerArray = selectHoster(finishedList); + let newProviderArray = {}; + + for (const [key, value] of Object.entries(providerArray)) { + const providerLink = key; + const providerName = value; + + // fetch the provider link and extract the stream URL + const streamUrl = await soraFetch(providerLink); + const winLocRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const winLocMatch = winLocRegex.exec(streamUrl); + let winLocUrl = null; + if (!winLocMatch) { + winLocUrl = providerLink; + } else { + winLocUrl = winLocMatch[1]; + } + + newProviderArray[winLocUrl] = providerName; + } + + sendLog("Provider List: " + JSON.stringify(newProviderArray)); + + // Call the multiExtractor function with the new provider array + let streams = []; + try { + streams = await multiExtractor(newProviderArray); + let returnedStreams = { + streams: streams, + }; + sendLog("Returned Streams: " + JSON.stringify(returnedStreams)); + + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Error in multiExtractor: " + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + + + } catch (error) { + sendLog("ExtractStreamUrl error:" + error); + return JSON.stringify([{ provider: "Error1", link: "" }]); + } +} + +function selectHoster(finishedList) { + let provider = {}; + // providers = { + // "https://vidmoly.to/embed-preghvoypr2m.html": "vidmoly", + // "https://speedfiles.net/40d98cdccf9c": "speedfiles", + // "https://speedfiles.net/82346fs": "speedfiles", + // }; + + // Define the preferred providers and languages + const providerList = ["VOE", "Filemoon", "SpeedFiles", "Vidmoly", "DoodStream", "Vidoza", "mp4upload"]; + const languageList = ["mit Untertitel Englisch", "mit Untertitel Deutsch", "Deutsch"]; + + + + for (const language of languageList) { + for (const providerName of providerList) { + const video = finishedList.find( + (video) => video.provider === providerName && video.language === language + ); + if (video) { + provider[video.href] = providerName.toLowerCase(); + } + } + // if the array is not empty, break the loop + if (Object.keys(provider).length > 0) { + break; + } + } + + sendLog("Provider List: " + JSON.stringify(provider)); + return provider; +} + +//////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////////// +//////////////////////////// for ExtractEpisodes //////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the list of seasons +// Site specific structure +function getSeasonLinks(html) { + const seasonLinks = []; + const seasonRegex = + /<div class="hosterSiteDirectNav" id="stream">.*?<ul>(.*?)<\/ul>/s; + const seasonMatch = seasonRegex.exec(html); + if (seasonMatch) { + const seasonList = seasonMatch[1]; + const seasonLinkRegex = /<a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a>/g; + let seasonLinkMatch; + const filmeLinks = []; + while ((seasonLinkMatch = seasonLinkRegex.exec(seasonList)) !== null) { + const [_, seasonLink] = seasonLinkMatch; + if (seasonLink.endsWith("/filme")) { + filmeLinks.push(seasonLink); + } else { + seasonLinks.push(seasonLink); + } + } + seasonLinks.push(...filmeLinks); + } + return seasonLinks; +} + +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} + +// Helper function to fetch episodes for a season +// Site specific structure +async function fetchSeasonEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + // Updated regex to allow empty <strong> content + const regex = + /<td class="seasonEpisodeTitle">\s*<a[^>]*href="([^"]+)"[^>]*>.*?<strong>([^<]*)<\/strong>.*?<span>([^<]+)<\/span>.*?<\/a>/g; + + const matches = []; + let match; + let holderNumber = 0; + + while ((match = regex.exec(text)) !== null) { + const [_, link] = match; + matches.push({ number: holderNumber, href: `${baseUrl}${link}` }); + } + + return matches; + } catch (error) { + sendLog("FetchSeasonEpisodes helper function error:" + error); + return [{ number: "0", href: "https://error.org" }]; + } +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////// +//////////////////////////// for ExtractStreamUrl //////////////////////// +///////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the video links +// Site specific structure +function getVideoLinks(html) { + const videoLinks = []; + const videoRegex = + /<li\s+class="[^"]*"\s+data-lang-key="([^"]+)"[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*>.*?<h4>([^<]+)<\/h4>.*?<\/a>.*?<\/li>/gs; + let match; + + while ((match = videoRegex.exec(html)) !== null) { + const [_, langKey, href, provider] = match; + videoLinks.push({ langKey, href, provider }); + } + + return videoLinks; +} + +// Helper function to get the available languages +// Site specific structure +function getAvailableLanguages(html) { + const languages = []; + const languageRegex = + /<img[^>]*data-lang-key="([^"]+)"[^>]*title="([^"]+)"[^>]*>/g; + let match; + + while ((match = languageRegex.exec(html)) !== null) { + const [_, langKey, title] = match; + languages.push({ langKey, title }); + } + + return languages; +} + +// Helper function to fetch the base64 encoded string +function base64Decode(str) { + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let output = ""; + + str = String(str).replace(/=+$/, ""); + + if (str.length % 4 === 1) { + throw new Error( + "'atob' failed: The string to be decoded is not correctly encoded." + ); + } + + for ( + let bc = 0, bs, buffer, idx = 0; + (buffer = str.charAt(idx++)); + ~buffer && ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4) + ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) + : 0 + ) { + buffer = chars.indexOf(buffer); + } + + return output; +} + +// Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ \ No newline at end of file diff --git a/aniworld/v2/AniWorldGerDub_v2.js b/aniworld/v2/AniWorldGerDub_v2.js new file mode 100644 index 0000000..3ca4c1d --- /dev/null +++ b/aniworld/v2/AniWorldGerDub_v2.js @@ -0,0 +1,994 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const searchApiUrl = `https://aniworld.to/ajax/seriesSearch?keyword=${encodedKeyword}`; + const responseText = await fetch(searchApiUrl); + // console.log("Search API Response: " + await responseText.text()); + const data = await JSON.parse(responseText); + console.log("Search API Data: ", data); + + const transformedResults = data.map((anime) => ({ + title: anime.name, + image: `https://aniworld.to${anime.cover}`, + href: `https://aniworld.to/anime/stream/${anime.link}`, + })); + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog("Fetch error:" + error); + return JSON.stringify([{ title: "Error", image: "", href: "" }]); + } +} + +async function extractDetails(url) { + try { + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const descriptionRegex = + /<p\s+class="seri_des"\s+itemprop="accessibilitySummary"\s+data-description-type="review"\s+data-full-description="([^"]*)".*?>(.*?)<\/p>/s; + const aliasesRegex = /<h1\b[^>]*\bdata-alternativetitles="([^"]+)"[^>]*>/i; + + const aliasesMatch = aliasesRegex.exec(text); + let aliasesArray = []; + if (aliasesMatch) { + aliasesArray = aliasesMatch[1].split(",").map((a) => a.trim()); + } + + const descriptionMatch = descriptionRegex.exec(text) || []; + + const airdateMatch = "Unknown"; // TODO: Implement airdate extraction + + const transformedResults = [ + { + description: descriptionMatch[1] || "No description available", + aliases: aliasesArray[0] || "No aliases available", + airdate: airdateMatch, + }, + ]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog("Details error:" + error); + return JSON.stringify([ + { + description: "Error loading description", + aliases: "Duration: Unknown", + airdate: "Aired: Unknown", + }, + ]); + } +} + +async function extractEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const html = response.text ? await response.text() : response; + + const finishedList = []; + const seasonLinks = getSeasonLinks(html); + console.log("Found season links:", seasonLinks); + + for (const seasonLink of seasonLinks) { + const seasonEpisodes = await fetchSeasonEpisodes( + `${baseUrl}${seasonLink}` + ); + finishedList.push(...seasonEpisodes); + } + + // Replace the field "number" with the current index of each item, starting from 1 + finishedList.forEach((item, index) => { + item.number = index + 1; + }); + + return JSON.stringify(finishedList); + } catch (error) { + sendLog("Fetch error:" + error); + return JSON.stringify([{ number: "0", href: "" }]); + } +} + +async function extractStreamUrl(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + sendLog("Fetching URL: " + fetchUrl); + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const finishedList = []; + const languageList = getAvailableLanguages(text); + const videoLinks = getVideoLinks(text); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + + for (const videoLink of videoLinks) { + const language = languageList.find( + (l) => l.langKey === videoLink.langKey + ); + if (language) { + finishedList.push({ + provider: videoLink.provider, + href: `${baseUrl}${videoLink.href}`, + language: language.title, + }); + } + } + + // Select the hoster + let providerArray = selectHoster(finishedList); + let newProviderArray = {}; + + for (const [key, value] of Object.entries(providerArray)) { + const providerLink = key; + const providerName = value; + + // fetch the provider link and extract the stream URL + const streamUrl = await soraFetch(providerLink); + const winLocRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const winLocMatch = winLocRegex.exec(streamUrl); + let winLocUrl = null; + if (!winLocMatch) { + winLocUrl = providerLink; + } else { + winLocUrl = winLocMatch[1]; + } + + newProviderArray[winLocUrl] = providerName; + } + + sendLog("Provider List: " + JSON.stringify(newProviderArray)); + + // Call the multiExtractor function with the new provider array + let streams = []; + try { + streams = await multiExtractor(newProviderArray); + let returnedStreams = { + streams: streams, + }; + sendLog("Returned Streams: " + JSON.stringify(returnedStreams)); + + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Error in multiExtractor: " + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + + + } catch (error) { + sendLog("ExtractStreamUrl error:" + error); + return JSON.stringify([{ provider: "Error1", link: "" }]); + } +} + +function selectHoster(finishedList) { + let provider = {}; + // providers = { + // "https://vidmoly.to/embed-preghvoypr2m.html": "vidmoly", + // "https://speedfiles.net/40d98cdccf9c": "speedfiles", + // "https://speedfiles.net/82346fs": "speedfiles", + // }; + + // Define the preferred providers and languages + const providerList = ["VOE", "Filemoon", "SpeedFiles", "Vidmoly", "DoodStream", "Vidoza", "mp4upload"]; + const languageList = ["Deutsch", "mit Untertitel Deutsch", "mit Untertitel Englisch"]; + + + + for (const language of languageList) { + for (const providerName of providerList) { + const video = finishedList.find( + (video) => video.provider === providerName && video.language === language + ); + if (video) { + provider[video.href] = providerName.toLowerCase(); + } + } + // if the array is not empty, break the loop + if (Object.keys(provider).length > 0) { + break; + } + } + + sendLog("Provider List: " + JSON.stringify(provider)); + return provider; +} + +//////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////////// +//////////////////////////// for ExtractEpisodes //////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the list of seasons +// Site specific structure +function getSeasonLinks(html) { + const seasonLinks = []; + const seasonRegex = + /<div class="hosterSiteDirectNav" id="stream">.*?<ul>(.*?)<\/ul>/s; + const seasonMatch = seasonRegex.exec(html); + if (seasonMatch) { + const seasonList = seasonMatch[1]; + const seasonLinkRegex = /<a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a>/g; + let seasonLinkMatch; + const filmeLinks = []; + while ((seasonLinkMatch = seasonLinkRegex.exec(seasonList)) !== null) { + const [_, seasonLink] = seasonLinkMatch; + if (seasonLink.endsWith("/filme")) { + filmeLinks.push(seasonLink); + } else { + seasonLinks.push(seasonLink); + } + } + seasonLinks.push(...filmeLinks); + } + return seasonLinks; +} + +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} + +// Helper function to fetch episodes for a season +// Site specific structure +async function fetchSeasonEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + // Updated regex to allow empty <strong> content + const regex = + /<td class="seasonEpisodeTitle">\s*<a[^>]*href="([^"]+)"[^>]*>.*?<strong>([^<]*)<\/strong>.*?<span>([^<]+)<\/span>.*?<\/a>/g; + + const matches = []; + let match; + let holderNumber = 0; + + while ((match = regex.exec(text)) !== null) { + const [_, link] = match; + matches.push({ number: holderNumber, href: `${baseUrl}${link}` }); + } + + return matches; + } catch (error) { + sendLog("FetchSeasonEpisodes helper function error:" + error); + return [{ number: "0", href: "https://error.org" }]; + } +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////// +//////////////////////////// for ExtractStreamUrl //////////////////////// +///////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the video links +// Site specific structure +function getVideoLinks(html) { + const videoLinks = []; + const videoRegex = + /<li\s+class="[^"]*"\s+data-lang-key="([^"]+)"[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*>.*?<h4>([^<]+)<\/h4>.*?<\/a>.*?<\/li>/gs; + let match; + + while ((match = videoRegex.exec(html)) !== null) { + const [_, langKey, href, provider] = match; + videoLinks.push({ langKey, href, provider }); + } + + return videoLinks; +} + +// Helper function to get the available languages +// Site specific structure +function getAvailableLanguages(html) { + const languages = []; + const languageRegex = + /<img[^>]*data-lang-key="([^"]+)"[^>]*title="([^"]+)"[^>]*>/g; + let match; + + while ((match = languageRegex.exec(html)) !== null) { + const [_, langKey, title] = match; + languages.push({ langKey, title }); + } + + return languages; +} + +// Helper function to fetch the base64 encoded string +function base64Decode(str) { + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let output = ""; + + str = String(str).replace(/=+$/, ""); + + if (str.length % 4 === 1) { + throw new Error( + "'atob' failed: The string to be decoded is not correctly encoded." + ); + } + + for ( + let bc = 0, bs, buffer, idx = 0; + (buffer = str.charAt(idx++)); + ~buffer && ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4) + ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) + : 0 + ) { + buffer = chars.indexOf(buffer); + } + + return output; +} + +// Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + // return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ \ No newline at end of file diff --git a/aniworld/v2/AniWorldGerSub_v2.js b/aniworld/v2/AniWorldGerSub_v2.js new file mode 100644 index 0000000..07b73ed --- /dev/null +++ b/aniworld/v2/AniWorldGerSub_v2.js @@ -0,0 +1,993 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const searchApiUrl = `https://aniworld.to/ajax/seriesSearch?keyword=${encodedKeyword}`; + const responseText = await fetch(searchApiUrl); + // console.log("Search API Response: " + await responseText.text()); + const data = await JSON.parse(responseText); + console.log("Search API Data: ", data); + + const transformedResults = data.map((anime) => ({ + title: anime.name, + image: `https://aniworld.to${anime.cover}`, + href: `https://aniworld.to/anime/stream/${anime.link}`, + })); + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog("Fetch error:" + error); + return JSON.stringify([{ title: "Error", image: "", href: "" }]); + } +} + +async function extractDetails(url) { + try { + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const descriptionRegex = + /<p\s+class="seri_des"\s+itemprop="accessibilitySummary"\s+data-description-type="review"\s+data-full-description="([^"]*)".*?>(.*?)<\/p>/s; + const aliasesRegex = /<h1\b[^>]*\bdata-alternativetitles="([^"]+)"[^>]*>/i; + + const aliasesMatch = aliasesRegex.exec(text); + let aliasesArray = []; + if (aliasesMatch) { + aliasesArray = aliasesMatch[1].split(",").map((a) => a.trim()); + } + + const descriptionMatch = descriptionRegex.exec(text) || []; + + const airdateMatch = "Unknown"; // TODO: Implement airdate extraction + + const transformedResults = [ + { + description: descriptionMatch[1] || "No description available", + aliases: aliasesArray[0] || "No aliases available", + airdate: airdateMatch, + }, + ]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog("Details error:" + error); + return JSON.stringify([ + { + description: "Error loading description", + aliases: "Duration: Unknown", + airdate: "Aired: Unknown", + }, + ]); + } +} + +async function extractEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const html = response.text ? await response.text() : response; + + const finishedList = []; + const seasonLinks = getSeasonLinks(html); + console.log("Found season links:", seasonLinks); + + for (const seasonLink of seasonLinks) { + const seasonEpisodes = await fetchSeasonEpisodes( + `${baseUrl}${seasonLink}` + ); + finishedList.push(...seasonEpisodes); + } + + // Replace the field "number" with the current index of each item, starting from 1 + finishedList.forEach((item, index) => { + item.number = index + 1; + }); + + return JSON.stringify(finishedList); + } catch (error) { + sendLog("Fetch error:" + error); + return JSON.stringify([{ number: "0", href: "" }]); + } +} + +async function extractStreamUrl(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const finishedList = []; + const languageList = getAvailableLanguages(text); + const videoLinks = getVideoLinks(text); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + + for (const videoLink of videoLinks) { + const language = languageList.find( + (l) => l.langKey === videoLink.langKey + ); + if (language) { + finishedList.push({ + provider: videoLink.provider, + href: `${baseUrl}${videoLink.href}`, + language: language.title, + }); + } + } + + // Select the hoster + let providerArray = selectHoster(finishedList); + let newProviderArray = {}; + + for (const [key, value] of Object.entries(providerArray)) { + const providerLink = key; + const providerName = value; + + // fetch the provider link and extract the stream URL + const streamUrl = await soraFetch(providerLink); + const winLocRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const winLocMatch = winLocRegex.exec(streamUrl); + let winLocUrl = null; + if (!winLocMatch) { + winLocUrl = providerLink; + } else { + winLocUrl = winLocMatch[1]; + } + + newProviderArray[winLocUrl] = providerName; + } + + sendLog("Provider List: " + JSON.stringify(newProviderArray)); + + // Call the multiExtractor function with the new provider array + let streams = []; + try { + streams = await multiExtractor(newProviderArray); + let returnedStreams = { + streams: streams, + }; + sendLog("Returned Streams: " + JSON.stringify(returnedStreams)); + + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Error in multiExtractor: " + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + + + } catch (error) { + sendLog("ExtractStreamUrl error:" + error); + return JSON.stringify([{ provider: "Error1", link: "" }]); + } +} + +function selectHoster(finishedList) { + let provider = {}; + // providers = { + // "https://vidmoly.to/embed-preghvoypr2m.html": "vidmoly", + // "https://speedfiles.net/40d98cdccf9c": "speedfiles", + // "https://speedfiles.net/82346fs": "speedfiles", + // }; + + // Define the preferred providers and languages + const providerList = ["VOE", "Filemoon", "SpeedFiles", "Vidmoly", "DoodStream", "Vidoza", "mp4upload"]; + const languageList = ["mit Untertitel Deutsch", "Deutsch", "mit Untertitel Englisch"]; + + + + for (const language of languageList) { + for (const providerName of providerList) { + const video = finishedList.find( + (video) => video.provider === providerName && video.language === language + ); + if (video) { + provider[video.href] = providerName.toLowerCase(); + } + } + // if the array is not empty, break the loop + if (Object.keys(provider).length > 0) { + break; + } + } + + sendLog("Provider List: " + JSON.stringify(provider)); + return provider; +} + +//////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////////// +//////////////////////////// for ExtractEpisodes //////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the list of seasons +// Site specific structure +function getSeasonLinks(html) { + const seasonLinks = []; + const seasonRegex = + /<div class="hosterSiteDirectNav" id="stream">.*?<ul>(.*?)<\/ul>/s; + const seasonMatch = seasonRegex.exec(html); + if (seasonMatch) { + const seasonList = seasonMatch[1]; + const seasonLinkRegex = /<a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a>/g; + let seasonLinkMatch; + const filmeLinks = []; + while ((seasonLinkMatch = seasonLinkRegex.exec(seasonList)) !== null) { + const [_, seasonLink] = seasonLinkMatch; + if (seasonLink.endsWith("/filme")) { + filmeLinks.push(seasonLink); + } else { + seasonLinks.push(seasonLink); + } + } + seasonLinks.push(...filmeLinks); + } + return seasonLinks; +} + +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} + +// Helper function to fetch episodes for a season +// Site specific structure +async function fetchSeasonEpisodes(url) { + try { + const baseUrl = "https://aniworld.to"; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + // Updated regex to allow empty <strong> content + const regex = + /<td class="seasonEpisodeTitle">\s*<a[^>]*href="([^"]+)"[^>]*>.*?<strong>([^<]*)<\/strong>.*?<span>([^<]+)<\/span>.*?<\/a>/g; + + const matches = []; + let match; + let holderNumber = 0; + + while ((match = regex.exec(text)) !== null) { + const [_, link] = match; + matches.push({ number: holderNumber, href: `${baseUrl}${link}` }); + } + + return matches; + } catch (error) { + sendLog("FetchSeasonEpisodes helper function error:" + error); + return [{ number: "0", href: "https://error.org" }]; + } +} + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////// +//////////////////////////// for ExtractStreamUrl //////////////////////// +///////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the video links +// Site specific structure +function getVideoLinks(html) { + const videoLinks = []; + const videoRegex = + /<li\s+class="[^"]*"\s+data-lang-key="([^"]+)"[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*>.*?<h4>([^<]+)<\/h4>.*?<\/a>.*?<\/li>/gs; + let match; + + while ((match = videoRegex.exec(html)) !== null) { + const [_, langKey, href, provider] = match; + videoLinks.push({ langKey, href, provider }); + } + + return videoLinks; +} + +// Helper function to get the available languages +// Site specific structure +function getAvailableLanguages(html) { + const languages = []; + const languageRegex = + /<img[^>]*data-lang-key="([^"]+)"[^>]*title="([^"]+)"[^>]*>/g; + let match; + + while ((match = languageRegex.exec(html)) !== null) { + const [_, langKey, title] = match; + languages.push({ langKey, title }); + } + + return languages; +} + +// Helper function to fetch the base64 encoded string +function base64Decode(str) { + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let output = ""; + + str = String(str).replace(/=+$/, ""); + + if (str.length % 4 === 1) { + throw new Error( + "'atob' failed: The string to be decoded is not correctly encoded." + ); + } + + for ( + let bc = 0, bs, buffer, idx = 0; + (buffer = str.charAt(idx++)); + ~buffer && ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4) + ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) + : 0 + ) { + buffer = chars.indexOf(buffer); + } + + return output; +} + +// Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ \ No newline at end of file diff --git a/anoboye/anoboye.js b/anoboye/anoboye.js new file mode 100644 index 0000000..164d931 --- /dev/null +++ b/anoboye/anoboye.js @@ -0,0 +1,86 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://anoboye.com/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)">\s*<div class="epl-num">([\d.]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + results.reverse(); + return JSON.stringify(results); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const iframeMatch = html.match(/<iframe[^>]+src=["']([^"']+)["']/i); + if (!iframeMatch) throw new Error("iframe not found"); + + const iframeUrl = iframeMatch[1]; + + const iframeResponse = await fetchv2(iframeUrl); + const iframeHtml = await iframeResponse.text(); + + const videoMatch = iframeHtml.match(/videoUrl:\s*["']([^"']+)["']/i); + if (!videoMatch) throw new Error("videoUrl not found"); + + return videoMatch[1].replace(/\\/g, ""); + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} + diff --git a/anoboye/anoboye.json b/anoboye/anoboye.json new file mode 100644 index 0000000..902567e --- /dev/null +++ b/anoboye/anoboye.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Anoboye", + "iconUrl": "https://i3.wp.com/anoboye.com/wp-content/uploads/2025/05/Anoboye-300x300.jpg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://anoboye.com/", + "searchBaseUrl": "https://anoboye.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/anoboye/anoboye.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/arablionz/arablionz.js b/arablionz/arablionz.js new file mode 100644 index 0000000..7766d49 --- /dev/null +++ b/arablionz/arablionz.js @@ -0,0 +1,229 @@ +async function searchResults(keyword) { + const results = []; + const headers = { + "Content-Type": "application/x-www-form-urlencoded", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", + "Referer": "https://arablionztv.cam/" + }; + const postData = ""; + try { + const response = await fetchv2("https://arablionztv.cam/SearchEngine/"+encodeURIComponent(keyword), headers, "POST", postData); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*>\s*<div class="Box--Poster">\s*<img[^>]+data-image="([^"]+)"[^>]*>\s*.*?<h2>(.*?)<\/h2>/gs; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<p class="Singular--Story-P">(.*?)<\/p>/s; + const match = html.match(regex); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + try { + return JSON.stringify([{ + href: url, + number: 1 + }]); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const idMatch = html.match(/data-id="(\d+)"/); + if (!idMatch) return "https://error.org/"; + const id = idMatch[1]; + + const apiUrl = "https://passthrough-worker.simplepostrequest.workers.dev/?arablionz=https://arablionztv.cam/PostServersWatch/" + id; + const apiResponse = await fetchv2(apiUrl); + const apiHtml = await apiResponse.text(); + + const iframeMatch = apiHtml.match(/<iframe[^>]+src="([^"]+)"/); + if (!iframeMatch) return "https://error.org/"; + const iframeUrl = iframeMatch[1]; + const headers = { + "Content-Type": "application/x-www-form-urlencoded", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", + "Referer": "https://arablionztv.cam/" + }; + const streamResponse = await fetchv2(iframeUrl, headers); + const streamHtml = await streamResponse.text(); + + const obfuscatedScript = streamHtml.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + if (!obfuscatedScript) return "https://error.org/"; + const unpackedScript = unpack(obfuscatedScript[1]); + + const fileMatch = unpackedScript.match(/file:\s*"([^"]+)"/); + if (!fileMatch) return "https://error.org/"; + const fileUrl = fileMatch[1]; + console.log(fileUrl); + return fileUrl; + } catch (err) { + return "https://error.org/"; + } +} + + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + + + diff --git a/arablionz/arablionz.json b/arablionz/arablionz.json new file mode 100644 index 0000000..daee849 --- /dev/null +++ b/arablionz/arablionz.json @@ -0,0 +1,18 @@ +{ + "sourceName": "ArabLionz", + "iconUrl": "https://arablionztv.cam/wp-content/uploads/2023/04/vRA6ewKk_400x400-280x280.jpeg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Arabic", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://arablionztv.cam/", + "searchBaseUrl": "https://arablionztv.cam/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/arablionz/arablionz.js", + "type": "shows/movies", + "asyncJS": true, + "downloadSupport": true +} diff --git a/arabseed/arabseed.js b/arabseed/arabseed.js new file mode 100644 index 0000000..1706bb2 --- /dev/null +++ b/arabseed/arabseed.js @@ -0,0 +1,156 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://a.asd.homes/find/?word=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<li class="box__xs__2[^>]*>[\s\S]*?<a href="([^"]+)"[^>]*>[\s\S]*?<img[^>]+src="([^"]+)"[^>]*>[\s\S]*?<h3>(.*?)<\/h3>[\s\S]*?<\/a>/g; + + let match; + const tempResults = []; + + while ((match = regex.exec(html)) !== null) { + const cleanedTitle = match[3].replace(/الموسم\s+\S+\s+الحلقة\s+\S+.*$/u, '').trim(); + tempResults.push({ + href: match[1].trim(), + image: match[2].trim(), + title: cleanedTitle + }); + } + + const combined = []; + const seen = new Set(); + + for (const item of tempResults) { + if (!seen.has(item.title)) { + seen.add(item.title); + combined.push(item); + } + } + + return JSON.stringify(combined); + + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="post__story">\s*<p>(.*?)<\/p>\s*<\/div>/s); + + let description = "N/A"; + + if (match) { + const rawDescription = match[1]; + description = rawDescription.replace(/<\/?span[^>]*>/g, '').trim(); + description = description.replace(/\s+/g, ' '); + } + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const episodesListMatch = html.match(/<ul class="episodes__list[^>]*>([\s\S]*?)<\/ul>/); + if (!episodesListMatch) { + results.push({ + href: url, + number: 1 + }); + return JSON.stringify(results); + } + + const episodesHTML = episodesListMatch[1]; + + const episodeItemRegex = /<li[^>]*>[\s\S]*?<a href="([^"]+)"[\s\S]*?الحلقة<b>(\d+)<\/b>[\s\S]*?<\/a>[\s\S]*?<\/li>/g; + let match; + const episodes = []; + + while ((match = episodeItemRegex.exec(episodesHTML)) !== null) { + const href = match[1].trim(); + const episodeNumber = parseInt(match[2]); + episodes.push({ + href: href, + number: episodeNumber + }); + } + + episodes.sort((a, b) => a.number - b.number); + + results.push(...episodes); + + if (results.length === 0) { + results.push({ + href: url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: url, + number: 1 + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/href="([^"]+)"[^>]*class="btton watch__btn"/); + console.log("Match found: " + match); + if (match) { + const extractedUrl = match[1].replace(/&/g, '&'); + const headers = { + "Referer": "https://a.asd.homes/" + }; + const extractedResponse = await fetchv2(extractedUrl, headers); + const extractedHtml = await extractedResponse.text(); + console.log("Extracted HTML snippet:"+ extractedHtml); + + const embedMatch = extractedHtml.match(/<iframe[^>]*src="([^"]+)"/); + if (embedMatch) { + const embedUrl = embedMatch[1]; + const embedResponse = await fetchv2(embedUrl, headers); + const embedHtml = await embedResponse.text(); + + const sourceMatch = embedHtml.match(/<source src="([^"]+)"/); + if (sourceMatch) { + return sourceMatch[1]; + } + } + } + } catch (err) { + console.log(err); + } + + return "https://files.catbox.moe/avolvc.mp4"; +} + diff --git a/arabseed/arabseed.json b/arabseed/arabseed.json new file mode 100644 index 0000000..f16dac8 --- /dev/null +++ b/arabseed/arabseed.json @@ -0,0 +1,18 @@ +{ + "sourceName": "ArabSeed", + "iconUrl": "https://a.asd.homes/wp-content/themes/Elshaikh2021/UI/images/logo333.webp", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.2", + "language": "Arabic", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://a.asd.homes/", + "searchBaseUrl": "https://a.asd.homes/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/arabseed/arabseed.js", + "type": "shows/movies/anime", + "asyncJS": true, + "downloadSupport": true +} diff --git a/ashi/ashi.js b/ashi/ashi.js new file mode 100644 index 0000000..eca8c0e --- /dev/null +++ b/ashi/ashi.js @@ -0,0 +1,719 @@ +// +// +// Main functions +// +// + +async function searchResults(query) { + const encodeQuery = keyword => encodeURIComponent(keyword); + + const decodeHtmlEntities = (str) => { + if (!str) return str; + return str.replace(/&#(\d+);/g, (match, dec) => String.fromCharCode(dec)) + .replace(/"/g, '"') + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>'); + }; + + const fuzzyMatch = (query, title) => { + const q = query.toLowerCase().trim(); + const t = title.toLowerCase().trim(); + + if (t === q) return 1000; + if (t.includes(q)) return 900; + + const qTokens = q.split(/\s+/).filter(token => token.length > 0); + const tTokens = t.split(/[\s\-]+/).filter(token => token.length > 0); + + const stopwords = new Set(['the', 'a', 'an', 'and', 'or', 'of', 'in', 'on', 'at', 'to', 'for']); + + let score = 0; + let matchedTokens = 0; + let significantMatches = 0; + + qTokens.forEach(qToken => { + const isStopword = stopwords.has(qToken); + let bestMatch = 0; + + tTokens.forEach(tToken => { + let matchScore = 0; + + if (tToken === qToken) { + matchScore = isStopword ? 20 : 100; + if (!isStopword) significantMatches++; + } else if (tToken.includes(qToken) && qToken.length >= 3) { + matchScore = isStopword ? 10 : 60; + if (!isStopword) significantMatches++; + } else if (qToken.includes(tToken) && tToken.length >= 3) { + matchScore = isStopword ? 10 : 50; + if (!isStopword) significantMatches++; + } else if (qToken.length >= 3 && tToken.length >= 3) { + const dist = levenshteinDistance(qToken, tToken); + const maxLen = Math.max(qToken.length, tToken.length); + const similarity = 1 - (dist / maxLen); + + if (similarity > 0.7) { + matchScore = Math.floor(similarity * 40); + if (!isStopword) significantMatches++; + } + } + + bestMatch = Math.max(bestMatch, matchScore); + }); + + if (bestMatch > 0) { + score += bestMatch; + matchedTokens++; + } + }); + + const significantTokens = qTokens.filter(t => !stopwords.has(t)).length; + + const requiredMatches = Math.ceil(significantTokens * 0.7); + if (significantMatches < requiredMatches) { + return 0; + } + + if (matchedTokens >= qTokens.length) { + score += 100; + } + + if (t.startsWith(q)) { + score += 150; + } + + const extraWords = tTokens.length - qTokens.length; + if (extraWords > 3) { + score -= (extraWords - 3) * 20; + } + + for (let i = 0; i < qTokens.length - 1; i++) { + const bigram = qTokens[i] + ' ' + qTokens[i + 1]; + const bigramNoDash = qTokens[i] + qTokens[i + 1]; + if (!t.includes(bigram) && !t.includes(bigramNoDash)) { + score -= 15; + } + } + + return Math.max(0, score); + }; + + const levenshteinDistance = (a, b) => { + const matrix = []; + + for (let i = 0; i <= b.length; i++) { + matrix[i] = [i]; + } + + for (let j = 0; j <= a.length; j++) { + matrix[0][j] = j; + } + + for (let i = 1; i <= b.length; i++) { + for (let j = 1; j <= a.length; j++) { + if (b.charAt(i - 1) === a.charAt(j - 1)) { + matrix[i][j] = matrix[i - 1][j - 1]; + } else { + matrix[i][j] = Math.min( + matrix[i - 1][j - 1] + 1, + matrix[i][j - 1] + 1, + matrix[i - 1][j] + 1 + ); + } + } + } + + return matrix[b.length][a.length]; + }; + + const animekaiSearch = async () => { + const searchBaseUrl = "https://animekai.to/browser?keyword="; + const baseUrl = "https://animekai.to"; + + const posterHrefRegex = /href="[^"]*" class="poster"/g; + const titleRegex = /class="title"[^>]*title="[^"]*"/g; + const imageRegex = /data-src="[^"]*"/g; + const extractHrefRegex = /href="([^"]*)"/; + const extractImageRegex = /data-src="([^"]*)"/; + const extractTitleRegex = /title="([^"]*)"/; + + const extractResultsFromHTML = (htmlText) => { + const results = []; + const posterMatches = htmlText.match(posterHrefRegex) || []; + const titleMatches = htmlText.match(titleRegex) || []; + const imageMatches = htmlText.match(imageRegex) || []; + const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); + + for (let i = 0; i < minLength; i++) { + const hrefMatch = posterMatches[i].match(extractHrefRegex); + const fullHref = hrefMatch ? (hrefMatch[1].startsWith("http") ? hrefMatch[1] : baseUrl + hrefMatch[1]) : null; + + const imageMatch = imageMatches[i].match(extractImageRegex); + const imageSrc = imageMatch ? imageMatch[1] : null; + + const titleMatch = titleMatches[i].match(extractTitleRegex); + const cleanTitle = titleMatch ? decodeHtmlEntities(titleMatch[1]) : null; + + if (fullHref && imageSrc && cleanTitle) { + results.push({ + href: `Animekai:${fullHref}`, + image: imageSrc, + title: cleanTitle + }); + } + } + + return results; + }; + + try { + const encodedQuery = encodeQuery(query); + const urls = [ + `${searchBaseUrl}${encodedQuery}`, + `${searchBaseUrl}${encodedQuery}&page=2`, + `${searchBaseUrl}${encodedQuery}&page=3` + ]; + + const responses = await Promise.all(urls.map(url => fetchv2(url))); + const htmlTexts = await Promise.all(responses.map(res => res.text())); + + const allResults = []; + htmlTexts.forEach(html => allResults.push(...extractResultsFromHTML(html))); + return allResults; + } catch (error) { + console.error("Animekai search error:" + error); + return []; + } + }; + + const oneMoviesSearch = async () => { + const searchBaseUrl = "https://1movies.bz/browser?keyword="; + const baseUrl = "https://1movies.bz"; + + const posterHrefRegex = /href="([^"]*)" class="poster"/g; + const titleRegex = /class="title" href="[^"]*">([^<]*)</g; + const imageRegex = /data-src="([^"]*)"/g; + + const extractResultsFromHTML = (htmlText) => { + const results = []; + const posterMatches = [...htmlText.matchAll(posterHrefRegex)]; + const titleMatches = [...htmlText.matchAll(titleRegex)]; + const imageMatches = [...htmlText.matchAll(imageRegex)]; + const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); + + for (let i = 0; i < minLength; i++) { + const href = posterMatches[i][1]; + const fullHref = href.startsWith("http") ? href : baseUrl + href; + + const imageSrc = imageMatches[i][1]; + const title = decodeHtmlEntities(titleMatches[i][1]); + + results.push({ href: fullHref, image: imageSrc, title }); + } + return results; + }; + + try { + const encodedQuery = encodeQuery(query); + const urls = [ + `${searchBaseUrl}${encodedQuery}`, + `${searchBaseUrl}${encodedQuery}&page=2`, + `${searchBaseUrl}${encodedQuery}&page=3` + ]; + + const responses = await Promise.all(urls.map(url => fetchv2(url))); + const htmlTexts = await Promise.all(responses.map(res => res.text())); + + const allResults = []; + htmlTexts.forEach(html => allResults.push(...extractResultsFromHTML(html))); + return allResults; + } catch (error) { + console.error("1Movies search error:" + error); + return []; + } + }; + + try { + const [animekaiResults, oneMoviesResults] = await Promise.all([ + animekaiSearch(), + oneMoviesSearch() + ]); + + const mergedResults = [...animekaiResults, ...oneMoviesResults]; + + const scoredResults = mergedResults.map(r => ({ + ...r, + score: fuzzyMatch(query, r.title) + })); + + const filteredResults = scoredResults + .filter(r => r.score > 0) + .sort((a, b) => b.score - a.score) + .map(({ score, ...rest }) => rest); + + return JSON.stringify(filteredResults.length > 0 ? filteredResults : [{ + href: "", + image: "", + title: "No results found, please refine query." + }]); + } catch (error) { + return JSON.stringify([{ + href: "", + image: "", + title: "Search failed: " + error.message + }]); + } +} + +async function extractDetails(url) { + + if (url.startsWith("Animekai:")) { + const actualUrl = url.replace("Animekai:", "").trim(); + + try { + const response = await fetchv2(actualUrl); + const htmlText = await response.text(); + + const descriptionMatch = (/<div class="desc text-expand">([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; + const aliasesMatch = (/<small class="al-title text-expand">([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; + + return JSON.stringify([{ + description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", + aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not available", + airdate: "If stream doesn't load try later or disable VPN/DNS" + }]); + } catch (error) { + console.error("Error fetching Animekai details:" + error); + return JSON.stringify([{ + description: "Error loading description", + aliases: "Aliases: Unknown", + airdate: "Aired: Unknown" + }]); + } + } else { + try { + const response = await fetchv2(url); + const htmlText = await response.text(); + + const descriptionMatch = (/<div class="description text-expand">([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; + const aliasesMatch = (/<small class="al-title text-expand">([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; + const airdateMatch = (/<li>Released:\s*<span[^>]*>(.*?)<\/span>/.exec(htmlText) || [])[1]; + + return JSON.stringify([{ + description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", + aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not aliases", + airdate: airdateMatch ? cleanHtmlSymbols(airdateMatch) : "Not available" + }]); + } catch (error) { + console.error("Error fetching 1Movies details:"+ error); + return JSON.stringify([{ + description: "Error loading description", + aliases: "Not available", + airdate: "Not available" + }]); + } + } +} + +async function extractEpisodes(url) { + const sendEpisodes = async (endpoint, episodeData) => { + if (episodeData.length > 45) { + const promises = episodeData.map(item => + fetchv2(`${endpoint}=${encodeURIComponent(item.data)}`) + .then(res => res.text()) + .then(data => ({ name: item.name, data })) + .catch(err => ({ name: item.name, error: err.toString() })) + ); + return Promise.all(promises); + } else { + const resp = await fetchv2(endpoint, {}, "POST", JSON.stringify(episodeData)); + return resp.json(); + } + }; + + try { + if (url.startsWith("Animekai:")) { + const actualUrl = url.replace("Animekai:", "").trim(); + const htmlText = await (await fetchv2(actualUrl)).text(); + const animeIdMatch = (htmlText.match(/<div class="rate-box"[^>]*data-id="([^"]+)"/) || [])[1]; + if (!animeIdMatch) return JSON.stringify([{ error: "AniID not found" }]); + + const tokenResponse = await fetchv2(`https://ilovekai.simplepostrequest.workers.dev/?ilovefeet=${encodeURIComponent(animeIdMatch)}`); + const token = await tokenResponse.text(); + + const episodeListUrl = `https://animekai.to/ajax/episodes/list?ani_id=${animeIdMatch}&_=${token}`; + const episodeListData = await (await fetchv2(episodeListUrl)).json(); + const cleanedHtml = cleanJsonHtml(episodeListData.result); + + const episodeRegex = /<a[^>]+num="([^"]+)"[^>]+token="([^"]+)"[^>]*>/g; + const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; + + const episodeData = episodeMatches.map(([_, episodeNum, episodeToken]) => ({ + name: `Episode ${episodeNum}`, + data: episodeToken + })); + + const batchResults = await sendEpisodes("https://ilovekai.simplepostrequest.workers.dev/?ilovefeet", episodeData); + + const episodes = batchResults.map((result, index) => ({ + number: parseInt(episodeMatches[index][1], 10), + href: `Animekai:https://animekai.to/ajax/links/list?token=${episodeMatches[index][2]}&_=${result.data}` + })); + + return JSON.stringify(episodes); + } else { + const htmlText = await (await fetchv2(url)).text(); + const movieIDMatch = (htmlText.match(/<div class="detail-lower"[^>]*id="movie-rating"[^>]*data-id="([^"]+)"/) || [])[1]; + if (!movieIDMatch) return JSON.stringify([{ error: "MovieID not found" }]); + + const movieData = [{ name: "MovieID", data: movieIDMatch }]; + const tokenResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/ilovethighs", {}, "POST", JSON.stringify(movieData)); + const temp = await tokenResponse.json(); + const token = temp[0]?.data; + + const episodeListUrl = `https://1movies.bz/ajax/episodes/list?id=${movieIDMatch}&_=${token}`; + const episodeListData = await (await fetchv2(episodeListUrl)).json(); + const cleanedHtml = cleanJsonHtml(episodeListData.result); + + const episodeRegex = /<a[^>]+eid="([^"]+)"[^>]+num="([^"]+)"[^>]*>/g; + const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; + + const episodeData = episodeMatches.map(([_, episodeToken, episodeNum]) => ({ + name: `Episode ${episodeNum}`, + data: episodeToken + })); + + const batchResults = await sendEpisodes("https://ilovekai.simplepostrequest.workers.dev/?ilovethighs", episodeData); + + const episodes = batchResults.map((result, index) => ({ + number: parseInt(episodeMatches[index][2], 10), + href: `https://1movies.bz/ajax/links/list?eid=${episodeMatches[index][1]}&_=${result.data}` + })); + + return JSON.stringify(episodes); + } + } catch (err) { + console.error("Error fetching episodes:" + err); + return JSON.stringify([{ number: 1, href: "Error fetching episodes" }]); + } +} + +async function extractStreamUrl(url) { + let source, actualUrl; + + if (url.startsWith("Animekai:")) { + source = "Animekai"; + actualUrl = url.replace("Animekai:", "").trim(); + } else if (url.includes("1movies.bz")) { + source = "1Movies"; + actualUrl = url.trim(); + } else { + console.log("Failed to match URL:", url); + return "Invalid URL format: " + url; + } + + if (source === "Animekai") { + try { + const response = await fetchv2(actualUrl); + const text = await response.text(); + const cleanedHtml = cleanJsonHtml(text); + const subRegex = /<div class="server-items lang-group" data-id="sub"[^>]*>([\s\S]*?)<\/div>/; + const softsubRegex = /<div class="server-items lang-group" data-id="softsub"[^>]*>([\s\S]*?)<\/div>/; + const dubRegex = /<div class="server-items lang-group" data-id="dub"[^>]*>([\s\S]*?)<\/div>/; + const subMatch = subRegex.exec(cleanedHtml); + const softsubMatch = softsubRegex.exec(cleanedHtml); + const dubMatch = dubRegex.exec(cleanedHtml); + const subContent = subMatch ? subMatch[1].trim() : ""; + const softsubContent = softsubMatch ? softsubMatch[1].trim() : ""; + const dubContent = dubMatch ? dubMatch[1].trim() : ""; + const serverSpanRegex = /<span class="server"[^>]*data-lid="([^"]+)"[^>]*>Server 1<\/span>/; + const serverIdDub = serverSpanRegex.exec(dubContent)?.[1]; + const serverIdSoftsub = serverSpanRegex.exec(softsubContent)?.[1]; + const serverIdSub = serverSpanRegex.exec(subContent)?.[1]; + + const tokenRequestData = [ + { name: "Dub", data: serverIdDub }, + { name: "Softsub", data: serverIdSoftsub }, + { name: "Sub", data: serverIdSub } + ].filter(item => item.data); + + const tokenBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/?ilovefeet", + {}, + "POST", + JSON.stringify(tokenRequestData) + ); + const tokenResults = await tokenBatchResponse.json(); + + const streamUrls = tokenResults.map(result => { + const serverIdMap = { + "Dub": serverIdDub, + "Softsub": serverIdSoftsub, + "Sub": serverIdSub + }; + return { + type: result.name, + url: `https://animekai.to/ajax/links/view?id=${serverIdMap[result.name]}&_=${result.data}` + }; + }); + + const processStreams = async (streamUrls) => { + const streamResponses = await Promise.all( + streamUrls.map(async ({ type, url }) => { + try { + const res = await fetchv2(url); + const json = await res.json(); + return { + type: type, + result: json.result + }; + } catch (error) { + console.log(`Error fetching ${type} stream:` + error); + return { + type: type, + result: null + }; + } + }) + ); + + const decryptRequestData = streamResponses + .filter(item => item.result) + .map(item => ({ + name: item.type, + data: item.result + })); + + if (decryptRequestData.length === 0) { + return {}; + } + + const decryptBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/?ilovearmpits", + {}, + "POST", + JSON.stringify(decryptRequestData) + ); + const decryptResults = await decryptBatchResponse.json(); + + const finalResults = {}; + decryptResults.forEach(result => { + try { + const parsed = JSON.parse(result.data); + finalResults[result.name] = parsed.url; + console.log(`decrypted${result.name} URL:` + parsed.url); + } catch (error) { + console.log(`Error parsing ${result.name} result:` + error); + finalResults[result.name] = null; + } + }); + + return finalResults; + }; + + const decryptedUrls = await processStreams(streamUrls); + const decryptedSub = decryptedUrls.Sub; + const decryptedDub = decryptedUrls.Dub; + const decryptedRaw = decryptedUrls.Softsub; + + const headers = { + "Referer": "https://animekai.to/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + }; + + async function getStream(url) { + try { + const response = await fetchv2(url.replace("/e/", "/media/"), headers); + const responseJson = await response.json(); + + const result = responseJson?.result; + + const postData = { + "text": result, + "Useragent": headers["User-Agent"] + }; + + const finalResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/ilovebush", + {}, + "POST", + JSON.stringify(postData) + ); + + const finalJson = await finalResponse.json(); + return finalJson?.result?.sources?.[0]?.file || null; + } catch { + return null; + } + } + + const streams = []; + + const subStream = decryptedSub ? await getStream(decryptedSub) : null; + if (subStream) streams.push("Hardsub English", subStream); + + const dubStream = decryptedDub ? await getStream(decryptedDub) : null; + if (dubStream) streams.push("Dubbed English", dubStream); + + const rawStream = decryptedRaw ? await getStream(decryptedRaw) : null; + if (rawStream) streams.push("Japanese", rawStream); + + const final = { + streams, + subtitles: "" + }; + + console.log("RETURN: " + JSON.stringify(final)); + return JSON.stringify(final); + + } catch (error) { + console.log("Animekai fetch error:" + error); + return "https://error.org"; + } + } else if (source === "1Movies") { + try { + const response = await fetchv2(actualUrl); + const responseData = await response.json(); + const cleanedHtml = cleanJsonHtml(responseData.result); + + const server1Regex = /<div class="server wnav-item"[^>]*data-lid="([^"]+)"[^>]*>\s*<span>Server 1<\/span>/; + const server1Match = server1Regex.exec(cleanedHtml); + + if (!server1Match) { + console.log("Server 1 not found"); + return "error"; + } + + const serverId = server1Match[1]; + + const tokenRequestData = [{ name: "Server1", data: serverId }]; + + const tokenBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/ilovethighs", + {}, + "POST", + JSON.stringify(tokenRequestData) + ); + const tokenResults = await tokenBatchResponse.json(); + const token = tokenResults[0]?.data; + + if (!token) { + console.log("Token not found"); + return "error"; + } + + const streamUrl = `https://1movies.bz/ajax/links/view?id=${serverId}&_=${token}`; + const streamResponse = await fetchv2(streamUrl); + const streamData = await streamResponse.json(); + + if (!streamData.result) { + console.log("Stream result not found"); + return "error"; + } + + const decryptRequestData = [{ name: "Server1", data: streamData.result }]; + + const decryptBatchResponse = await fetchv2( + "https://ilovekai.simplepostrequest.workers.dev/iloveboobs", + {}, + "POST", + JSON.stringify(decryptRequestData) + ); + const decryptedResponse = await decryptBatchResponse.json(); + const decryptedUrl = decryptedResponse[0]?.data.url; + + const subListEncoded = decryptedUrl.split("sub.list=")[1]?.split("&")[0]; + const subListUrl = decodeURIComponent(subListEncoded); + + const subResponse = await fetchv2(subListUrl); + const subtitles = await subResponse.json(); + + const englishSubUrl = subtitles.find(sub => sub.label === "English")?.file.replace(/\\\//g, "/"); + + if (!decryptedUrl) { + console.log("Decryption failed"); + return "error"; + } + + const headers = { + "Referer": "https://1movies.bz/", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + }; + + const mediaResponse = await fetchv2(decryptedUrl.replace("/e/", "/media/"), headers); + const mediaJson = await mediaResponse.json(); + + const result = mediaJson?.result; + if (!result) { + console.log("Media result not found"); + return "error"; + } + + const postData = { + "text": result, + "Useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + }; + + const finalResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/iloveass", {}, "POST", JSON.stringify(postData)); + const finalJson = await finalResponse.json(); + + const m3u8Link = finalJson?.result?.sources?.[0]?.file; + + const returnValue = { + stream: m3u8Link, + subtitles: englishSubUrl + }; + + return JSON.stringify(returnValue); + } catch (error) { + console.log("1Movies fetch error:" + error); + return "https://error.org"; + } + } +} + +/// +/// +/// Helper functions +/// +/// + +function cleanHtmlSymbols(string) { + if (!string) { + return ""; + } + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function cleanJsonHtml(jsonHtml) { + if (!jsonHtml) { + return ""; + } + return jsonHtml + .replace(/\\"/g, "\"") + .replace(/\\'/g, "'") + .replace(/\\\\/g, "\\") + .replace(/\\n/g, "\n") + .replace(/\\t/g, "\t") + .replace(/\\r/g, "\r"); +} + +function decodeHtmlEntities(text) { + if (!text) { + return ""; + } + return text + .replace(/'/g, "'") + .replace(/"/g, "\"") + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/ /g, " "); +} \ No newline at end of file diff --git a/ashi/ashi.json b/ashi/ashi.json new file mode 100644 index 0000000..1d77925 --- /dev/null +++ b/ashi/ashi.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Ashi (あし) - Literally Everything", + "iconUrl": "https://files.catbox.moe/y8v199.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.4", + "language": "English", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animekai.to/", + "searchBaseUrl": "https://animekai.to/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/ashi/ashi.js", + "type": "anime/movies/shows", + "asyncJS": true, + "softsub": true, + "downloadSupport": true +} diff --git a/asia2tv/asia2tv.js b/asia2tv/asia2tv.js new file mode 100644 index 0000000..5270970 --- /dev/null +++ b/asia2tv/asia2tv.js @@ -0,0 +1,269 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://ww1.asia2tv.pw/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="box-item">[\s\S]*?<a href="([^"]+)"[^>]*>[\s\S]*?<img[^>]+src="([^"]+)"[^>]*>[\s\S]*?<h3><a[^>]*>(.*?)<\/a><\/h3>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descRegex = /<div class="getcontent">\s*<p>([\s\S]*?)<\/p>/i; + const descMatch = html.match(descRegex); + + const description = descMatch ? descMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*\/>\s*<div class="titlepisode">[^0-9]*([0-9]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const fmMatch = html.match(/https:\/\/filemoon\.to\/e\/[a-zA-Z0-9]+/); + if (fmMatch) { + const fmEmbedUrl = fmMatch[0]; + const fmResp = await fetchv2(fmEmbedUrl); + const fmHtml = await fmResp.text(); + + return filemoonExtractor(fmHtml, url); + } + + return "No video found"; + } catch (err) { + return "Error"; + } +} + + + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ diff --git a/asia2tv/asia2tv.json b/asia2tv/asia2tv.json new file mode 100644 index 0000000..0dd127b --- /dev/null +++ b/asia2tv/asia2tv.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Asia2TV", + "iconUrl": "https://ww1.asia2tv.pw/wp-content/uploads/2021/01/logo-1.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Arabic", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://ww1.asia2tv.pw/", + "searchBaseUrl": "https://ww1.asia2tv.pw/", + "scriptUrl": "https://raw.githubusercontent.com/50n50/sources/refs/heads/main/asia2tv/asia2tv.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/asialiveaction/asialiveaction.js b/asialiveaction/asialiveaction.js new file mode 100644 index 0000000..b1cfdcf --- /dev/null +++ b/asialiveaction/asialiveaction.js @@ -0,0 +1,295 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://asialiveaction.com/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const containerMatch = html.match(/<ul class="navegacion-grid">([\s\S]*?)<\/ul>/); + if (!containerMatch) return JSON.stringify([]); + + const containerHtml = containerMatch[1]; + + const regex = /<a href="([^"]+)"[^>]*>[\s\S]*?<h5 class="carousel-title">([\s\S]*?)<\/h5>[\s\S]*?<img[^>]+src="([^"]+)"/g; + + let match; + while ((match = regex.exec(containerHtml)) !== null) { + results.push({ + title: match[2].trim(), + image: match[3].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const titleMatch = html.match(/<h2 class="Title">\s*([\s\S]*?)\s*<\/h2>/); + const descriptionMatch = html.match(/<p>([\s\S]*?)<\/p>/); + + const description = descriptionMatch ? descriptionMatch[1].trim() : "N/A"; + const title = titleMatch ? titleMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: title, + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const listMatch = html.match(/<div class="lista-episodios">([\s\S]*?)<\/div>\s*<\/div>/); + if (!listMatch) return JSON.stringify([]); + + const listHtml = listMatch[1]; + + const regex = /<a href="([^"]+)">[\s\S]*?<b class="numero-episodio">Episodio (\d+)<\/b>/g; + let match; + while ((match = regex.exec(listHtml)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ href: "Error", number: "Error" }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/\["FM","(https:\\?\/\\?\/filemoon\.to\\?\/e\\?\/[^"]+)"/); + + const filemoonLink = match[1].replace(/\\\//g, "/"); + console.log(filemoonLink); + + const response2 = await fetchv2(filemoonLink); + const html2 = await response2.text(); + let streamUrl = null; + try { + streamUrl = await filemoonExtractor(html2, filemoonLink); + } catch (error) { + console.log("filemoon HD extraction error:" + error); + } + + console.log("filemoon Stream URL: " + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log("No stream URL found"); + + return null; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ \ No newline at end of file diff --git a/asialiveaction/asialiveaction.json b/asialiveaction/asialiveaction.json new file mode 100644 index 0000000..85d569b --- /dev/null +++ b/asialiveaction/asialiveaction.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AsiaLiveAction", + "iconUrl": "https://asialiveaction.com/wp-content/uploads/cropped-favicon-200x200.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://asialiveaction.com/", + "searchBaseUrl": "https://asialiveaction.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/asialiveaction/asialiveaction.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/asset.png b/asset.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e56cb14e339a977ed8091240b0c2d32be61f0b GIT binary patch literal 125110 zcmeFYcTiN{(l$!YQ6xz;fs#SVNd!eDDH+LG;tYAn3{fSCNKRq^0Z9^u%#d?XgdsCz zi8Fw}kiQMX@0|Dj>Z@C~?ydKad+Y3iV(&d`_v-z0_tV{L4R4;SD^rqPBg4VLp?vy8 zNfQT$I0y%aK!St_xbtVINfG!%3VveXhJ!=Zdj5->z)Qsfj7YcB)_2!eQ<bs=ISH6s zfh?>AAWmRlG!Bl8JOpfR>0s^7X<=<^=Pb*Os%_-vw6l`s))Q3|QUfbmzp{Jc<7%zt zqpoe~<6tRi#Vs#KCIgWI1UOl{n{z^(9G%^yAhO&Sa;1Rt^V@>lz#vyE8!1ht$CpEZ zD_QPW?(SeIK|wDsF9EN60w7mgL19TrNkJhIK@kytU<ALLx3jxBgx}fiCLn=~^FoG_ zwVS1@9oXFt<ji?4)7%2&;V#R~O~!dCTEX4j)z0Ey(w*G|%rEYEoIfG}ytJUXm7Acj zfY7;GoSZV)@lpy_Zs(WSNwln8E-tWFj&>I_fz4grthK$t*0S81)@~pVS4-;)3Fi-8 z3Q=^mHg~tSk`oaU5#<*W<`)r_5&YjiI-ld;4?KdnKedt*6}@jIWGy1hZ*~6MeKFB{ z{N^I}h4{^dg@wf}tnNz+iHQA65cZM(F6ObtxfBsm5iwCo;rqhklA;nq|9ar!!~Z^B z8{}d6>ikvYME*7G-}f%Y$_SpL>u84s<>KNJm47{fg$z6JznJC!zNxG%|79kyhpXd- z3s_kST02@hSv$L*8%g-mNLH3o?so2u*8et<f}{I?Hxb}_QjX@%wzAw1ek*Gma}P&% zZaEEScQ0#KFsBd5*~;3L6Odu;$jQ$s{C{}6OMx<i|7EWK7w-oCFCKpGgBO8z?tQ=q zz>D3xd@<lkO2NbZ706Z2{1wPs=KSM-ZU7#Cf&2d>Y=Myc7r6gzeuz2vzj!||OzOgG zL9W^$kfWTUxwEG^=N(P!bG)ow?{Zp!EM=7xl&v(()pQjl)HprdtX*Yw6qKIZx!8EP z*y+d!{_i6Gk7{Gz1Rwx_3IzW}7{JB9C<mBPmfIB|6#b3b+c>!M@TW=&+K}}1F$Gc_ zAqqHrq;VyciK00p__z%Jf~{~KG@nvo&v1~G_)OSS&Sso*1_X}RLP5CLvl|p<*pncV z{|q}v;@^P02CzIkTOWf`0Jq_sfor~gU*rBkFqsB^J{maa@Gjvsdx&$1zAA~?#YZ?n zq`2n~1BcM{e-P&)5W?PqhyF*H*$n`T|9}j~dc^;fFZ~B(9Gw60fc+21{{i_TjQ>AR z@c;4T|2a<v%C7&UyZ@v+od1vn&VQ<7AYJ@lHvyMSJRxhZ{emfIRy>ZmwK-4eIqYL} zaAZk|8}4S;Vij(M(5b_9hEp?hVcMU)uPx(Vo6Txm$$&uEt5_u_eftrOM!5fUC^UHg z^d6i9W*5l{CrE+hpKuJJ`KL!Ay8cfqL-FvRCWR>!=bv7N<o~Y%kBOItx~f;TMUUDF zq=(bSEDq+1sR_@4VwD7-gVWy2QWwzE%a0rmTb-1P_0g-(GtmPTB>DP+3iO7{fbpwv z{EH?~IUGO>OwgMfzcakM`qE>G!=&DLs(@XGy5MMd2pD+C(SKn8)++#*X3@aBW2=un zJf_Ny&1!v&WXF7gp*E3=I~D2|^B;cz<dtyktSo4Hlu1<=<8!fiSbUBF{a%`$&OfZn ze^jAAoI5;AaWn;!4@c=54o{6)crTX-UbOjp%778|Lk`?U3O!H%d>-mp{kyd3WA7$@ zd|H&D!(XsyFHRAtKfISe9XMtTYy91T-!@mcs_Ri(BWlP8qjJ4)pAvafZ1S42i@Ig& z-?0VK@fv289vZ$^J3ZvUQnGa@=CEGT)ano=dE@%kIGh(xrf-uy4ZT9zoc5YvQBBEY zfm7kx)khDXO0WvB5Qn%>GzSUqIY+VmFmpr|A>4LV2UPo}bc~I?w|=kpLOgSeS1oM< zIr6kcjfVzy*6nje>l;tcI0)f4fP)QL+mFIKGuma@w?#fCrn2Fjn0u4}4I}IASnC(Y z&?o2J7n!4ma^Rogr~eH`Yp3?m$El>Dq=<!mb2y&G^aRO$BnHRt9Ig%DgNu~7LM@r~ zacqLd5Ulr1Xw)lbW4X>JxpCvy)qhWCfPBl}xblr0CbePkT-5p_Q<FAf4)2mt;GMeH zq#;>P`?>2lj}5wc>Eqa%y)qnvZg#oc=2|f3z<55xmB3F|kGWS6!5G^3XEa|4dt4z4 zdIX$}_j+Z>nc4M#e9Fkhy`Exxg=x76GEKa$^5*opZ!iRL2cht0c7o9>x_mlHHSs8^ zlkZ`5%0X*E4$w5I>LRX;=JGcAlynV<g8usYd#vaM%}+S`!0DGhKg3uVshprAj1slx zFcbW%k|s?EB9g}>@SC1&pj4Pf?&lAWw@(ZYirh%5=&P6|QjJWfem<%gAVKqi@gQW7 zU*ydx{Q^(1Vm*2O4Tp>nxG8Pw_n{=e+tZ0ZUAF*<lX5;(7%DUq`Ws`YAj~oP#`|kC z9z{ekr3{#9+y&{HZ<}s!Z&45htP{?<v6;lazBtxturNr$y)w=S0#1U(QJYY4n~B<w zp1k<;v{8?R7*a-lRvg^sq6lEc#4v^i6eQlcQL$sZ%!#H#PA^pbSd8B@6nfPXL|DrQ z=Ig`}Gb^s`zhzo%(vi%t_aZ$V>gsCT?#_3oji&W^bGlyfnuCjJF(Hx|4hvGQ<Mhi; zh<|gTNN4|7EN1wAhyxmQ82Pl!QZwaUT^!UZu^{n@f9r|=-~@T4|163>!OV`?!J05J zu@BL6o22FMh+C7lB^^PmuGtL{Uvk9KUDet@9Z(L4Le=CC(YKx64QuO!F_sT!=Ha4w z8b7X~m)-|?4XXEdd2lPi9}+HECTsM&(GML4$f-+n29QDsAfx2Xpj^q4ON1OR5o-0y zzypuvuz)(7Wo7#)r{|kz6<dk-TaaPWYKYtU@b0&g3`r#nNoMA>3`yoLr3YK44w7Q@ z&6f0TnT3)xr*h~SxK}-=-;I;7H%6&|XHeF$RS{QFOT6!f8*qXY`-ukdKvNZElru#F zZA-hW$FynG<sVY1!u5nW+`UO44~~c<u~6w&&Pv<U($dCdG<juc;ATy_x0E7bM=Tte z{FYYnFY$f99i7=37)qCx`gV`;zJK_|5?JvNB10OQ>p&KoB($NeH}NP-6{K)O8i+|r zRcn-gGIGCNn`k-<8p1qkn}&p;u6V1|yeDXyUz1|HzkD6J14q<xQly%Gyu{>IQfIBx zxdxl_wf&rEypq77zFMQIBB<D)NepJwQmvSu{wt1+|91lpn`N_+2v^CB(xmx{lMv+_ z`rq?voLM3FB^wqA&4n}CUawO$tWDz85ktgte!;wtM8NQHeCE+KVPEuHJ9=3Y;bP0r z9u@V0h2F>lc%zR3=HxHK9V|agq~MvID?znwyo?V|5}RTwLE`V~;dY3#LwTulOMWmI z=!cF;eotXe&J;DxZ7NRo{8?cB?70@F-xZ7)I+-yvHn)r>ZllGEjT)lodd$OkDD<p; zkINi&y6_xnn3e$9*mbxs;!B1A;bB<O;wCgPxwQ{~8G&O={VLA6Ioy*`Ql^9fPD9bs zMpdN^JV?x_Q;Ds_*MtfMriU&>4mJ!qwyIyj*SL6dL@>i5SM8k{PnghZ$m@b69ls1- zKiNkc+u~@A`BLZ9?`)`1OPMt-J~dnpVFvFq+@s&2XUaQL<X@8|^dp1(CU4F;QoD44 zy-!}t=OC~x)vC*b@kXm$Kn##T`Stu0y-JLlcvI6-Bt|O7NDK;gx%PHQ2sU_}Z0@)> zDPt&>jdoR2=q`f?;?4lntlTH~@XN`2_`Xwe$-V?wc__pNs>m$yAuL2}VLc~8)wrEV zIzHX0)9QU0r9RE0=XuF)+R*OR>RGYgLUA4FkToQaLd7Gji5xDE6PTNSZVtd8DiK)2 z2mpCvP3Ss$Fq|bq1YI;ePF%Apv_+|$A2{PlOCTf~t&=WH-)vVNm6-=Gh?8u$=ZQ*d zDt{Y5LPv6Ru9&DFqMCB(*FnaYidax1p`P_DxV?_6!cYwV<YaK>oE2nckycGEBN_2) zj+NEb!GrEx`m(_^%_6!q@NE%3ftFwI$L8y_9^ZgeJH{N^`)c5D5N7@jF3Dye!n)88 z**iE4fXXXZ04F4OoQ~YnC61}7pq!Ix-RIEoFgCtTV&=o(;6wEGo{;#=0;H5wtN*rg zUXJQQEj$FSSI;Sfn8Z^`ov&4AFAGG~3TLAlw22ye!+GBidR3|EH2C`?DX;ie@0bgo zoFGRKWR3ivUhz|y7&X7t4?Q46YuQ_xMhb=Bqpi~~+HK)0;0lr_YM3K5A5Cq;(&7{D zyIB2hG^`!tqGQvXClTa&Bf8#<ja!u9zBMfqgCw4$c(Pf$<W%Q|hgHv^Zq{@}8i?Oi zd%4NoNDxE;<L(w8shw0FB~LX;IjMZjDWj=8RleL=aAumJQD=QEY?9Mu8efq3AU$tx zij*Nql}V;CNK~Bqv@Va``D++c0By5icZsH+3yK@ssAr3hwQ$BG+;e_>lC)*KTn1Mb zlSw9=9<t5fwx{6;<XvCY2y~e$(hh$3lb|{Nk(Th}w>AkodSfwP5<OJ16qz4BCY3RC z#@WvzPP9v|p)r`$e}-r>r5mn(1;bvVhFq&C=@yTN))61DZatqi+W$Q|Y?iBU0$pML zzB2ZAe9W{rMWpVzSg~ov5i2^^gofc|InRY!w01YKDbl#pD<cqJu5MNV5xl=Q!tfg+ zIaeE7VdFB<bsU^WlbJ381>bA`R8b#do3BeOh(CkdK<YO|-uz~XD@o-MphZV${XQNn zR}3;O#-CB#32$K7T$Gl;@g695W#8r$AFZjbED#EvqZs*pUsb(Hlbk1%(E@TkkIbZ~ zng=rjjrCQK$UF_k=It-WmsD|g#-oA658M(`%Lf5*{6(N0CPj<IH$Jw#=6TL%LI1Xo zSfJ;r2fCW%@y)U%^hhQyI}!U{Fj{Gzu1EcxXSvYz+>$eis|3XH@O>~5k)ift8cR_2 z^|>j<5?jb}xvO(-+oK)xgys)pGcx%FKCl`fJ_SN8)CxCnPw_FKjG;GI1h6_OjVoXc z$OxqJ9{7>CjD%TJt?zX`+1@v?(-g#e6|X!dCg-kP%_$*^w>d-FL@9yAL<;o^P>lwh zc@#wKyTK)GX(7+V0sH%?cKUMLoK1`8N<nQ~piy=xzdM%W9l3oyP2fxjgd{uyu7gag zvA9AM8`JXaZoLcl4UEB9o$l}w2r9o5ToNW*a9)WiDcy3yrrMfxfKzeg%4eHQ$ft+M z6-7gV#5opv-_>PNM3teGiz{2mdb~``-p`n+PG6M5govGxoq!z(>#kcbYo2OO9Wfx8 z9H6L8ZSIu{)dW;_6lnnQOEkkkPt#`hEp%T&Gi>VZJ^jy?Lb|UuE9~m4$z-z1BZ{1_ zV(0`(IG)(LUiy+K)|V!NP*Pd=0k$n6&YGlkxz9+_`>xD*r;)mR5gWRvPp9=fIW&xm zY=(;$TuC9A)EAIGEDI$KX#~owv3Bl6b+qxaTJlFPQFMLfZMuyC_+ppvWN>A_qPNy; zt#lr`uN>THmZxD(wl@4?XZ-5$WdFe&gM|b$JW`afDHgwRnQ&I6PlFH3R)t?KY9y;P zK<GU<hZAJ56nV-{N8)rl?RLYOXPI8^Z(A4Ib~1fB!sHAGzw{Ndx+^IUsw({@G|b19 z0$a$NxmmLGUjkJ_OY&Zy*X<6c2c{}qZv15tsKqXm2Ip?j{QHmM?CinUHJ~WZ=K?JS zpY?6~Q#|+jcyy86xKYF9`)E_VKp=6G(P0zO6J9KTjy(p-Hge>ExJ)wcCQ8)F3^pf` zb45aYG=Fi!kM}l{pjkBI$5AENQrl?x>ww$&qF`oxcD#m7!dck0Ed6V<wdx#TX@}wZ zjvz(;4EI>4fE;RDGt;+F$M*1SnXOH8ttshr4UpqXRNg1jU~aB7jx{3!4Pqg~T}7T^ zJPx2f2SDP%f@G(Ka}L*!K1|ULEwT*Dn7ZW9vQ{tFusTF)n~u4)C7*bEcl$fs9`*i2 zyI9r^2A5Y<-89M!+V9<9q>9POt=H0oj)=tbuci$ysxm*m@hy{h06*63<s<neLi6mc zuEmFb2uY$zyh(yO{%YsKI;TCfY%&zz(?_Ra%<)&h_h@K6+u>M}n7&E7)CpOg6q&gi ze}>>@n1~D={Mqoxt_DuvAHvz4KDEnA#%{Iw>?s}KcX9Rrj+98Kn)s&stdH#)x9z=F z7>ASZqN!(9l<XiTGr`4*mUt~@@P>d_S8-VanJNRK87buGm`*~6*Qg0(5(3c;7C#1z zF!~ny3uCCfo#VDjEYNugT}QnD;#6_lW6fJ^y-dvml}+(C_b+J7Lsfct7_LWumX!I7 z(1f|kXQh1Q<={7=@a2aXJGEllGd#aZ@@Bx5uVR_M+`a28`8+v2sRyz%qZVO}@NBgh zIcQ_-u!}hjGm>U@Hl0`qYH>GFYA?tecJb#)FJ>wt5OcYk$G%yfV(@+I=^fSPW{dgx zs9On5wx3_}Y>gbfaFroE?j&#i+0Iyc0(3+CB|b(;>9II1PKK=w6zdg;{`$Ko(i<Dl zsg_nn@3JHmyvV&hA!BxuWF#`z+^%{{n89L*;n00Je~uK{VnQP~g0aGS!~1Xn%#854 z>UJMcQhNB*mUxAt5h6La-96WqI}j$6dW}WaYlaC^hV7e9b%!tkVeMy6nT&pX`{4ME zS6XdsTO>*?`2i&7&0N)+PHn=hyJ@naYdbvPD-Z?@GrEp3H20dRs@ImWEj3uj)u?*& z&|Y<L!la&IeE@E~hBs4Au^v37$c1KO4{n(L+n$)=VAV^|)aS=(eIuA-q+A|t3$(4T z=IJi8eHk`WIJz~gEd&YT?}Mu1%4XSQZ9qQ@Sx1%q{w^gJQm2B>Ccjr%y)Y=1<{&Bl zU{)6-Du>&a(%zAhpUjDIC)iOtsn2W;Z3$aQe$qb=zbZ6KIBRu}?tY6`hD-^^C^@TY zkzTAn+#Jwz><8kyucZe_pbaiA{%Q}<QUnT$O`9HdT}er9JzVTT4v5ONmt9Y%$oEGK zK+g+Cz!9!s9pN#yG8wxLc&r1`l7+n&$7>(XlK%nES8{Fw6qd<T_?g9Ow^ick+9V^4 zP&Wj*0|j&cSP{B!-us6@Rb5oBU-b%6)|*}rhwntK^YDe5V!hbNuTQB4k5WH_rgk~s zHFlQfiUxk*vJR?e2CA#+TWAk0KSR-l6j{HBc(NJCge>E@$Es>+Z;^BEmIGO_v&6TV z3dYCJ=uBt=YDzD=<}WX>NyU?9#zT(8&t)k3CRN?nXNw=#QfVYm6;@78PWZ;T5>I$S z^`x|~8wmgndL7PuSbN77FBeI`SBm(l1F!lGh#18LkWw<Q7Wm?NQm2v4Oeww_P~=+N zdQ>SQ8ok??Yvz(yy4<KAo{M+K>EP1=30gsrWSJ%HGTW|Vn_H_0AYC#b6?#p+Ie1Rk zm?EKtfrL?@26ifrXa2^zT<wxH&0?Lf{)na?F_+OL)0EF7WLo++Erot6?JtttQ4)F~ z?CZtAL*wasZ$UuZD$R4nyC+>QWahpk6@~Xx>17#;#UZvcP4hGa9WR|?c(g4GpR^dt zJ-+3~h(G0Xs6=HivF!VsMfy2(4+!Tv$K9Qe)*jSmNJi{7N75v&1#Y@h%m_AhCJw`M zq5Iwn7{3tS%b=H9M|+i?2UJpy73y~}4rm4pw49mjRX56ZagsQ0HEfYs<@=dttWT4T z)l(8suw7MVNcdXupsKK&_9|CtJ6CD}g^6fJXj4HpdhRw83H1cm`tJJ@uU#ppN=g%| zZFZOG^c9p!U}i=)UeBA-A6q$Y9db&V&??82n?F8MxV&nfl^Dkb6^7ufEekeR$F*mk z1zwk7OQy~;ngjuw9<+1OV7>C?MvzzDxu&kd4QqbaFqj+`gd|umA#o7s7GP6&)lJ$6 zD{AddDo`;ErVb-I+_WfmD#i9l$VA8-{k#02#y~|FSo`t#`;fwoK3S!IBEhl=xoTdV zQNK{5;~HWk=mZ+n-pe_5E7Ni!^D67IOmW(q4TTspu@-FzH}LoICsz*ME8CSv6vOwQ zEqN@?opzBo&w$*$&vm+SLvu>ZU-=?YRRB$EMzTLNLTqx>vZcOWN3j%h=rHS{_oar* zS1)XR)9D&saapz$<ZHAqu`+!!PpWJPH`jHFp)5-|(%@xa)#BmY*U@s{4edp67U9Xr zxcBa#vOY;$1r3(zxxc$y3H9s?ZaKfi7wr$&+VFbR9-7!1KLUBCh1Ko8mE<7k_)4`Q zI2{!y{9UUtR5R~%S&k0wX4oK*fit~EIIAC0aGs5Te8hh&53G{{duCJK;Pid}nXP?P zH3K|YpN8{EFziX(Rl%nW)`ms5l|7xRD{|wsb3NA8jbQ8(*M>LBo##|@Gk&MAt7~y@ zsJ@&ib%4d>_WjoCNV?HcTJZ9U<+B?eDl)e;8L8Q1f(T2N%LaDVI0mlZg*r6ZLXBy% z5WW3naMalH!8W{KK<?;74jadbP(LI!-VC90W;v3j>UI$S^g6MAJ(=&63CVHJ@Pd0A zq#!YXMCOH&XUSKeJ9Wu7%>|8G>s;hkDA<{e)7^CWKCD5((F=#o*PoX?C;UV@Q#{<r zf#-a(lyc~gKOKs)rmzZv--1O!gW5<vbBBf~r=~{fr*`A|WxFc;tY6OKf`la36G97b z4dKuI2q_eR!scH@Np9h#LtIW{W$Bwv=)d)2P=QpKVIxt$JCDM!b{C1hjgHYeXM@z+ z9GFJ@<IN9Y8SIlEo<6KfvBF#5Ju=fV9a<G;j+CdV+)T|R@6=sW(6EaO$+S;)C(bG$ zZeHy9Gi?|nCB->GD9c+SI|aUrPGB}B^T|+6Cuo2MPkX<Kr;cuIyG4_e!Cf31Wx?)y zjV$ay*7<kyK#$P<HI7ZUYI}_7&<Ad;KJi%cHn7=-29iG&M~^=x=VgPKa#icDI#xQj zZ;t;g_lW{+=^_%RMdg=ge|`H?H5$AY%%CEa-a$dx@|=D9W~A?_=UmNTMwlaGWkdbn zipLTI{gB<F>8Li+_i#NFR~oN?RBPCR;!UT!Z-te!LXtH4&Pw<7kPF}GI2sZP!n0~7 ze_`p-N~GSJ5pXtx@NH=06<`f>_9?jlx`<*u+47cq5%E!_|5NY?L3;%Rzry;b!sss{ z%=>KfJ0FDFZhUz5^obFlvE)?qm_VmZb}e~Y2F+iaU|qe+TTv19yJ>W-dR9pR6K}8c zRJDeQvC;W&$}GLH&3>6NGarLM7Tfs897uwFi>@(fX<q_^EoTiz09+W+5f7HXgi#9A zapSX<)fu_7u4iVH*eSZb6-MqNz%}FERQB<0Q4vip)oNENOCMe#N_v*OWmZLz!1JNI zu#g{pJs!&Wq<K=6D9w9E&Y0~fnwRq4W@w4{=Mvb|=pYRv>nCAY{bMCP#oqV<ILq?# ze$|ffv9)A%0OoHd&Z$k&wT8qW53ylrt#;9_b&4cWA7{Y#gJk0wM2M!@;E9qoPy~fp z@dSRu%m<(JO{QYd$cyZxwkm_;U9b7Qb>dvh<0G-Upuz@qBfrclNL1CaNTqA#%5v6F z>l!qX^%cVA&&v<)r#d`cC*K0nz%zA=Yg=ja!D~VDb=8G|15#8Nc8JM#V3%9`Ml0&6 z6jgi?!U50sQLIVhr_qI$8$XjLYPxWTyca2!I=2><YhSb-dO!yTl3!&3tBD2S9cj<A zFP02DfBb%oVm)v3z9eiz&y?ZIIed=0NMnU7Bm-Y=hSWO?eqVKX#?Ms(DX?cM_MZJP z;Y;3>6F5EE?~+pG{=Nzv`fA;7u35Nbht(@p)96_+vg%K{-f|WnB~@32&pk5V;`?Iv zl|Bn>>8F+3GpZzaWChQ9o0uL$$<mXzTI6oRXF7FSLhfF&nn5DA&g!i4L(Y&Lla{#r zdYA+?6e*d`IKfF1GxI{>c*UGtGlv`Mw5&L)AKKNivLXB^)BCHvG9Mess2fQ<1AgxB zU2XlE^Lu!(x`)aodz$&XkpA?l=BRXO8SD*5=DR(sn~E~4G|@Fq!oqM?Uv~9|`;EkG zl(Wbvj-tD`9NjuCreAneFCxH-S@WW2xe>pBFHe5VjU3Wq@bW>&;2ay6JofZ7E1nuE zcQ(tFZZ|Y==;qaf?b`&aHKv?Ccwi*+`2Hc&)*rgow&hgU-td0IR3WaH=ICw99On7& zC0^c<*ROfRb5;!xklLEG$!zr=v%5(JpBaXy<UVQCyN+Gr?mWgieVpAQ{@Do}2K9(% z&}G6TP<+q)+~YNW_=ROOZT?y_rBHzXt@13nKij&21c4i%FLM32Uc`MvQ*4b6wOVRi zNiwzD+_Du4=rfCc(;$*!#d?UjV>=_ZX#1e(xfp5i{0m~13UuM=pwQAF9Zh(&{E{Dq zJinrK``HX^F@JU-^+hJuQ(Qk@G`UJPAE=M%;fSDE4TH%w?kRZLO6RR9IR42>BoKbX z;2$gT>cuFrV@j{wVmqQr*Th!~G(S6Uwuad<uFJ#^*tNGH6T{_Qy}82clcap<_qwg$ zJ~sLk$KXi-xQ8-(#KY{Zj;MAph?(r(X=9_T9%bO~sBJ7C6}cbwy*pQ?_b$NIRL8=D z_w2F}P{VtJ%e?_Xlxrovo?>5FM!VV}{wvB4rKb>aW5*Ln&#y&xVq!crv9b#Hx0$v^ zEl0tx6b6XR3h0`VsV3X7n{=aHpVR60o|UydXW4t*u>=V)xl?g%2~7t!XCLssO&<6n zJexUwP1<c3P26`!<3g8(XE`%O7u}X3z>TyR0r1d=wl)8%>^NuSlu!we2Y-7-)d{V- za?PF?9mV_VRZ|NQ7EQ$OZ&k-vTu#kD9V^UjtB?oCv7~OT5l!TqoWh#FzVov1D(<u> z&Cd4x*`oV$X9tw&!=Rqwbc~zeL*i%NzPwMpoIhLN_f73mg|9O>=PGp8E#RM-;-1-b zKg_~M^*wMdaz-kwZ)PBm@*G@hEG83Z+tp~lNoEkF$;D3W?ET*DO#*1=gM4ymQ`<aw zU_+;w3Rkr!*Z@K4EH>ZZoiVLq4CL*v#;vy_UUfS4X$LWyHnFC3xET#MYuHdi<=+*A z%Yz=<VH1|#4eV-+2<QObNQ%)i>-o?IBQ62OfW=8lYQ5lxO@G^%z`i#p>0jixK=8eg z)Bz&?vPoUKrrg&8g2o5WT6C9w@+YmPKV@?439p(9`q3TEgb40{jII&5h%{F}iuZi9 zbn}|ao9)fHv%0L>An(7Vudf|1bgf?pGh+<Npx7m<oLsDP3aH4T%Wh@B&m6nw?1`u2 zp_!6bN}&Pk)5e3tDK+eL`gJ;@QC<gm;a!fLqsM6yY=)YM_{T;*aj!7ApJs_mX2Tvy z7Z;}9x>_VL`qp3?LG1~L><Uc3G1O2f=JT(#c`Z=Wbt|atetL(@G1G7R=namM4uz~V zF#-Wxj$WM>;xzqBUZpo@K6|WuZm87j92f+CAl`b~4~XJBBMu0a=khRkS7#;C?xi?- zrrmVs1z2Ro;n`gQIpzC)L3aXiSWJv2<0o$2sd4|jmsp$x?kL&ftJ-~ssL*QA?d0uI zFam$0^p2FK3b3NsL7RUI2ef!u<<+i^q(v?P#ZAo{`nMM$%jb<P&A!|PsGSfQ319G> zp7s$(=SyCx*yP(Amn{)Vs$s~z*}f6^%LD)D1hXa|GO^SDd-uKyKwuvNU*8F&G4!t= zUNrkmnhmz%%r~`_5TUu(U<{^W(xP@^6H=G$tuHSmu4&h)s$Gy|W10_{57}xW72<lb z$-?O9bZp~<SwgtHt`L2#Qg}*Np2cLZ$nIiJ8z@Bfs8=x}+sMxG>}?oFg1P%R_Xh;@ zq}m?n=l{{&?oxL<Ain4^Ah>TX-{zKiAkH)^@mM*oZ=WZ6dEAAHXwoQjBEE=a)VP!* zuw{y=QQlZqjUh?>O0<k>df@A-<7WjuDH((;2<h;R`=%Xc8==K&uJ_twX0rau<_65X zNUr_B<VDzSN@_ygZun-)Cq8Y4+(fXwZzRNsW1fHx&x9jAhB@}=kOc(Z>n%u^J>tn7 zNS|#!Aiw(dQTJDoudXSYc}jWOIYt8b@A^D{W^8ayEXHm8{j=%X<$3J~+q;c&E9o1q zW65d`lm&Ve<_-sKhrITARqHgy;CO0hzHm)RQfMS)__ifOfKl+Ta*lOLqPlx}l*+09 z_|bc8hpLn+z<~+mzzjS<eF<~MNA<&fy!P-3a6Jdq^<iQF+rS_vqN?vKOiJUMOm~Fq zpwgO%G8)H&s}-}vZ^BWa$bK^e6IC0wc2o<*pXp4qBu(Yv)Ydzg;IL#2n{@vhIzjMU z>r?e~KPaQA-y5x5^__0s+|<9h$tKFm#L`}lmOJeMm7uOt2M2E7%9lkiW#1N3^8cwe zyb(VBD7LEVN!Isoy28ZNE&AD|ClQuaxfH{8Sp%p6ofgA1{frA|?EL3V7?kADdU2uf zKv4G_1GO{RM~9fC&-f>!{<Ya|OPh_4t9frsPTv{kHOt-MIi@@#$Sos9@S1SCY)Sk? z<14igC#o%f;$xlnv<x0*3dEtKP@VFrcjK^P?@l0#We<o_rea&l4v7V?W8CVFU5`Af zY|9LareKl&wIih<WpQ6vb5V55DEeW6io@Gizi(eloez=fyD}m~El+kpl;$<i1_qJl zaBQNdj6{!L(fw1HyuU0=g1d=No#5h7%6JADWH`>=VHpS9qhtcsRLQ>*=>lIXoOREw z6)F@5bDxgKLP>ui%7Z@r?06l%dGngw;Hu^qHD<vGQX=6L(cR}>qV1+(S~LA(KGn>R zA3v@_H5_>_44PB1`z3d91iC5=zy^yNovDvJK}cgn@mxKKcPLGAYW2N98YN|g8+&CX zNu$`eN69U*En!5p`5KSVW!tI+jX(i!>a2T7&MI*i`+c+q-~;#o-WdZXSBt@ytx7Uz z*v&o7x@^=R@gT6~#Sa{yyz^gaf5_6v5r~ejs)v0kvdtd*_5fg`SAXQ@=C*W`ZbtTz zf<;*3U-YFYq?`GloYpMV)JCrNrj#9{Blf{4jeu?_exuRf9YJ6tezfNZG}e2x7qLE3 zM<Bh;=yuEfswEY>eH|TUjE23azx<FFXnG!$J;V002KJZWe(EAVjfMvj@2MM1ZZ=Ke z|4E*|y^6fHUc{!xOupgX0jU>#66Yi_W(*Kj<WT8t5822j-To_-@=rdT@y@v(MUN!( z*ov@#1qf?XJS3W=RBdG2O~+P$L6%Z%4^H<3do|9smt}T(%L)Z@Z;wzG&F)ce&gsp} zyPZ@LDfWw%zPg!RaD6E$_CfaO=xO8k=2CD?!gXXgK&g4&m-~KvY*<>d`U%uzrZ|oG zs_HKI_~Jz1Xz?RlBSzm{9k2&oQQO4#(m{XNEM)-RJn)SjySUNqyY>h8N{aiI1;rIL ztSOO0P`dAJRwEX{qRE_NQYjwEW=;hKX`i0oLD!>Bf<OUl6EX)2Lx7%zj$?J16Y?bq zv6C-tj@lpnDRROy6b@bXd$O-B3DabDLtg);&a$q)TjnZq#V0=(C{o6460u*@`JsJT zKqht)pX$DMM((Q`7%js4nE#~RWa{!X-#5a?KgnCO>(+k-V*#P*ApWqgMYg4Fi%GAQ zvu+8<C>lW+SVTvm+-laxI`gwd@doimS>pN`j`f+kNr-of5gdyXGpAX{V_7HfEMA<& zF1fDt`5ydL*4=Jkv0=5H6m#r*?rTX~M4ryk#41Dav%G23N)$Pu0yZDFI@AC(omVST zzo=!tY+(D|xI`ena-lQCJ^<VAnKx3OvI-g!AC}g7J@h(UOA)i?b6*xa-py)S8BeLn z)P1AE{ifr+kc0qh+vCrL0xR7}0*NNGE88|iGZeld70JCdx_U|7UJW~qm~Oqsrk|fX zUK)45FW<<g^jn(uJ&=aQ{9^w7(zw6Zf@B6=I!t)#(R>h@9Kqq_IP)nCmGn_$gBT*0 z21FFd<}#u-)GzwI*X2e4iQ${#%86K)4#CxMjYK>2Uj_BCluB1BAai-YJ+;i9noiq7 z1mMwqSJ%^EDVdd=n<Jh3MLIXP1M~#f1uAO3S6Ur6_>@S$cC*uV%W2rn3FtS!TMKb{ zT^u-X=(m%07UH(t535P%eJFrv0UeJA$nDOOIUKS4334JNuh?OCv4eK#WywW)|7db} z+{n;WznG$13@|Qtnoi;c<36dy?zr4=y2*io;hPc?<?<DI%^KtW?WL7~uzMcqj@C$e z$O6HCA{rHVV3~~zqz$z0nQ_!aLQRgRMM1GTNtgyrlKMj#OB}a0p#b^zwKfdz+RaqK zXh)N@&=am#9&gAu50*8ymCqIn{PqLSIJy&ngj;PfbufD}>5<z~F)^_t)l?D5zBSrB zVv{LNI?y;c+OH7-el`ALT<~2e{F*iAMIG4_jAbf2-UB!auYu%vq+EJ^ch-qADr|FA zwf$i+^AqFv3A)*(Puj(q(Y1J>jSlpo{D+!MPlhDZCSB7uU6ZzO#?o0y$K7ZvLl!#^ z?|UMr`99w!$W1`5Gd*gfMFfqE^F^;b^7uU#I$xZgB%R*epWKPpP5SZO4>?kQylKo^ zWiK?P9UMlpX#A<J_T#dUhAeq*zgXptKRv{5oOWCusPCjx4U#Ugz3dE~fL5dyDo^B` z`D4@$$%gCbV8-|NfxPF8^Plx6I<YSN&Y;kEHAZ-HOf<ooT-cDmfBrn5j#%A0BaN!W zj*-VDKS_Q+E_ETCd-kIuX)_6$Qd=B7gxjtm<;=!m=?BIWl52+`t=@ZZKN)G?F96jW zUD>Odiri-`QDT#H{UCTUopi7ji*oX~OSuBh9x8LM8C-d&e9~~1Xfr(8eDHQwwduL@ zkX;Ym)NWT}|8ih```iA#)$-WK#-FkYsh}KE6pZ0Z)1^em9|>*_$?2Va2D09>coi%$ z+eu&6V1)qL(ZQ3Td4+WatQdzBD{10dOBTnO)QgI`;TqQyafb1YYT7_FhlR+RCgRqQ z=P|63-KdiYd8D%Z;f`*SNY|l2&k}v2nnBOucWeJ7YvYk0**!n<j<y5DlocTruOtlb z*XfGXy`0GuU@~F9S0^&U4$AWNb@Q9uG{g{d$RJiVxeU-WRhn%w5E`DL7)a*2MS3V) zD*;*$l#M^ShOs*}<q3NbV%~F?5{dLf?&F!_ZKirgY_Lx<-O6YxTUl>4fw3GOX(ATf zJF2Ql=5y-gz-JNY5x@H@kLm5`+AQJ(1GZ+ic0qmxUp@YM>F@0uRxVpq?&}wAmKsgb z4Gllo2`o#vDIq+EHkt;zkD`$d0?Ofr`-wh1OO$@IWk*#zQ;deXErxBDR27lrnAm&w zqYf6c+xPr=LR*Hy+ag?t(QJKuDp=B+x}@jZKzxFT8;B-_tbdAwL#Ta^tEul-5!Lz< zyMJLJkH&WvXf}>>_53~rl?M|~!`YBuzCXS7)%17{S8hL6eqd$Dmf>VF#5mE5s<qBn zt@l(%Sa09xl$h_a;++wSuOx3p?+jCvh9xkoz^HlsRK%=xy|XPKNYRL_3>OJ>Y75w7 zYsLaKRuLWOzi;DQU0L#HIkP`F0zS|f<XzN6H0|4sZZ97gXv`=GZ=C7<aiP1?c-I** zcKz8a-AK=We`}!HsXOuKvvIC2p4!zPB@5Fks^ntMOpZ6<V$`EFoCG9nxipzow|+B* zK4{(veaB5oK+H<=rc}5&nyDn3f9wYzOHbmkwViE+hs~z!0Ed@NWpp`j-}<x41{6YN zJf+^YUsn3wIKsq#fB(`g7p%EiFbG^2PN5~04XXriP^HVuxEcY^SwDUKkjg<5mq4U@ z!V$hNb6uq<WXRNTH&uyB$IDBc;|ODmK?I(_?#iMJ3TYYH7`Io)Xr1!5@MjwEzRxV9 zCz4n_|F%pkv=jv>>IpQ|7or9Q+*t5cLWn7GfBPoxm0O$CTPuWE2W-vvF0=;!>DZH+ zgxx&d=`o&%<rIH)D3Zx)th)Y5Kv?4Ia^bC2k2`huy|0&e|Dhe-`Gvvv<vae!u}yE< zxR_!Tpje2&=4#jb&#_BQf+}Nh5Wy)0=6M_Lj;w@e(4kAff*MyzBxAG7FsjV~FA|{* zzm@Mm4zyRtBL(2x#+p^pH>#}~0oyZv=vcY#%_-lU1wY%$$93lFoh-|b??>;T7T@?& zHI6$$EV5cGec8lpa!*CX79T2GYEy-4WHP(>sJIW3&1K>pTSfM0R8~!vIoUTO_x2bX ze1>@Xjp8!i@38fL(ZyTdPWI(U9}R#HFd!M}6}OZ{s*j&mn51Is`=1Z6sj=?6HGUv1 z+5_1vOl*t{#nDy!$nWmY=6P`CRpyJ`)O7byY5rD-4pEZ=Z@`+NOIm+{kJ^od^$A29 zKoxfz0*|P<PK;D?4T@IofXC`WA{sP2nb{{-wvhr65uTFk0~&|Fs3umKU1<Dt9a``9 z(dOabXa92-o*`Is+*2mdI4*l&j^0J2x2Pc~-#t@zqThaHo}@A=t1cei;&JB)cSaP) zkf$>EREaC8u_CbtyJ;$U?J^YgLLHH&6n?b&5=&+w(0f;eZ1EIYqqx@JejR*nx|=!~ zP9skDFo8MhX>U8oFeFW~48Z=wq{qH&-F|&wXXcyoU$Ux{az-M8R%*7LTWSf0Uu@mN zvz**8E4mR!UQ+HHP=9xa#f21FTiE0DDFzpNx5Z+w6S)YG%%W?@PW;s<hQ2KE$i}1f z8!=h(LV3%~8s@Rezr~*_{4Glp)^NHOI2jZ+ab#XHC&=z@<$ADeUw<FF5PfrH(bt;) zocJ^q#L)7je%HRSxPcSNa|s9ULxtw53`W03a+2g5zQcFsYIXXi@9+6a>#G!cVg{<! zn7>-RFgiRm)WQ+?S1Y~-fqI+snk6yZNUnJM=rqN-<s4eav=-1F>ln{)mk4ZnyE5#$ zgB1CF?N<*=3TDuSxyB7;U7vG>yw@;)i34NzO@B&zb0-HKt8++8NS>XT1)SVjPkpeq zjSmYpN$Xk^{I*+zWs#U$*wv%$xABz6o=9@|Fg-Ef7V-<u`}t#ub*VvNjtNPQ$<_Sb zC|j4bhw0jj`EbSA--Ylj4_S44$I`OSrsM4-YL^q~nHHdp<+47dvsLo@gTY&_i1p9% zTBd-3JTbYpGGZPahDo22`pLZ~n%@oaXcGcPIom1kfn|Df7akr&X(erWiL2Q@p1;M_ zM@**>5E09-+KfmVunaiGS>PVzJ%$&4EFM_cK6^f&fXy?k!W|<zuye;})%pPqWI*r3 ze+d)&)1fHqT=9<ZiE%ww9!fZS4m-HMr*+nPy;U&5!36J151XkZici+rHQMgpZ{aw7 zy;js{uDK-FC_CrhLr#z1KeO(F*+dyN9MyI?c^|t9HBN8uJ-Uu?zxs`1w=h>eG!QaA z&!SPio)Kz4HZqdpw_L1lwOHrax1330D74^(d47U|M^#udF3ondbBLSG9-X{n**Src z>nC?Dau;*dU?cVFW$jW78G{GPqZ#4l!o(~T>8x-((D9qqwUQ3O5N0)<;;y_{@V)Ep zg>oc&Hg)X9yY^Aydp&fxm~~sw61nN|v%Y0xxxVe{_?>haH^+RhBb%gR*_EwcVciYs z7YO%oKQnKrq{q!hVv11oh8la|(T5%t{EEQM2G5;EBbTMh)B$N)&%t*yl2FqcNs6Vo z4)de_En+$2pd(%&JUxN%ENcHJJa4$)7C86q4j?==h@A<ibzB~#k>?T%`QshMRra<D z7*gz7!kFc55djej6Arb9DR{ic^d-%Unv$vi=<ZrburLF^V*&ZedrfZ5r}j(pm-rp) z5RUM%PN?ti^$D1oph~NilhWv1Jd`^*ikMgks2M_#f`!E=>`f@|<+kIMU0Ir4gy$S7 z$$o9<5m)xL<L56G&X#f3zmJj~{#6w?dtR7?C32Br_eWS=KR6<@aQrAG3g&{^OpIt{ zrcdEGZnl<;9uGxcOnqVnuys~!docHosgbnNgL3n)o}O${UERi1ZETM~AbG5OLqpDv z3GB|oO<r=V;5g{wMw)TMc4&v&kw=QRMA0hA!Qd95%~xf)Vqap)!216Atjs*8S3Ygl z#q%J!%+@6?TlqgBch|RGALgGFCXrR5qIjVl@zKb=x3l}8d)3FQF9or6h*kbdx6ye# z#ykc5fey?vD7=KsUZ-A{DlucPbd!V7y}Id7(_U7ULX%r`s3xK|7&EgcHffjO=Im|l zyII|5<hqhJ_G7UvwXfR#aqF^1PuVvYs|VGdwJlk)b34+6jiN3apWf{Y3J#`TJCFhW z5%Jqb$i>!a*CPL>muW0>oc##-0<5jNslN_8rs7B|KJje_R#(?YMNi=~3&^dv!_DG0 zt_PqIALDZ$xN$@4sotOSzpko1M5i4=8u-zcRANjL{J3u1&%KwAM#IQITAB<yh%~fi zFwA|)rw-0okg3~qaA8sZ?jzvs4Z+MRdk-Zb28R<0yZlHQ<@WONP$nWjsJGmXD8*&h z-B2-4zb#yyuKf<@)?k`AIzWl}Ozu^6nC(*H<LK8P5;W{D4&}ib3;ROptjNQUJvs7c zi2T1O+7X^i$^Bs~3-W(p%at^v_YYU7GGj^3wHHuV73l_#rYG)oosGf~p(Cl$e7Zgt zCX`#h>XGu1iGbUIh9EZyIpD*s?(=lmt?Q@5#<*|w;i{LAkc58xf$qR-%r>+45`sF+ zN|5qeL)G*=hqzj^T#-og_wq#zT}DWY%gv$bKH2bn**|5@AgAX2uPO{XAt2+fa<r{z z3h2|PfQaVJRVi-mawp=YpC0qE6IYsz@e^YFMB{q`KaO0+TM7@h@K<{K1KJo22}JJj zQ0Z^B*mGQ=!wA=8v)8)QmiK=5G3GMgN+nDFc&I4}GZ!_Pm;h^L=nULePC}hbG`h7= zq6)f<0C-OUc(3W~`gZIHWO<L?OdI;Tpe+UCpIg$}X4Mnl_Jt>9p)tob;{@M!miiWB zK#dW)Zpvy)Y2QkEZm$=e2-2xm(f`fBFR8GQ^ibwX3M?8~!)EOivKssI{b^d}+bozQ zye#7OoG%SfIzRo{7A28LX0=gzmF(<>RS(HL60eu9w;X5*vR)&6DAj#l0MN$mR}}k) zXap_|*o)}dhAg56`hJcH{gqqmXO{c>Zot@Zc=O=N;hzFBKeL0*=clI`RDtLq4L!<- z2bCkb0e{cr;H+oLIs+bewx#_X3j^~wlUgR-<U{BGc5lWYk4_R|jtv1_Rh$@apS$V} z5mD?S*K5`XKwUb3LupAh!Ym;f)K98A)92hFU_g>*HN57!dSg=c^_D%LX(+;zQr+JC zT+^*7)Kq`8ctazXoAD5{>)PF$`|9;x5iJp?9k%;H0vxeK8PSOYS&7T7%!-Axuw7>7 zs+r}jYvrNNPIj{$XU7p**YGsPfwD~|Vhq!ZnGZ+_p`_oZkh>k<bC%Oya0#Y+P4ESn zlCK?+FdT7w)OQK98hqQ^AHDIKBIn`3)j(Xq3mTjXCTQkt9)44Jkuw2tHKP4KGAPLF zb+*22<h^KEkjcH+?3BAy?LOUU-<8I`cTl-^D9hsyeguvE&ZmnnEg<%7zD(o(4^Pm| zJngqNHBvUc=}o;U_vT~o*$n>vtz>D5@3Fi4`|Hpb&AY)$L8zmuBJvT7=%&ZCF}UkE zqpUG(t)sZAzaz4##aG+k)VMgVSaO6bM6tD&;<ruE;}7G%^<gFRb!g-$sa}@*Q(QHG zdZ$1>vleljOmKLrDiEmN_m4fgF72WEKn$&c(}0_<>jF1oR43)U2faVCUm6Mg$H(L< z<I>d-WP1sh{FL-=0orgTSPNEn*kz?DdyM{U<o<J!f`Up{bl}tDo|&w8%chdV0l~ja z(;k6vE#n$1nQ<n|C%Hp>FY8_-vMQqr28^EMd$Ygzfy?sy=kk|3RZri)At+k55N2{v zzKVEhnEktw=~Poj%r%PN|C*MJjcTbG;^oJnH?A)FjzmH~Ih}up*?J)(4ACuxRi1)2 z=~rf&onyZ>wmY?Zt-syJXCF9}Ip)z@>0|+l^1xxw7Z+Z4BVI*s=i)4alLe!P55w)y zVJ(@A(2={vjsEN@MGp(h9M(N)W<}@FgI7Oqb*Nj_{Jl~)QsBa(i?EW*D_qW;=sjSp zi*c;1&G+tq^#(IiEx8&&Z!%p!JR5RGS8_H;Ch@gBO8Cp#ulob(UA;>-Qc?^hu8YrN zOsj(l$(QE6+0EdO%~TKO8m@LHejb@~vYey+iUa$bEb&KlOZzKY{O#+vuzBI1ud7vH zDz+6Z{kBX2o7<*L6N)qqPiUOlsbR=*zM_rx(t4)13Cpw#u%pqE$}=5vb|0p_b+$m{ z{^3Vk)hG1=@jZ?CIpmkFY;{RrR4>HP@o?oJ4crxBd>J!qoDN^422y#mooM~nqd}R^ zs};-xb7J8Y<iT2OE;N%6d$pzb)s69rv>ibR+eD>Pv3+J_4Ee#K!A-5{G>#q2VfZ*~ zHsOtMyO6&Roo%`|(Q<~DKx7ghSA5st=-`7JDX&{be<3ZZ?3wdBJ))Z=h&rkyig4#~ zh%DzyDw%c@Ta1|uR#?KXkGyOay7l&xD-CNP-*hbBNaALPgHXF!RFexUYe$nre{%Kw zk;{XqXdw#ZsNCeYNF@wK-XGH7SG=Ay+tMfFa;38M$)++Ar&Vf%RmB#MPNV^wd)e3C z!L|ZjpRs$P3qscTjm#KUuwonTQ~UydeX%B?&vw^54=j=s^L(6ugg*2z-JL%K37Zqk zG>Si1KvPgqfM*K?=iYE<ez(uu7vM#A(UC14$$D3vP6tJJBC1Y`SU=25l*3^6ma8Pw zA#?WqlKYN{f~JpY2o}-h+SP_NC<!9PyMH{uM#LR1E^PO{=fjvNCp68B>Wt-H!CRd& zRCXS}a37QxdrP8{4PI%8e%(ytz)TkHq{K=l4JnFT11cLsstDr_T+42A^q?!B^M~8a zvT7xPbn2eeCINz6`9*EsZ@lO3j@DTpLt*=hp1u2hjQ6Vj7K^B{9<O{In{99CbQ7J5 z04>EDFV#13uqzH5-S_W~4sQ$<5eS`nv3bT2q;_F2G7RDbYIBk(<=W}W2EHZCf|;cb z)E;IHbkWRoU<_M465P8s-5`b>JE@UL=UH)2jTCHnts>xi(`~62u=+byuKAFb@w<i& zF08}@Zd<Y(9Uek7s78nM7rsX?`Eov-QuRTjJH|BKmN1pfy0R3C!;LSPu27yaJyLq{ z<m#BY0{C_GdK12-^mb*mMzjls0?j-1+^1acC5lw8w#{TcJ0de=nGHWlE{Ro|;rcZ; zgIxBEdUe;olZ>!ec3&|deR^qt9=S}fxEu>~gMzHnU6<S8iACs(Gy7XCm}1-pJifwn zGS4Ltn#dRpb+a*N^m@o+usg2$oFX{BV*DnA)}%)#pCt34_{_21q>rJ;!BCR=fLq&f zHri{-Bm#EUY>WCRK*=4yR@0j$pGD7`=mPl3Lfy{5?YJjV%(hWY!bBY&U}Nf;NM2iW z?LC9<3(@=2{NdFAcSAchSLuzTe1%7@&=&-hTH>2IL^Mx*8{P9(!eI?p61zbb5o6#$ zeT^WAH{3~yDTXXG^128^Fehiivp7|*tq_6+)Vzecx9RLJsgtIRTfQUle*&rGVfftZ z@_!lU4j6^k#G~XlBTh=ZdiT5Q9{?4?0Q=#af8nr=#et6ngSzERIc4Gk=VMf-oO=Md z!O+_#u!_@o=r5dMb-pG+5Ml60+^6C1mE*lN@M_{Pz<=xVr}OgO9Tlj2`xtq7;ep-A zh~^n-Q}+Y7pg&P_h|CizLp#$+M8l@2k=IE@Z-#V|Y7Q-e?U3-D=58U%_tq7KgXFs> zPR}golwjJAq@{2Kl<U9FFCH|dX5)+|&snaQOobM*>8`NoPz6Us)Dlw$NAQI4R>V*# z_Zp|#z5<zB&Q*@??(V8)35RI&7=Nd#bnzB?An}@IFK*pH!+#IAuK85a*Ld^f_Bu)u z^O67hr0DaNPE(*-*5LR>ip3xX=Q1GTffR5TsRfUKy0<B0u%};b<^R+%?+v7NvnC^O z{!H%hQ^pXp;>QZ$6Q1KrQHhmDqA42TGKYUGjnKXcwUHXXBlH+BpXn8SPfvlB7LGHI z-NxsfmR~jRCKl`WOD<>j-A<~DGbkIso3y}C4aBk(CNlzc)aD<cT;Ue;?C5WzgI^?W zG5=<^;rAsrscXcwBUI$CBbG{tNrEEua5!Ey&d@eFh2e<v=wjOE!-<<d<IhUmksI{; zJivmHOR*dJ=J1L$<5`FAO~x$Z5JHx?^@%4nwz5rda!6Rwmg&c&J@eCL@%h-J7xL>x zqr&F8KoKr?N^nUFG1v`;xThZ|k8O||(0w-W;FerEQqclWK9ien>lE&0Gi>Fr?jM>) zD(vhOYzEu94=fx?bXAL{p!5;L35!wp25gV^*dk;*JR%>;`TiPg$d&hLTJ)#pIWD|y zNzs7XIh+Y(L;38VS@frmeHpS-z59*-8G&4v6&}K+o4zp7!q%ocZao=2qJPJ_Hi0LI z(uE#WYQ-e2eU;)Xxa#Uv<(7Ue3N2+~_~#JhvuyMqPRO@mx34&m^$rOVxhIS0l98Vy z!IqrHdL8SMZm)W+UN_&FzE_3$A`$k#xccg-wz}qP+_h*SNU7jfiWDtUC{m!fTc9{3 zxVscD6f0VwKq(HzC3p%Hm*5Fd+}*>MNBX?K^<~|amHTJr&Y9VJ&pzi$YTVJ=?i$3T zjXW0zF`f8G{6(MK4{6*L@T5xguy5l~3^nIyiQ?Z_B>fu;_K(E3s)#^LU2On@UT>{? z03XNo%zefxCeP~qS&RTeD6BE=k(Q|uQIOak0F@HyU&@6j7z-+zxAzvVCR#{uj!-;* z!Dm4I@+Q~NXz3=X3vR&QH#$4pi4E~YPcsFxXEQL!mPf}JK|4>xLpr*_MgS;fsIq_- ztwW^DoXdbcaXkPn&51PAON(&RtI||+NlcjWd70pg-tYRq)KNA%9RlNSKCb;K`_(TE z0HR2_<wKp}#}~+QT1ry*jc}}deLN!-S^^CgG=Z=>@9B?6{g%<|>+6l8jqQvuaI|TB z?~M4?67g4GSR%lSk%BnhfB71h?_xn1NqB3DS=DBda2k&a&B7(c-^$1bz{7u$Ly@}B zp)R^9#&D^~m!%%ZJh8T@w;~1jEq?efgtQ<c#k5$$lh5%a2`jIZvL-|3RJ@3;HUg16 zfrsr<qPx&sIO9>m#@fKe!R$I{u}zvg)#H~y-{`{lFILGT{$a5LqwVb-5TMv-&%V6( z!bp6i8w@alb<&2eimbH-M>_5q@}n{8qZ>ILtGw)sV<}_Txt+7X0>C>&j+(moEX=;- z=Ir0??rgJU?&XVRTHPb>PS4K-M&W8axvWIp$0m?IFeo~&ZdK&TC&dTSubzMYT2T?N zCHmIbpP|Guni+59gpwf4{0(h*@8~o&=9&`v;qs4oMn*205%S)V*DU0Gfk=!DLxX`% zkA-(FL57<}wg-z}Z*nZ%URTXl;RiHaA$U(K@B$W0w|-url!VMuFT#IhF_nLhLSRuq zp=wjY1%k5gfA<~i(S211)C6#MWq1y|Gp?7pQC^qGsoSnKl@q+JGx@$tw{askFj!!? zHK@J4z1!z@V2ixLH2tx@-_5N>OZR+W-eH45#ZHaS83#|(X`In*U(C1C(uDh{WJB^$ zAW_anYPU%-?YF*$)tgu0XkM0tHWA_NYiKC+HEGZcsm!f#pt(8Udpw`=G;_}azU05V z*pgOJ!E=59A2H)mpo}mhQUw$D5n+!N=~X+#29Iw<Unl@#oYik#RzJ>MC_ep!TFv9` zw&Nv~s05RHF3p06_W)mf1e?%YMC+mWGdxMXm@RVdg2)49qcXaB@^`dJDup)A_SWx} z1&E2`daa+6^iVXFPaXuOyTRobz6m1@Pz`*9DQIDoS5eDt1I?ja58F@aSz2z#`>uc1 zsHWOKYWh!dRJ{`H*a*7%TQvBM_FlE>Nkchy%eR7O(p6w?RUjp9r{K!hG(??I)V!C{ z(7NAK(Ti5t;pOTM=}vX+L~3p;kAfykJVox7kkRb~mVdZG#o>%aY+hkuIHdK;HOps? z9ZQ;TMUPUx*KA6w?2_A`%b!sx7;MXAW;pE6|IWJ`Zo$p>j&`}3C%md-eM9I3HS|v< zrWdNRzF_RKXta+>X;@>Xkza_1ZJQAt8AKVXLz&*bWM-tmpn=9+-c~8CFK>WjQE0fq zZGrzXNA1}s^S;=Jmd_s=!8mmYNW+_f93jdn-Q5_7F<;ySqPR!{ZF<blzh3B+87UeY z8&}`eVWTimo613RX7iH!(S`}inRoHK)ATltrLn+*>TnLl>pIQb3;&UnpQZd;+zL=B zC`IIlV}nY;c3jr0k1wA~SE06tZWnyt-~cDN9vLjfitS}(3|%RK2e|`>xElhHRgCk= zRku)kmtUm`-S9=sh?qdSsy4N>fJpnT@u#h8--TVTsM0ib(-`MW8)zFX_R@nq-45w> z(McC06VdsEx-15K&oNHV&Z-^fJ?fqO6KNV+f36SlRyoe=;Napa{1On~73?FEC%^Iw z_Ivc#a?Ryc$CEt{$GDOSmU(0uAUZ<7{`&|I{NZwnr#sM@znjA^@_ULgtoOvo57vDl z;Rk0We}adR+i{^-l=Lf802fFUE)(z#`=p9sRRe2Jgd|EXq`CP83aHAlNVB{_G^(}= zA8w*~>4k#|rGTXoj#npWL)=5ZB=<!O3=H^+^t_3m;5Lj_-NPm?oO|?JsC|4$k<Tu- z&|3A5Xv|G=`_~S{dm57e(T%@O+++Ox3-Gii7>>7qb$f)4%YAO<j^<8r`>s7zx=NQQ zWXFyMEAtBj<cwpX=)_)VV{mqTXr$KeY%B8aQq1HN@GSQ7>><(eaSP`3LFrh;Fq904 zLcNE}Qb;oUX`|4C8<BWf%3gFwNmDd>a}~g@4oQG=-oeZ(T6vs~cl=duvCI9exxb4& z7kf47bD~Ey9qz=N8C*-YJ<QBLR@~jprVS<SEveljn9XT>U$+%*8;kki8hP#QezX^j zlo@h%JoPf$2!?ZZGdauOTG=`}t`X)!!WYcq_Zdi!#^bGL;ILOCujpdLEZStXdwb0m zf|#&W>>a*Vw4(!8JjPJiC!PsQmn4jPIzrE0@tJ0p-*$;g=CqcdWakVX<nY1J2+}mk zKJeF!wM{yvE_&tQ@8e3*L(G4n7}38_OyRQwf(aLOx<=g!8jaq1H@@T(l1F$Z3;4um z+Lg{OAqbt@=>~+5v0m*<)A%K?{*(nzIA-M8OeRX=yGY8D9D%{<4{IF>0!g(+v)5|| zdDa+U?Q!wL@gj{sQf2Zw5N7dg(TC#BJxlEs_8d46*#-ri4zTV@qruq~>S@?cJQH$S z_}LeyHqjO+RUvTNoPq)GG>Ttp54gs`+1xuQuB^;$N1~(hk{YBGyj$gr|NgZ69h_%r z`k~8m*(Dq-86xG~W4%$8brO{LjiLEnv-esi&&FHlX0CvW^V^_r7mE2m&6$}-h0`sW z)AFU#zVfEMXHM&*Bjpo$=JYl$3iD9zBXgn(!kaN?qxS|^mmq}HmTCFY-oeq)3K@d^ zqpl8mBZL{xt$yF-Zy9jL@PJps6(QVbj9FEPTJeUcrUL<72LFGh@*M~LWob|)hV|cY zW~=)MC0%E^=@<gAV1=b7@UK{%0RkpFnMXwsl-S&Ev;c-CG@UnlGED<{Z4xfey_=5j z3>i-@Gl?nuHSv0+cg72qFXx>Dvg_-o^QZ@3dFrO-EakWiT2$(hi#OMusBh9A)QL4e zZ~TE<8OIXP?!kQ@a6`Jezt0G+Xw(p@SlVL(Sl(1f>@L(sb{bU}Nr;tsyEQoq6i5oM zTR;|;yuYetshfeHA%$DZVTT(D*S|@R)qL1)>VT5>DZGpF%F2Y)Kb>!=g&GRPD;5^! z49eU$_nj?0J;fF=-^#taZKZ`qafY(*3&cJmzkKouzf4fBzL5q*OD+#~KS*b8T#@YR z4Qixq78Vo)ug_Y4Qh7FLFCdh^m3Y8+H+Epwbvwg*+o9b7L8WLmZb08Z<+CW~Px&+w zI)tMw;FNt6VYXedLljE(I+d<wE;2SmNZN%W9(oO>L8YrGCLNXvraC&%ShGNMVxD`V zzo9~`+@ALV@kMfg9}<ld%iFn-<J?+<3}I)UgU0hcqkvwk7cX9zIWBm-oS%AK&lyvf z%ACmjStSWC!~)I8yAr<ai%gX<hk}2;uPyWSW7wH4Up;c)+1lCbW!Jf;1AZtgL?x$# z8tIL%&({8)l^LJz65R7!qvyAbhF0Lg2hN*ipn`uu&#J{|G)Yg5oaU7S!dr{T?grtw zJ9&%2z_`m_AAF%G!cr`CR(%;Tqa3g!Ty4&@hBp(!UH_Hm-254lvCqlbDXGw?*vuPK zC%U}1$*>&}uzS@`^U+CkRH!jMdAJALZCuweV@Ed%s5|CArbqS0lMP<8v82K^7=S); zrY?9Z;hxidMCwBn!Q*!Mea0Xf4jptjY6=I@-wOJtnkF9J|8sCyws$%}7xl+ozo+T@ z3OT0A)5Uq{FRf8w_Vv;7zQSAPPh$WeLY(nH6fQs+7g-GXGIWQIM?HjQE1=Fk+W8<w zhpIUK)T4GAQ~8Xs=Qk=BryAND$al)R?iaE08uJ!cCQVw}#lu(IlUq(wYCAB<0R_4q z8J6^4SAZI=@>4jmABLV$t?Z`|O^vE`zO39B8gCg8u>0M}0XBIE#lr`#CXrL_>;s}c z)z_XWYJMwr$TejcU~I;am&@fE;5-D4jwak!0`u{jp1lv%h!z+T4YhB-rV^c-N3Rre zu2wfYDH>|5P?nXQqX?WJMoPw|yiwsq!`%z!6BA5X#f3vsP-YgI06%!_PK%r4yg35F z?0a!gtXI>fw}$T{c3;^6qjx7#nD1^+0Rm}C;q<JY&3>C<H8WSe#T4Qa;%~1HKb*iO zZSFS}q<)nYXKxFxU1-oXK3b;}8uOoVuz*rrsgkIiCN<3SU%H3hoe_-N`PzPAFj_4R z@Gvq(tKi1c6%Bbi3Zqq(x+BslH`$Z=B#mA^zi+jFm)p(p+6Xey5`-IM<=CsyevUfl zfEn-atF`ebgy5f_cwGk%fhE6vgA*{7?L2I>K?Ve=Oc7)Y6LI?0M0Dc{5>hFAdJl0I zH54Ar*mZ3;$M$5w@*jL|?!7ZMgT`m0FxX3l7w5dN+1s-ytL6Pb$&bJHC2H$}@4>ZR zU|}ZY&q%Mm9TN(I?^k{~?TalB8R@!exOmrGMc;}pzT(Jc$#!DSR=shW+`>j!RR3H} zkm@W*aQfY3o%=X<<c7zjG6&>g7oAuQmS=tT`PVwgxM5(8-lo;6T6mng`p754sSwSm zlp3@r+95q5rX!N&nRW3wo2?TC<DS3!j6d5$x>CHPud7P~Gr8f-`?;ec8SH;ZQkjY0 zeB*=w9V8@};1YOXHd(OFTF^AD0084A-)&6E`hs>ulcQfd%<~XJoF>V43!^=<qLatS z6{`3nUY@MG+#c<0?wbGz*80a5-6R79K0DsWx!m<$R*LU_-@-uJ7*?NN8PNQbrl@Zd z2RStAf9}HIntdAmoWTj`F?Jq5ZS-=(mb%G8(s<4Roh1cokIJ~<<VFgQXj53m&Nv>p z!h@7Nrg-=He-Al((|E$~Cb}6LTBkq<R^f-YzG7U+>t#!c;&a@n=?p?s_eZdRv%$PZ zyI9m4K$4-1{**xxZW(T}m|I#ITA{iZ!ixy}&MhqhPV?7caOOpUAdA($xCOtHq2I+t z11sekv_RV2EX$3YfM>2Rf7IKF`WA#ZfdEP!RD0;v{NK-EepFY3gI$2{<zJY~mo<y$ z-2}b%)QIidFO%1db-pj~)BYy)ymJjFcnueZT)CKB%qhzT&pd3Uw_X`LT##evNU1=8 z)Z9`VE8bgvkF1vAtyjD`OZL~Tnnne>=94}EdJcd%eWaVq*2nV@r>SDaYAMsJj;=L1 zesEBCMzxcgeIan4mfOj(W;PjaXx|(J4SJ1A>iTuUe^VMS<dB60qw3$g+Z=&ZCFD~O zRn?dGktD=BnpKvm!|H<}OHb3+lpld<SB_q=4So^e(TUN7IWtF9#3=sqea!K)I6&Ie zlF{$*5s&W>eZ0+Xpo#kLEbpA#de+j$!~GX8Z^%NCAKnpAb8oNnN?t;|hU|F?JJo!1 zhTeOx_p?5vrDdiP4d85Wx!%wcjkCI1Dd0uM$Hg6$n%+e#2s>GtnK8TFaF{($1A;7* z6OZtZuR>TaIjEYwfGo~z=RP4WlSA}U74Il$(NLwxl0~uk(c1#kT9LoiM8zju52CPA zQ<%+d-PCn;*^{TaoP><pf2Fy_EmuhP3Uqt1r{297j0XbeNuIWZ8P~9<C{Yq%7ZG3| zUx^o5L}`f*)xrD{Q&ZQ~C%Mnz9}H&*sVYo?`8SPXB0k(?<qX2oOZ!g@4PH%~gguHn zo{+<&jCt+Sq*&ylseKkG`)Ec`#EBUzExRj+Z1<zB{p#;eYUWqbDVNPcTZs&A66cQ3 z#RBo~C9uWp0%nj+<$BkV1-``ue+mvjf(4E6pPMcwG+>G4W6;yXz@R2Uv7s@LJVAVB zAz7A+S?WdCcyA7y-w&Ir=OjAzZQ%&rPw6-ETHnus_dF-ZCnmk0)Fl09R*_$!%Nec% zSKjx#5Djq`P)0^MhJn3L>N#jN4sJP?|C&}jxYpT|3DSCCqV}5@&@PCD(CR_YQYx&v z9SPlO76;wmEua98gf)AxI=<$W`25ALl?6-8@y@l5sF!y5q2XY^;XZwicc6XvdH6_Q zAC9P~=;rP&^TfCkM+%WKRC;Xrp*^O8S1*`^)!oO=VJtYaUhj8S^b(cR;^Ay^SH0u2 zT76YfFhiQL2Y!66#jJ>a^c}osW_9g(m!KVnZd0f%|4f);4x2rnyg-(z!t_=zEoWBf zbcTiGNM~qhvQqdc{;u4(q?q7^RdLmh=qZn3-{7!Vt|iNIc^-JnYuoo%(*=ACPG4E) zr~jq6T#qi}y*KvXZSk*qL;1gYBgKrWH_s4{y<|Z4L#l+_Bjn<qsUhYZ;rew%KGZPl zB;I7Q1@FWSJk_C6(@~m_hR$u-oXFd|NQsK4=%lUnudL@NdfHotR-Bm<Cr2jo>edJD z&jOZi+Al^I7Gn7$`lIjzP7W()Yg<S;&8Nr$=-&umb~!U++>jtFIbKWVZgk=@Ay5^8 z829{uG+be|nJ7N?xybVYIibiShNkM~_VycHZBcLg^OIo-?b(k?ML#VKYzHlE?CkQZ ztAqRc<kh~!s()tjsfVFy&@EMu7xj}id8-_K`cmPhl~pdyJdTrpc(Zh|VQF9piqp-6 z@c_Pz-aGDEP(#_V9^o6cS7&teh4CP^DaW3<NQLeRB@XehDDcKl;Sl^7r)5sdwsf=X zQ6}9J<yQc4KN9g75{#&?7gCj4B}(NsC2vm6#AUQb3Ys$C4VKrXE)P2Pjz?PSJ^K^r zFd6`P(7$0{CjD5gRfBoyE6(32B+*W`AgTPQu^PSB4%>}MH|=G+SxKH4FAM*{h<eG@ z8R0d?VNIIpPfaxm*O^sGutAh(r3)JEFHVyH>x};KM>uzh&#m_X6?fZd`j7w#1b)Qo z>gvLE+rc|FN<Ura+1X4dn-4J^Tgkb|m#;;$`)as6_U49$;8#Mk4o#D#_C!F6PYwt3 zF^=;&jXNccd9DoudxletcwK9*<=jdASjO4eT;fjXpH-fnzl(}$N+DUcDSlNa5q2YN z=3P2yr94pA68K}@0vaYYFqs+zEDy+~P}75!@&;&sokgfRLRG}0fg9|U5$vkOtD?Q? zzuf&{F6GS~%V4XP$_HsU+(i%Ce$!1aZ)-KFR*lET6V*C@$<-(c+eu#Rn85Ec&pgWN zEH0CZn^2SbB*(J6IPboRY)Ke9M%=MAd>_6_s<$XPARFZR7odb3hCKRTVMj+5b{-r_ z;#T)LRn7+}v|{l7>g-F?!`k=QT;CEV&ch#sl-Iky`Q<OsZ0mj(GM$J-qDvkpLY9lA zZm!CpWljPMu8NPu14r)I1L}1(q+lz%uEQ(9Ku;=rSOvPc^m*FFBD4=K9&4qaGqY3d zp;|bBtkxB1NX7K>ggY^MA<*lc=hyM$1ESYLyB`ApjE}@pD#=_1>jDNXoF~r=ySHK< zeO4KtnpIR#5G&^{e<3Uw!Cnkx&wmVE_D+6S*%_;2f^e50Q8sK<1wQS4o4IO>D2=$W z*VuZ1?6`r;x+*I-ks@Lx!af}k?p!ykqPHY>^QdZY#GB8DS3&4Y$#-KQR29pJg(1!? zaCqrBWl{{=SKZ|&bEECD^VP~k#Kb57T>U$$BR<Byh$d+9=M|Wc#%1YhV`6qHoFB)Y zL*a(Olkei%IsdT~9-5O4XKF>dcliHmhsgh_9T=$Ep&7)BzVUW`>+(rfR#=~Yz*`%~ z&N3q$=oHkJo}jZ_)p!MabG`1#dOIVhtB&#Nbd1=3V@yK8DR6fla{tjEay0&c#?yDl zRX4ZyhADY+Bt<V3<@0JvCeCfjupBqc-TnQf!SCWd4i1hD9sttb((rx={(*A_3<$Uy zG(|~)2?cem_4L4>s%x`L4Ur`>=;dxHKk2`Q$F~GL-bgfn;18k-MdJQ`_^(`Hn(}h5 zw+P#;77mtUoP4JrI)^_lWy+%g&~X`hS$l$|w()b-U{ewsMkdLg1Y*0dA0!>`N{kMp z)6!bdXmNcvixDdF<C2-`X*^V{{c7jH`IknpC^3I?I`SD;l6fF?Q4pNz`0WmxV0oXm zl|q#<N43?-vpy&k>@ZIglFg@G2Q~&kUGL?w%~zXe;!!gtlfD7%((W^7??ZHI<GT?( z3W_lW(+M3e#|-bz|G`7r{}XZ+RLFJFbFo!RW*-H!V&x`>O>#kae!TFNIqbrA|GY}L zhNn|<g$j4D+{V=xjWa?c+@hkQnZwV#hikln?sJlZ0ujEv+%174O^=6`%KQpr#upZT zMM@n%LP9fni>s^2gB%STTwn<YW+2c<t>+KPy*TCITA0M-!XTE<zneC4)=(pKGdH&v zls7d^?B|Rk9W!#NufW9i*Qn4y8QR-vjow`}a8LAwT%Fk15B}8!;_-TxDk5SUG>CGB zw@Uq9PGPx<_zh=lxJ(=Iwt<)4Ej0G#Z{ABje$xpc_$fEnO(Dzj8G(5a$h+kxN<Ci( zt%}@7&pLilP#1(=oLs;s_{Q9hPvr)nd=C%_Ea<8tE;KLYl5gROpHeCTV|$#?sYikG zA|fMZsvYTP9jIZR_YpE6V)PkzRPc+mYV_ND1Zj+2@VB(+Fkd(<c7aWA0dZ<l3}KM+ zay_4Ja;}y?h_UP4<9mZYH-TZXg-OoXlGvw{yB{?`G7qMoGQXUk9DSQkH5jmAkHuM< z(z5`waBsu05}e`%G0gn%CJa2&4IIQIz5TvD2Wk7!Q|f<l5a`r!x#`?<NB{Iw|6#)Y zDQW9@U8OX8_)hcf`B>b-c_`DDI(bei<*h8$;?i+(-xcR*nd+Z+7jU(}K!~ZV&bt~% z91@b}AkZj<r@MHY>&N#ZZrAb*odd4J94M*bW51=|bW5^Ik)W0eFn&2G`Xqf-SX@{u z;1$P&EX+cPspM;jXW0*1RUc1pH}w+)($=U$Z~;Oa`tESt)wJuSb?!skbL{zBlHF>B z)>VYF)Ccy`uH@)XmeBgu=BKgtGM>DBaZ#PpqBg9hpc;<pcz%&6qTX{?{*sqV_W3W& zypXfj4>u2>^^PdFhdXfvJzghCA1xrzlq2Qmn#*sOPh9%r-G*=^32Fw@Nn1Ad&Zpv< zo-Q|#q_w%j`UjOVy><2EA54hn{u;~d-&T70_&rz3E!m-G$3g}J9c5PfsZpoS5aZMf zA+LBuZ_KuUBC$^2k%lbngg(}ZdCZ$Uswps9$zziLaLje5yy4^sa*uU)hlvJ&J6-no zT3sA?dlt>|KQi6un0V>ylUlP}tLu8bwS)e1<K*^IL24xm%GmAB@MBsp^)*Mzccl{m zRlukICx-P-Rue^Uf4jWYQs3~jO!g0zrHt-vtQFoyW*049+>TF9_N?rOyScfc3}2K4 zy>b_wnD4k(7@yw>2sHXVw#_5GFs>~cTFZAD!8QUdU%$mya?<Z9f4xa^Zfj?^GQbJn zFny8!!G7jpAg!mJ?h~pP=2E<=uuT!~8sI#5*Kgs7p4_V--pu!Bmxy%ko4}L~TfNwc zdd5#S#IH{im(6p0*B_!F5!guWl6VJAAq>Ts-|(b8&dh$2Ih53I=`}wO@BBVxudb9= zT$Jv)2-|GE6H4YMMa7+0?AO!(2&stO`x`ZpKab%Sy`~e))ILyCfh~VHE+Y&Top}Yp z%tXP5?gf3n@G8eiWazi{fT|Zi8W<Lz5U02HeLmeU|5PL?Q&kOi&8)(8jvOazHs>F( zE0;wSSntgV8i9MoIyz)YC4Lo;uvLq%M(If{SRFCV|1Jf1vDi2}^TID1cJvzdz0h2m z0PvPI>Kw1#hQ>ZG+mw`JIfPtDSPF9@*8w+Ya7q;$mGbTNa^!5YJ7=K=ej(+ROd^9X z&Wy0gZ~XoMV*SDwq6^6lup^Iy9O|LBZ@EmD2Ir<qZ3Zph6epPwG4yEU*#O+hBB5g^ zKN}Aha@Dl6HY1`JW1=NhYS{~ExomXa6U8aMmf>{J9g`}2th!;lBEN22<JjEXoG#`W zf6<H$L(3K=(VPi={u*yX(F^c(cv@6ib`_x13+7XOsj6agp`l^lsxm_P0y#lJ!iVFS zU}hyO`#e<X{isez(K<CXuSwVM-%n=y6=T7&M<UHH<7KP0^7XhhIH(^!WL(#U_ykRr z>W(dqMJX1hi=S{M?~OKIT|H&$7H{nYH?-q1;r<6T$*%ev|I{ipRH=H~fg7BFVJs*n z$S(2}+x|f<X_hKb=d>&7^_OBrCSMVoDg%E75JT7N>N!&-i~Za@dfy%TOSYLhD~k1# zjfs+CG_N&d+xpl+-IqbGCN4s`H@DV$Rc4ZX9Z3J1#;bXF5hRc|)yg}+vc9V98zxGT z!cZ+7--SaG%IE9(1=q@}(a%XqsslmkNsiEQiO3LE0)~<!dJ3N4`g0*4YR`$KY1QYS z)2H_gYwMlkL?HsAL8KdVKjNr#SxA<&9V22|7>M}R*qmk@%v-1yIs1C%__+)kKQ^?k zz11$sZ)<J?&U8y%gd0=fYf8pXW9QJ$QdZ&{ZQ-3C%K{T@7g~=sWpAou@kgXrg#ft5 z8)h2WHsu|tkBJa+og77ZD|QefYjho`eQ^##%0goOmO{!rnNKqZHMl6f1`XlE^t^!- zeeRv^Ti0WIT(`$GxpthXsu}0l<bV3I7y8HCxPLio2wDdYl-m)sfLmEpR*9~Uc=3gQ zx&-U=W!2RAHkRj*Ot3p(vQv75yiCy2fK)%%O`a${<N(h@`stlUj(f*%&sCy(N`X46 z6q7I|k7?G!ccV*!k>@ZZm7(XwNvXAm%f!ik9`0Q*P@md5+y9v<WWUtS-QApMcfKLP z+3(ICAOh-eMc7sHR37i#+m$OmdGO=`ewiG`U=3ei6>x*3-eED?aUP9Q`Dy*d-de{Y zUIlu&1dT1?P<ud%G`qt}w_=)_d+2SMK~s`8XX?blq#R2g&<So(0q59oCT4XmEQK+t z@10Kx&T(WncarjloEX%AES+Srd%t_wsJznXPA;Fxt@PkiFz!roLPSL=>Qor1y1Kf` z$z9wS60>D@QC{>eKm-%YDN|GWc;X6T@mJFrCK8)}DTem%M4uzT640s|=%W^@?13*y zjy9aqhK9IpgFX)dfG24~EAoJjdPhwzYW7PK1fo&>CyGxpb&2rUPctT@s64OpAr8;U zxw>y~zQ`FNC6&@S7zzHf5W3txp#7l<GO@(*h6{+s3sWn7Q{3Z@l2@{2n&dNk9Ui#j z1fmJqWV<*rpzrZApgbn)OY6p2>#-8=Z<DRpSds+m*<gHDBP99U{Jhs`Lqg)nM#5Qg zJiZdUiThZ%-!frtLHUp}FLI%F<aj9XP8WsvShmszOL9{*^ispE^q(Xta&ZPbiityP zDMCX-&38k)3wCGbN3`;S&cj!|%3f*3I}A|J($mxH)w*C0`lKcG|LB_#pxDf_O4QP2 z#JwO0|Me!?%CEL1x;|x|b3$Tg;3$QDlCscx+th_>P#^~}H}%EKPY+t5xf4LOhnkZv zEfrR~<H=cM@AilQ&D6qdbM1@6a5!f_*l&OqEkL0)uA)hMvlQK($+uL*r~69$Ga?@s zquArk1U*Allaz||7A8WiY|jtq(TFN`t}#H5RL~iA2@5geR}X(vpmu(~=xN$$r^Ni7 zcB*bLc{iY3aoa)T)U-yu@l6WtPv5|+eRUl1M^WZ`jM8+(4q+XUC1vD*(W2$#CtOky zC3)zJD;8D&t$b0cy?4EiCJHXd%u#L#{bwUqR@SR+SbL`+%rCpYzaJ=(O%o@_(iu); z(m?|`#nvdHtk^l;6&N{mhF|I$K~Y7(UKwZ`cRnG7yANkRa}`PhqSWVQQZl9bp^i>z z5~8@|a0B?mQuil|0#g{)94Qu^x87Vk#?e;#?Rh%T9yRAD)mp>m8S8HhcSYu`n^6tn zO|gF9SmicNPsy7#KvtV|-P=$1<PhJ4_k-yb+nRzxE=!Y>KU0{zOj{vReaep<fuxIZ z;G!<ZB@o4aXuXDc*g}tLtbLc;XwSIJjcq|(-ixe`<dDgcwI5?^lcQ^weRj{PH(9h+ zWeypZ#Oj?_^Kh9^efoLI$fu$ApMR<PY~|ijj?OxuhMqw>1VAF|9B=CTjqeF#a~bHs zH;m#{R^LlctTu8lj_(8@9REdKAwlGi<RG1%NF1LDM>O91r&t+B7C+1;cmm8O!11_> zN8n&HKs(5Z((}8rtN7|=o)Ujog?p)NF%SQ2YotiXOL86ETHU6WKPXgytU_1X}F z%U7#gt`<NficY-w)s?{gg*2{b#ZrozniOcH_t%e{nvb3-6($|rPJuTnd0Onb2W1SY zaY;yO?mLj`LBD8X92VOmtB?9?fH1f{<lOlqQhx_!ax46+so3jQS|D$|Z3e&ZUB)$g zgs$pkyyu87uuYDNi;Q+H7q4y_cc<^mTR{qrOXFthEI0m?v)KB|U8py{(!2Afd*X4k zUnR)qg$KgtJg3}pp3A85V|@I1%}v@jiWwQ!4YT8Ud<s!cUVT^nne(|HDMc>?-!!rz zB`N0~tD0rMXbkV5G3I}AJMSvIN)2YMF920#(4a@3$E#BF>i<IC-8^JsIx&V6^4+;2 zFg%P{jcSp|HiyNUaNVpxbS3+&q9UF+(JM#iz?}=oS-JD<*_GBGX@YqYRlNQ@8vr$G zkRpy)?Z7SGn=D%X@#K^dr~vwOfTub&OTN$;(i75PR+pm#Yg8CmYP<8>-X1w#JV0(# z=L`^rSn0QJ=M!F~@%jf_K95=z5x?Crb)AS44zs8%<aTCi4CEg4M7LMFoytfY<A3&y z)t`TgPh51kUgC~_SpzDk*6MoeHqw4MGdUx7FwRK*E0bOss6qzK^-LM`Om%|KRKpvl z(+%!QD_%o&>zQzH-WWz)l!N`6DBB^%6S<ksG!O&jh|4<r#?x_KXjW&DMQo-&iRW=i z#{vDV!YuwS!$vLU@7kN&JgW=mLJC@<LU7z?4Z&;(&g#pkJC9p?j#|{;)BW<mWO2p8 zBdI0e7Fh2v`>UrXY~wbYt0gE@bi5Na0o7}Ap}IfqFWuVR?FoAK%{19z<87t*eIYK% z$<u$wdRWrwf-8T<C0NT<Gl<4n;&|T+?bNfk%$QoGU$8O77-qm&@d#tz4tEKKDt9-T zDt7h-MM6!jZ(-655sVT*BVStUQyP(ii_n@;;+PV{!^g~@Y}Zg;gLO6dA?xnq{K$0q zeEh7@cAQ3ZTJD95<jJgB<S-nU$tx%ma>8H)jcfFCpDigJ*f%W~j9&$zHsF=`F&0u* zfM=&5xyVlG))ymmg@YvUFVmGebIO=y?rcaN{nm8Bzpz}Yv@LP-xW2MJS%n+AW;?Zr zJEj8Y*DO7)je9sDjESNY8?eRXm@rKhPv@)s)ma-jMcu|EB0rYI_sjV-yN<v^Ws?Kf zmG7N)fxo3?vcRyOsfUUtbyYXAq$zy`9pu`6Bb=^UMQ!5eSja{d5h6?w)=)t`;XZ&^ z=e)<4OGyD~yJKqtdb4NZr+%O%4L#AcMU4gDR_mF;h8glO8?`u42nd+(!B_kjp$Oc6 z$>X&aZZo3Mu4mtN9da^qgLG_ITpwO}{HMo;fM)*JWV^_#JHf0%BKr)w`qK?TFJHL_ zFWi#jbymdC(Mj*kh1NKl;z>4F^7QF6>Jw_Jo4te3bq-_g_sD1E<(e%3L>J>~=yoV> z@X{xydg<?X&y2j5v3K_lF18ntj0JV;PdD1bP_=`~z|as3h{R>``$%5_VT8F$Bx?GG zIHzChZ>6*CijZ^{6wK7eX%NiU&sKW|Emwni+g#sv{_rdFPpqjc{JaXQDD)kZNop_9 zV-J__4O5|_kaVA+rUG}*Bp=|8*{^{K!sBD{@4rQhjGf!u4{UtD?j|xk%MB^egW0}f z7o9k~tfFdm0ZMR&+d~#<yKk{iwzhY<V(Q3o1(9v;*CHzBG_=J^x5Th_tW|`vw5t!k zMv%xY){vC5NT*x?Kbi><BuCjTj=^NiDG|TH&pf|O7;kDt$gwCM)U3@EK4|gSv$V5| zw#a)^t<~ecnBlaGiF;lPUX>q~+yKzg)75pB+3jo^+zflR-B=4Rdim!u=2HDf1lazY zq=bO996$?WsMWE9S{?U6t3h?z*%*(!S}@tMvui0r9zJ}%w<}8(GdhRSU*J0HBU9Cv zJ<dj`RilbpF)QzLdl_39G-+QIuID9XpGEm&aT$35oSSdsT93O<X4_g4j9WaIYMTJ; zO6;oQTXGdm=gKJNi&k}%sL*(Hy#oe7X#)K_bxXYVOil54Qln$z<5opTl-P@ov4sv6 z-g?*#crJebfT<hq9;W@e9R4(>MZfmFU^(|tKp?|#_4u+_`D#OiKsrbTaXys@4g=#s z$;b-_fd#{Gb-y#9978L|gVmox=|8CK=ZT3^g%gfg09>2j1M>9f^^3nq7wEP5Sd~e* zVMOvj_$DV-RK>}{hWosUi7DKe7CozGn4Vy`b0s-VhV>`_D<r;B?H7)NU-c|S<hvll zu7~gl4Z6ivvO-Euo$?~ViGhLyNtymiO!4l_&&zp_>KzvcuxZ*ky!NMF-NXqS1;Tcv zsQwgryxM~6;*$UF6gu@dyg3dNI(CZoCi4+rDa&4}NH_TA>9RI9ZP^sj=4(XAWyaZ+ zImelyEw;v^BqX5K@HgMx?zP0Y1edd^+|?!DKyX>{bNlHs{UHea@a_6YZX{|%b=5;* zbdpkOHt(Ugqr0;$3NdNvt7hn9Wxe~+8f_#wa^5aMsZ=;B7{d#YokWj4=m?K+!)#Md z11*GLn?Tgf!oRJ)p!8uc20UYtlh*`L)O!PgcLOvQ8!4s>_Dw4GQ8{&ZXTy*E2I&!} zFL`)BA6W4&WoqA=S^sWWo0vqNaqMyM;czA*LIaNiP)viv9$f)SA1ZJp;^b5-#Ry>p zsZ-8;q@RyA9?+S(B|dl3n}E@8P<Jv`-(G}!F79Yl+}U@Xzi~tz-5=Ft{V~0kvFrsw zZ#U_E#!fp@8|V7Q+DKz<<RDgH__s6i9Qfl${q-lUTpsG^+}6$flVXw$_y6?+eDI&y zVTiges`j*_GCt-2I)Zj)tnqvNFBx^L%)jOJ2otQtx#%BoEH@q%g5k|7-YVm~Z= zJcrqc_b=qLd57u<1!eMXK<7mZCY~5-p5KA3{jOLS_l#d7a>P7&Oz-A&_2ybAfka~U z2Z-j%!0eI|z^f-`wFej^_V+#;y%tgZ4#S@SDHd*iS>-Jkm#Su!OwvQ91N-J{(08xw z?Fm_P-7rwT@%B=YZ<uA@FA}*`Y>B4gQJWfW`m)>em>HTFmmWKmy20dMZ_LHRKUg)2 zzt7;_Ef@qQYpBdbPc(}cJ3PZyi??xT@LS!cT?)etUJ&GgGBgBL49EYZd(ALu)oE0i z5ZYxD%bv<GvfLbMOxsJ_vLIy<Ae0Duq(|$BUePDQu}d>N9H>HJo4~$Ku&`^gutFR4 ziy&6Rjo0MYcuwKM$%!w?6`^k-B_<{&YBqC{<Z4QHE3&LIIPUA*ybNbrrN|YL`@@3C z!e;+Be8J<zqX%4k$)&r-`9dzz_Wcv_?pe55Xd2yI#_N0**qI&H!4f7hv5C*-V>x{@ zB?3>SRaLtYs*LAngK5825V2CR0)C`ygo~q?+nXBtOzeL>g12dqMBUbvwcWWz=>DQV z)RIwPY<9MP19GT8o!ia`B=Yz7_dCn5r)5HIP?AWgRzlNh2bH$cL7GZxKD&51WMyOC z@bwXALzeUg@_E<Vrla@6314o7xqnUSuStKnkmi!HymfAFyj;Z%qQ2?k1y>9Bn6%SD zNVMYcUu%EpN$As>y2w!6ET7?+P{K9r4}QuWp)%lGF_yn>COIdSqxDi~$=T7t#%%W3 z>gb%{NLU0`a@Banz$V4&dg`ql{wUTkI%>Z&yStmYKJc3+&ok%VUbtC}wkxSmvMHt} zZBMr7hp8G`x9D&}ni}NknRxRNd67$#Y&*2UabC&8MI+m5yk9Rh<rR2Y%=1*@Zd(`P zG)Ni%QofrY|AR6Q6(aHeLz%5#P({BQwFEY_Q{5R5D=$MPs#Qt&5FM^UGkp{x6as8j zso3?z@u72`XmzEe8j3c903_DpPyg7i--5$mFSHd|ci6C6G#e=(y$`SP5nt$1^WDCy zc9JIS@4s$c8%jHg)@{u~i9EH|BTK;N2}&p~hQe%Wpt0997<{6l0}vBW2HDWi#tQoB z<2ca(OwWqxoJ+Bk5#P?_6~rN13+}nMZA8ks-R<@l6G!jLI@T70)LwjOrB(lmliHK% zwYhq&UHdxkhH`2?P6o)@(NvcMm!y_4VNSVHYoRC!l`CPoB2kXclXzU_JagO9qX51< zvlFkcB%odZaP{uQFYo8|S+P9UZX;p(W|L~DQwQaB+xr22<*Pe3-X=F%scX@&i`ZdP zUwh~1wX>`(*9!FjjGdqDA|aXcYBj4~M0}o0;yRW3-D-h8!rNr`6Y5IUR)g=Ke<mu0 zmG#no(o)KXXV^Ah6wy~QrGx(%O7Ob4$o{jQh0%ngh}R;bQ3^6p(~c91UW|5R(auu^ z54Tn}iQark{bK5YCQ&1KLDp*iIg{Mp0<pZb^-bCO*9Xsd&=k5NWvU1{@a=@yzgvg0 zuc%6fOSlP(=(_<)m4v6+FPFy_+dee3?G0u5pMOS43IZtmztpo6v?{KlmP#+0125?O zr~!&XUQNdd*Vv;5-Y6m7*a*f=*xp|C-QRo)3?S%bL45AVRgmABZy;5pol2yGw3lkV zo(nE2l2;W8;C5{m9WzkdIX~;u{_t&*Ogkz%gQ|=7T?6mYjoe6RI~l|}E}*)d3igfz zd0ThQU{^|(#;P2B<|?sV_qg24;ms-*Q$O7WM}zkU%F{(LU0#@%m&Y~NH_e5&HX=0^ z4DRd9!RvL6jmwsz9hn8h6U!~W`be^5+kTkyB0WFeADMz-g&`s0H-%U5?G@3vvnil^ z=*(QuT{b@v`-BG6w`G0!^D(JFN@mm7O8y8a(@nX-53g$d8p|k|F^sIUzfcito3d}; ze#=4oL+Brcj`>&E|5+p7P-~<M2kMXD7;L5%!7Ia@v&hyU=p%NhF^|MFrhcK2-8^Bb z=x#hY%4Y}VsZ`U2#=5>!?D*VSZrwroV*hJ6n3BVGn+<Eev1y~4bcy7gtr^TdU?+Oo zNE1}3?CS+<SsG?9&gyX;ab8DshVotmOzw*VyP)?-AZp`^QsIMp)Xw)~lwcIm<y;kx z;nah@+f34{(NFl55;sy|bG`whbQ`<h?eV3YyW5sES4CO5))cp~enOaIGeTz7t*bI; z>8R8`_USb5{^{9p>4tP~W4dd-M$p;n6i_qBk#cb;qCOec>Z~MS5DORf8A+#@k;*|~ zY7|uEoc^XE&P(`Hw2e%2hPWt9#+)Vsto-T7{X=^R%Z^H%M+#qhD@p1!g-5}C<`K62 zeXP281j=rb`b_;w`ayOMh1YPa_vty$YL0J!LBNtN$T*FaF)$Y8ya^w!;0eO+uytMM zZQGM_YOm&7{WHHI3w!u~mIn|O`Z{5e{caRV;NaN76lQ0;hI(UWI?lY8ZHX9uA+rCg z(>N5x7#!hih0!?^+O?Ugw7*m^Kv<eujTF><=ivy^fJ~R-dJ9q{-Y0mRk~>PU*rvJV z)2p_485qzjrr+X0JR)%;E-Ty3JK(QdY0_IPd8dey@A&%;V{Z0WVWbjat0H+fFfbsN z-wJ)obBhkhHY-Htj@-ZK?U-9}_9k^*cdK^Vqtn>ZYGSPFa^1L&S7Q*7L7Coq89A~l z<mBGoi@4qDeE2%$1ScqV8aioAH)`s|njbh)Xt_GdNE%&DgYz^+XHy)#)BwXbYdNrq zw_cR$RD6h9(q3`?O<On?<)IQlLm<l!!|i*jW%alcJMk>e1R6*j+f{nM$5s^zV;j%i z+@WYi%DEwGC}!B>fP3>{`+6i%IMnW*wRTe+0WILiy<J426&jR;*k`|LM?ig_t;fd4 zL->ot%$u%jlzE#DZs7OrlbHXS3$d0z{NIN#fFcDA9Z7mX1KDbs8#XjU$C-^T05)+g znNyr}Tx@>*UYHE}`cRxHY*H0nLi1<RF`%>e8g)kgXr#cc>%vhSTPgYCs3rsv*_k0& z>UH1?9~v)|5Wkw7h>eSbm|YB5KKI*b5k{3Oyh2L)z!UoY))Q5S`S>VE#ZD@=nbcWr zr<oWD0zWXc0C-A#ISi*;abBypS(b@6ZHYiRnWk_^UN60JBa%~L@Ps`e_b=EG-K2q- zc--pXB~xL5xpAGj%_qeY8Vxz?m8#QhueI@esOD9GXbv>0yQe0f*0IEe9C}xEeu=GP z$fL%ll_a1wI=Q~rm3fo{cJl9fa^~VR0VLFd0L`6ry1iwtB$N%v&aW31_%<$(mLD@x z)hrVb)$XXLtO`Y2T#V`eQFl~|%M>f_T5ibJ2ko159g!St;`M)sIx~U3TYsyl=nj50 z-N2X~@Z}FP?mGQH#F&4LWAIvmL-SPwM|wuzt<W;69}_i=78RF}8wK-!s|HWjGw`KE zUbU0?rLQ=1ecdDM#12=Y)mr%=JM}>#R^Xg$_;3V`W~z#|Q1h&%lk4Sjn7bcpN^XV1 z9S%ML0<zs_?pVbd?8u{BWN__>Bz@4`&BaOgywl^f!QO48JVQtDjV`*=SCZ4i8Icy8 zbMy$CA-KUxWuagUHMiy3vDK3w=i`cM8;9B)&**gU3)QptXLTvuwQOR4Ko=lmH&dcI zN8VxiPI2|$5Qg?S6OI%76SRetFBQNV#gDAmHR$T!+7#`2<#O<gjGO%2c<Fyvq8BA+ zv=EQqOMWEWn3|&iKIM;<c$ZVsMY9`9t$hSqGRWxYr|&yQJ})%jBsa}_b*oLF6;450 z2zo~Hk#1XI#4t+ni9SjZLT&je&Ix#6T~vmx#Q*$xtmAx^-#`f(b;QKd`MKxPMYeOG zz1el}f1In1{C}Mo_*a&*Ge5L<$dX1Qp*^w3VggBYHd;~ldJ}&;!k?UG_@;s0+`Pim z`M6_-K-hkHU62Ev;~liDe4ldvH^q#sr;IIaw#f&jAJe=@F8u~4?gRe=sxpJRq#?ul z=OQ9rll&<fs8fP^Z`UFvKWId2l=KLr-jgY>pa5KPenI?$A7?KH^6Y`NcqR~<69CVD zS$kQUobPE%I+%85p`Xh7th6SGo*>R3lEwblQ|0hiyCcOMi?s)I<y*&bjJnN^QFz7b zYp3NZOvY0tk8-X*W!A%&oyPRgPUwh?iI=i)PohJw=$y7T1++gjp|TWZLj2aolL#IY z^ms?R7%q0C=a7w&>3(_H8O+g8V&lu#kgU5yPeDG~9Uz^*k-pdP9iOPEBzU|C`o@+} zFi?<IBw$fgK0;xpb?fS(6lstT@@m6o$nw`fN@?;=Gk2fhhH=0ZeI;Zq)o@pq_)lGt z{_sC%EgqE86fJ%gW0(t5g?7e57D6~g@Vu5R1YI8buI0if-@J(GlneScvH(;|=c!ci z;v0&GnXP)cheYo8s5riUI`<Cce~Xb)o~|(N_C?+rmzlJoMpqsnL`Uc2__}~QTO-%K zG?Xgc7(bYB&=|Vd;;GvdP+$RKMxy}lzIWC9%ht9d3K+k#*XJ^>Nk=u~Dh}h8F>Vb) zk@iXumIAinK$r7mxbhQ8xt>wmcuxE42Tj(e#RMtCOI2;h-rqiWCTod$8zxo#m@>?5 zEtrwaTe;)NmAGC|8XFrMPU>B(KFhGpj^&@JCyvtL<0%@Yk<`~ei2K?2y){89P>!$f zOH$trxq@Z3R<FK;i}u!+yPdbhjhRfWi&>qH2l6{utl2IcVxGHZYNqf<FwdP-?(LpW zs`+hgvgRsj<I}Ceki9*r`-Du$W0wE0Wv%>wMhLR_zufrv9VylFglt26Hi{4W?7nIa z(V;qLE@s@EGO0fs09Wuu>|7nL)qD<_1H&5ZiNf;w3#Vb45KVW=5OmE==))!&&)rAK zPBOwg<@UF;RUUhG6^$zlSpj`M=lgrbmChsPan247zg=_hi6kUU;#N0=B}RA;T6lF1 z8gvM33J(Dt?Z5_gwi<6;rh4Gbu&E4rIvoqhdE|kQZ(3guT<MXp%9N4oK}?KvIUFGl zy1pLK^{AdE<L6xXk;0=Z_39Tpy<@4z<uqt>T1NXq!U7lcdd8h0$6csoxu2YK|GeDb zlS>Q6I5BaVaf|4)KA7LzTURJp{Gx$hFRrbz=`EWuz1lqhjEqQNe0ecFl?+4KorMrK zpzpcP&seLzJ19Nlr&yg4%gs06f1t91fjW)GI@gsX0ktn|bd;G4qHyXFE)!gw<1=pL zcl2~1=y_k6Yurt#VY}~1{1(oikrlI+OR^OBf2IhI;c`1$(H>Ybq2^(6+^9gDy4Ysd z$jM<h`wYMGM3!TBefGEeW~Q^#6O(L2K~FN}xq663-~-PZq-op2El;%ny$rI6vx*c+ zmSwbf0A}OyTf17gS~Wyjs+e5+pH}8f(K^~9S9mLaPfn=z(#i$~N_pO0LTQ0~eH4Sm z^S)h`tnH%l-NQ(9rT9HDYy3)W(ID>ftv!7iwUHzjv3KCaV@4T%HSN8}`HmnGo0TKH zcy=ae&(hD!^q7W~*7vzHt=cKcdV)MGc50krj5sOP7YatTd$u-JDtq240+3K#5}lX@ zsuBDp-wv?x!eJZY?Cr2GW?r}OE|d4Vy885T6DxIEARA&x0a%xjk>4QyddaXEFz*?? z^Rw;8c$F8qs#EOvY6Fni8TU(5(`VBA14w>(d7KNz$(*wID7>=b<{G9_qSZq?@x{os z+pz&&&2b6%Lt&W#(f6c(pSs%S{Sg4mhF@J->1e}Q>4aY`pyB5*KYEb=Ezc_|gS=NW zgWt;A`U&Y%;)f>*67-K$y%=)RKh)hpRc6d1tzkehz+4^oM8W4N_2dYaUfE=}#1(D= zW;`<7V4Q2o?=8(c1AaFOI`7+l4SaVB;y%N=y5Wn~zB+D8<4us4yC`lyu*J}ONBR1% zD_MK>9qjG_h)rka@eu5Oae{arZyImub1=h0HVgswD8y^bVsVizX;m}OOM5K(^r6SB za0P0bykbI^CPImFk#+>HXfPIaXTLsSTm=@A1$j%~DcZRNP`!EjVZJE@S1)5IQ|Ral zcYkf^X8(Oad&j&plas+k{k+p!?tM&P#0T|q9q*MR=;zO$qn`Tj{jQX_tKGrb(g6C! zXG;zmnWKZdY;z~pDnC@Y557k^d=oQn<CF({R$$aoiRvnfC3E(7GDZe{N$raG4ukW_ zdpe5nC&c)R$)f!}Ol;U$X1>C18zIOMO29FdtzX|KVA(sKw5ypj+)!U-nJ`#I6ng8N zz^j`0dHnbo_8hx6ZjtVvq7XCbyKh--%sAL#BH!WZSR|6+_ri$xd^q1XR41hIA1*}n zyZ<#Hu7jBjqBud+ktTAeW`E-5AU9Q+cX4E{&Ypi1NYr9-IU5srw|L;EP#mK3PqZnm z6t&Peqx0GRx@zpix0_8dd16p+ui?vfrAu?~{#YjhYQcKorHeDrp%tygPA9V02_~(< zuuuKmH#G9Nc$oR><>q$SdHq_QeFVA6SZAhZCvN|A*o2b#_e(;B64hJoB0t7{$5%C& zoL)hN59tiLjXm$4K`wkvWdM<n72-8`(hBYt7Z-0!1MdQBobE)?0?t=r054s>nwP_W zoCPx2&#fg!DL%744n}iJ>Vj3*n@{w`?Jm^`BteNw=F|~MY=k@LNm<9Ub7@?mjczJ$ z@5Y}T**gNy7S-i9z3Iap?0g!d8tdl2o{jwo$cMW#M4U0;p!dae{j@O7XPp?V-chHY z7-pD9?FfvEI;;v{3oHN^E#MYAau%W9iFK0qDX!n7gr*ON1@GDN_osvbiXC4S%{qH( zel4Fdb0jGFwwU`RjZb>d33N2KeaI{fH2Y{*H(==8KBhH^xpE`ve80j?ViG8koo!6p zJsp33PH}%?c)waMb@fTgc3Sn{q^HDIM=$&P8RWAKa2$WzL28=0mQ}%mubyFCemB|V z5l(GDrBlZ~SMu9tJRW*4cqmZY#?>73nSY@R;~2^JTmo}%Z*;c0)nkayOo;@U6;ncx zB>0oy{{8#t;-jLR9$tX-^E(kodfjt0<<Z5(q4I`>Uoh0Bx@jVk<NX$BdS>QE!u=)v zf(O(QElbipno07`&2CQkEsmI~*`W2t`pcJoJkOXJSpOeaUmX|q{(MbKcc&tPbO}qN zfFiAQFQFj0bh9*ylyrkAA>FX#(ks#+EU<Jf-JQ?g-}id&eLa8fzq9i>?=xp+&d9v1 z&`S6uZ}$=6cmEy|gBe3n8kCs4n$O3au&KpZm^-WVTa7)C;ji>ZupO#cG{4yEC9fTO z!>oc<__OC3XQo7NVzn-LBY*(m8{*9G)fpkq0lrW`T^^f(*gR$sEsc$^QwX-nk*)xn zbR8mYCx2z0?Oq&Lgb3CxH%&W0>h<a7SH&X&8E&EqMtSfU=L}2nvTNv4GdmOUYp)3| zw$GO!bi}6Tf~LNwR47K6u53mYhgxDgI52P&bHgR;3vAq`0Wn>!H$ZQv>}?<aALjf8 zJM>(ERDb_45Mg$olf}8R3^P$b#yW6s{lY7<FF@JhTfLZOCcVh^e$kCeUHpY|MF~c~ z(lQ?pYZo%^5GCoo@PrG|*Y#>+1<dy(Vr;UdC7G;@Cn_FVWy5m($((1LB|J($+^fX( zuR-pvLZogE^u$jN86dkc2=pJ?TvE5cwFU+UdqP1qlul1Ksa2k!x)8JrZ!|6?>O>5) z-VEU!RW&rE+@|b4PU*uMR~S#dNlIJ=@nmhi-U9D5<*@})C{60_(w|KS3%}*p)#dh# zmlLUizSv>^^2C(rG(nTri3#HO^=yZJX?N3%Z><1tvD>@cK=^0OF2dqyx}nfd-5CCR zd%5<pqoma#M5i$O#({J!k0TJB4YQZxApPfb`du{eiRI=ZeHN2I0<2$SNkXpR`-3Y{ z%cv#Pd_lWLz!k;OrQeodr@WemT9xw(dyRKLwO}s<*XX_@1bDM&iAsG5s@ng7&9|p& zZ~x8t;zLx<6MU7{oqAL`q7Vu$rO69JBkseqA8eoJxyXxL{Ptj<w_PbHn|Y%QB?5+f zJXxK^6%xXk<~ecW|NhoaRp)?!_)hL2|C5GJR)|DoN&p^ci<6Y5(BH_c5gdI&QjW4i z`E+oc0$iVJ-Y@tC^xZ-pxc>Cr&&k*4dT<1<n!G8Cm^o<uUK0|_1PM3hqv-?k;B6@c z*DD<X-Up0x=JY6|Mb_~<4?M-TOQCR2O^;GjMuaDV^t0>v)o2S_k}di?SQGu17H1ac z>l+V#DJ*LcRbe@`7%Ob-Y^{#@`+ncHTsX#QWInTQ{dk=@%YJhtpl!Y5=XRTl=RG@; zBVEgwy6l4dKr*8!TURidk3K$!XPKbAUhpA>%gRY|Y*YocFez^r?zJ~<ZFshGEmP5Y z^?B9@vCE!fM`1ZI|9M~f8h*cBHQvvd`6s|EFaAGl4^Tcjj~B(8+*Ml%cRWaW6e#b4 zVPrC;N713x_TI)eQA(@|4Mya4E>}TPO^9y9_xQ2p&qgvQlZ|bYJ4pHx!QHnISr)dZ zS)~Tq`9>c1kr%ENOKNvasX}8_M9wmcGrj$0RoVsG#b{1vI|il~qp=5NwID+bh+)~Q z?FS5&V!}edw87<~b2SQf7zib^7bqEv`wXb8r>Cdwk=wWM<eY-$6Vdznow{?QoCJq$ z#3|UqJ)JF(L9>dpf>uc>Q}u+MqO1SQueP8P9Df&LF$`!bbuqj2EkX2J%!<om`-B-` z8}PpR6^~NZm)81c4XE1(RRjTdY63dnN?6&pB1}{*zUu-iAq6gEvVkI(+<|>oaV~V6 zlmZj@yOe^MDbEYC91sm!MTr+{2oT_==H2=FwM;?+h09<N=BG~~f(^62_sIJ#P}{8@ z?@HI-ujV&DxBowp@sv*EAEg$EM>8~iow2tjsKzj|Wu-Oaaj^ZsqE5ZYMB;Px6&9GF z$*+_j92N7}dI&qXw1K12j0Nj)>bDR8(n1Pv63^6;*4f}T<&XfRmF0&~?45a5_UXE# zuvWe6*zf3=pl+C17ImuuMN^crj;5(QQNCI6LB|A<nRIl~dG?U?ipLL^6~4jAmWun& zYpe#%zL3_xvs85xRk@RM7+ipO*(cLRW99RjJ2cuvB5H>t+(4CCuZs%ULNfaFOU#c` zbYyi%5isQvc;13^>qr(+!3!BdqyWq3@z8hdqp@gfni29J%VB^5ncmRn8lTOs@4_sJ zViJ1#%3wM7FH6f!V9fG6HwkbFy8{*CR4;G)bYy`fVYpfK2h^=qRASQ{LDCrM;2ovY z5n{yGXC}Xf1MY+pC@6?v6(lOObmGHQdd58{BY@si)33)di2eIJ3JpKs_k{#+{w6MK z@*T=|crX4uplfnA&zN~{%i*@jF*jV}oDgUW-QFCg1Lr~nukKQs;Kig=3j%v$_UMX_ zI<8AG&e}9^g(J5KL&c5$0LjFKtk&ibqDgsW9|kOtI27x7O!8Ld7<3T1UtxcbwYl(R z1r{spawqk?w#{zFx6Ux%uo*m23@ci4eUl;6l)aVDe)Flm!G50d=fZ31-h}EZhimDZ z9kI=8t@zfm`1bl)LSq+8`qU4S*=A~=7p5)@@r+d-a-8$)UGTjukvUGfqP=q2Jl#E} zK|@s@P99#V7FD#(Lsi#Sz?4<+hfMMoSDLi8?MLL7V_y3^{22O(K1#O&cx)2ls4ch6 z^4u<(BO$1afy`N7EP&DVPGG1J(DB?;gCth!=;J$~G~M%8#S>ijhq8CrVVB-ff)-JY z&=SNBQGny$v3&W~{@H)9SRkX{5$8^+D@GSJZtZa(^A!sR;saRUigrR0cT<Up5KJh{ zz=aRM=<_^s<s>*JPRY*ps4LlpU&gJ;P`!$5v(FnOpNeqrS|T~|AP>{1OgSK4_@JZf z)Si{sj!f}PSMB~j*~2%Tti81BNaSV5!mSC<X@=-&4bmI+0KW9k6q8gn&!sJ0<0fSb za9E;F^mKQ3o}fyBZ;7z`KZ)B>`_=y2h5U%d!hOqTBJ?JDqK3T0=3B$dWkA}Q8dY2U zRP8z9nbL0kY{TrW$fRd`!O%l=sivoyMsD<5uU2Yih)Hr*ZZ63jTTiJ`ma*ILr)$~W zd-BWD-m#fOb12r@ZuEmmeObO9K&~m{LBbeZ=f|zSm{67|gb|8h|8%cRiCMqgj<c~R zS5P3hM*iu`cYI8vhwz?WwG3y*B@_pDXz@ICO+b~q#mKbV6d+$Oz~mKVxew~Q1(m)% zAxRe03Hk@3pZq8AwpIDLc@7bN-=G*rH0^y@`*Y$0H0PFg`;topDRS1Lt#>LE2ZNkm ztxU>H{gSWh@L?LPvVQ2|ew4~Il^)InH{ayldF0ppr~}N`0`iZKD&9!k5h=s&@a9jB zY35=D!>1eN)S^0;8Wv*m{l?>=y|mQS!JFS+hKkt1g&-chZ++m(Iy0LiF=xc(ZAYIU zI&da$sQfezo${#8N$vyEuYpXOlyAH|q^~c2$Fd}R<BWgCyUW1*nA6Wl8Hiz%c4b=! zqPw=k#5QX)WO=Dq&<A-;n4}!GvY%!4?j0p5iW_JzRPEu7c|mvC9Ji!PTdVE%Remm1 zW{F5cZeIo^Iw&|b6D?29eAJ4B@A;ne1RG+cZ5XKKeI}c7#{2Xpov|RD1txy0`6am5 z>Ady4%I<uxR+4UIEd|VlLJnHOUI4VpvFmEVd#4JPY+v|?Pb(6r{afO2p-LP88kB;2 z$L;GZ>$H!%)qCPLkhP!5a3+BsVTZNHb0Zvaae}18H*-H(Z!FNc<^)EFr+<yXgmA2^ z;wTE^Eby9|AHo%$0dY~4rq~7c1JcY)8w(76Vy&#+{(C~uk&?jsJO}ROTHa>=BI8_r z;_~6;WmehiO^rjTip?fe(0{E7g~_3l<<`_B@cXZMUJh8x3{vUs6bb;%-nmiw?gABq zPXj&oXZjYO%c^S<$~8@O#aGwa<Rq;1$3fkdJ|s>1f4nYpNv?5-Ts4#}TI;(#^VY9$ zf>u#9(p-Ly9{n9Vnh}DsiQ96oXKevkXQfCJe>E&}IhnH@7^bn+^6Babc`#LLW4Usw zo~d^v0kAiM#i;^Vi3_~AHU!y2woiAqKScUyAw)6aAH7~s+?-b!uiZ7og`816__=0Q zg-Z~rO(0zB>G8;s+6OQ)Ki@HvTPJngRjB1t;c3J}oi;d}jtMvA=%wvQjUJD=o;ru# z>d{n*HT{$Gy8odifBhdh7%~jpJETuVMp;_vrl6V_UV6r8AK#fk{BUKO32<iOgk3AY zuzJHjA9$dzH=F$+aOrpBzZ75nO~)qtVAo-!YT%hOw_gV(Q;Ro^pRO_13e6!h;D!4Q zNFWK1tpUC7q|V+V%DnAOHvnhh+#9tmm6nkaS>PpF=i=LJSSBPb9W96hNLZSb+&3Ff z9{hxh@`zb0$Z%ZkWsr^8_a!9BfzgKG8dtw3K-8OPYD9<Q4d{0YCx)H6v>R%8r5(Yk zV@4%U6@EP7=@JZm#^#eURqh$Dncbe899LP}Q`Rb*_J&HySaMq`|8S<8#F(Z(i>~YL z?x9G_Mn@c7;fqTA@Ww{e*~EZYm!c@KrHjy#@|NITM8iZy5^r;Y&;p-IBTyeP2F9~G zl#Y_s*ijBW=Me3#Yyr2b?k2n=^a@r=3w?OWuWK*qj5|J#ZJ9t@5sa8r>gDff7yap8 zeH!nes-|`{6!$pVr3qZ_vNtP$s0RU1i?t})7_QnQdDpOTnE}vZ`1^DDd=#gEUHRv~ zD(U=Q?n`q}q;FpMyeb0C6pquZ+iRcR+H9zYTDKEM^V|)NHu?D)-Ab##DVwX4A8B6A z6z-GjkTxzwL;a-&`Q;D~b+Ehex>JKS0$t1H;E1o6g3T`YR7H=p#tQ@WCR~JdeL{qc z*K^jH{zV;&SXncrUBgjx<RW<i2}+B8G8#qNatiuTXH0<qmX$F)dNprF?Bw*!<)F!~ z@pwoQ#je?8h5KWe5Pc9wpDmhYAz}7_6*~-mmAiP#c=tX8gu3jB<G5xUC!(Jms+4ON z&98b9jzrmIYMI(RD?_kRWl}+0)GC=B`zXNT6l|gLQG%)(8m>1Ncz(mNdk^Y-T_%!J zYJAVjA-Eb~Q!XO==(*m_sTkRF339C(3t&3L$zd$z9T8aY_9K^vD#acDo1eXWp0>Nk zu3iMLwIrqTEkafwI9NM}vYNf_8m*sF;;TJDS(Y^VnGzfOGR3Sw%p7lLk$ZRju=_K~ z$ReUYPx9r@-2Z4|OK;(=6cA3`sV9|F3TPFej}F{!2hu9IW*H9ts8@MPI8c?Z)9bTk z8gJK<xL8hDE_maxT_a6SLa8b=ljY@5Hi_|D4NntNe>7Et1EjI)OH%klZpzH^bJ@>; z<L_qCW@MRXD!3%e-ZHKPJu@=}2kYAv!T>;u#HnlQU70r5z`y|7mqDw>>*MoLID$c? zP(srPq!U_S&v<<f{N;Z>H#n2~2({ru5QeRCrkT=OzgT8~(6zglGnO*Vys48Z#2qvQ zoUT~lb=Ou`zWCPif_;3-x>TmlCR&Tlu|%(x$ZYI-5Yicx`w-n&urotT{b8P6rle=K zYZnrOj{fZZsq6HeN~7Dt{6@=;@8}7bt=n7P+lzOW*s1y=lEY#wRbjc|1*E_svLlh{ z%goVaot<VZ0qp)(Ig6*Mkb%8GV2u@JrNaGMk!4IoLC+JAuNi^5{gjVtXpx~9wAJvu zzm=2I8v%AC!@A71QO@Ndg@#nz%&R||WGwZ6)B!4#IxvjE5=-TQ$McM=-43xBPhDck zmvY9qGYekY74_&ULoCjm{*<E{8W5RGt7w;Wb&?YZ!F*joVnxRaF?`v}5jSofXDdRg zkVbO1onC|s?&tx!k#f8iD1SOHbvJA0m9Ws|bu7k&;M5IOp6Ehbv9xS)UBzwNU-I7U z11_AWp`>7AzQ?SLQf|^IdkZXml7;O4yKI#xFKyJqXSKm(nNh!p9<Zn0A>|EEa%y(A zIvI4SKJV8{qn+{}H+8arPm5kqeM|MO<jh`rz3MVv;qMBS{zQCl?${BpzwJ8(yds2` z9g=<BBB;>7vE#nZh82zP3(Lrmd5<kp)suubgZ3TI_M!HD+tbQtui%fTshws}7T6l{ z?xIsP#Jxi87Im>ezmkg54t|0Q^NgQ2GkUV>YJ?e;<>=!RL8_`NDb#(Z#E*Im2AZVB z9Aio<8pEw~!0FS|(<gVhn(eTd)_ygBzmOlTC~e$5G6Kc|ulq-w`A@C2b?{>wObn6H zol-`95+S_Y4+SJ=%n(m#7Qku`W+8Nr^PefD#nM=9KI^PbF*2Th1(D)ltGaKt`Lh&Q zeL=nDJ*;k?FZetUEr|}X0y;YQ#R5xjBsvO$p$Ehh5&P9sU||{Y;x!@uwhM}1Ysvz* zHTz4x(VGi$xup34&AvX6(-?$}9jHPD2<uSt8-nmL?d}FKvVTEM$N3w3Ov~^={bbwr zg~i3g1PdZ?)qgHHNnTWT``TS*B>vR2qwF*A1<rT`SI#E4#ZS>}bH5Y?uw~2s<YrG; zkvnUu>o^r{FQFh_a|xs1(1^<!gw6DX+Nojf&oqXVR5X19^OMKRH1)>2@Rs>fHq%6S z7Wzw~v~IJOuQ`->_VC!bu#q`@F@tn<Y$630ab;XBpo$o4N{9s+K6ZECm)(tEV~!Jt z=L%C08;W7sbH?nH>J2A{Hv|L(C+8%oyhaW9y`|{FSKXd00gadK|A5ku%1&-M&Oene zPey%seC>(Jr{?%x7woB#Fz;2gb=d%%y?G)g&SM@Lu7ls=7Zt(>j)0NIo4es``Ro8P z?@Ra8RKvJO8O4ig&50jfy@WdqJGei-*=r;KHnm@5$_B)^G^!@XJbPhFwza=B10{Xk zU?=Or<bUh`!lH)#4&%L=>TLa*i&#WAN1YGq;;7$M4C3Mn&a&LgKr%W#I{F1i4ZrQ3 zkDJmZ_n|0}jj`Q;J0k5%%H*NN_lUl?rSASKRPvnm9M0qM&CueU^hK#H%?A4|SpO&U zD*e@|Doe`sb%u(7-{pMC(!(HHS03>>?Mm3b!T39Y#dp^~%P-wbLRG|)uTsaz7vpM@ z7h|8sqc@Dl)<xv!F>yPXO2$~mR!njr>gCwwotFs<4CT~YLlX%Cofc=dr)oSwgRB4~ zim<XLxzJfgS^C|rL2pU!;a3EWv44W<C-$Edw;iQLSs0ewwc#y(x$_v<Hx0V%A9gyb zXBvTT)D?Lhth~M8Updg_xR~qT5AehA-qcwQ%js;4OQNeGF`dsB%FLHY>(G|Ds1w<v z|7GGy8tTXt{&CnMDx&o(A8L;#pS;I{jLf{NK+V|oK%zbQUGmSwhv=F8R()$Of@$fh z=d5zp)(>(nx?z_g756fpvtVw_5KN+oIjhdf{G0qc=H19MMHWjJK-#QYQpXaXR!XxV z9scN5bFNO*3_$6;9%97#l2>7coLoqvK(J$Gm_V3O)*}-&y+{EWmFRri{3e~f?K(~> zg)%Ke)fG0AKZ`h6J2MVJG)l(3QjcqA?JfuJcw;pn7T<M^<5dKR?OlnBs6y3tjbAzm z(M>hsMGbdeQY`8T?%!f{jEs(Ubj9A7ccoBSz)cj?b7XoVDE8?nN*m{vXu;>hcRRy| z^Zb7VUzwX9X#X@p>ON4mmq{fYpKGIibbEJkRD_?y%($GSu^Z^FHr7@V)fK=Lma}Gd zh@s#FX7;|N`6<lb-ZwttXFEmE$uFioWL*^V-cZA?8EfLKL{OcBRX|*PXkb8fm1x|t zL@>OnN)T;UH9Q31M+kSOA1kTfaAkXaZ=tH{7v9b0<RF>Qhw8LXNS#~**Y}3~lTrOC zQQR@@7Yt`WL|o>Xcyf7k-;&Su>I~Flp{mee3uF@kEHddzO|9+m`gK}Y?xwalIj>fU z<8WJ3L@@u(U`D1Hx-m4_U2$k`9=>&9!<A%v#AAnKC4xVZ$f1UF>R`aP@|6~?BFxY{ zHypb+E4!V_01*TyP3>io8yhBA4X}n8__k#PYKcvkRloC{?`|fX_=P7;Qlrw%5$iza zi*=5#$rx>GlL*6kpe13f^cgSL1XtTW!NFyi1?QU4A0qk9FY!NJjRh86vxtR>Jl>Uq zp$~D_z#&(Gao9Luzk6XO!}Rjt*-h+Quimif>@}8mRi7BaG?z=UU%ta~jZNdKu3vuK z(hvW2Y41?BNbr5^5)Vykc;$ef#8UMuui8_Fs&OcaPGu|SV?4iaM@!k6V#X8Ycr>Gc zRhWF|Zm(p#J(%6ppi8O|J6V5j(v%W#k^kUQ@qQx`wa8oeV*ZI%`XEY0FQ3uAd)2(X z#;XZ^&3kIMU)jG+jq<B7N~tYi_l^DyuHDiVzFqrmTDC=cqIcfjA?<M>D2zPhP`B`d z%FMI>-dC&K)rWmjTI}|(?`fEey`8O%Z)Xio*kr9as|oewlNqd$j)Bycv6P&N6R0bi z*cP^OG?k`El1sbpOobnEB_30}&i^ESjYFy$cSpi}!<v=FTNsmqvU2j?E&~wtn)$h^ zfk5{TW%Pf-d$gqZAD;fQC^t{%ciGPU)~jl{+O;jHMf70e<*#AuMwhCP`_n!qZ4Z(> zfJD+qP;9#=QIvZ~%>ZzmOGgY$?!D!`TGsVOUq46~O^d8JfsU)opheu%Ky%&>N-o<# zLCVg-!I`W)bp-G#;ZX8lu(tA`MuRy+Hj@{=mX+~7GTW{mF2Y+ptFLeRq(Y}?53Esm zTIsxkv)6dd*LGGHFi`iP{87fBCLH3yB{Hk5lszfaz3POrTOm#3v?OkbenPeDUvJNr zuO1pfu<(Wv5wWx(YjbE=O#C*v4qSoNVw-f_)s;H^R$wvXz;C5mG<xc=beqb~T*d6# zXXd;+xy2)+wkZ(d&FMI-BZ$(7FD6;gw+-<7?Z&2d&q!%3&VTG}m9>>xv(5lZ7DmxC zMBgyVV)lNl^8C_BrV#3X&9^qz&u4e3@g1!KdR6R|{juX+lwiOe%71--#^~8U`l5Uc zzS$q_(2abBK5JVxdW7E-!ab3+$q{B;aHv<>7{+yfG9lGGB!1Ha^Q`o`oH^;WBsiFR z>s5+n-PG=x60j)T_0v`Mg{e1Yfi<7YiE|W(*ErwW661VS<YD^Lr+u0`w^@}`D=U_7 zxhOF%?KlF7-WVI_=^JAO@otycI|fig4?LPam9#b>T?895*q;{dhIk24HfM>Pw9T73 zHt$k1dta3JZD~PYXn-`>b~|-Ff+??ERqw_s0}PJz=wa`OWNdTNFX}>@9=%?B6*2Zk zbf!p4<qhyzaw5s___?2Yw#4Acs@I31qJo<rGnyjN_1#TFL`bHD5#ujd>g<7CdLDyW zV$<l`%-ykM5qm#|QI<OIDiTuhXUO+Y1taTZQ|}s0O(m0fGX&`H*aR>NO>v;gd?_nS zigyC_9v(A2(%>5tln!(tyngK))wMhLZ`Emz#JKzR^-pqFyZogK;5dHzAIWBtrkgrM z$EJQh5z^W$<0Z>^v#SB~4k(>+yN^{=xw)q6nw{8gwDM=zeH_-S{DefE5+$-r_~gO^ zYX(kS&C$hOiPKU;?WvoZ`Hob12vg%jWRVud!S9GHZrL~McJs$vAM}c8b5X^x_@<x; z_qmkRFv+|>3u@BDZohCrR&4^cn(VYu%!O%koErB1jTc4t;_BowM7*;oN4Q)?(brdA zZhW4-k?7M(_n9QAN_hA+3h#L{0L}-Cb)_bf3b~cf!H#V&=nH=>7&7_ZYaRh+tvP(2 zyk$OvPfaQm*@rywl7DYQu+YS3Vvf-P<e?V#xRJ&W!?+b+iW%&1l`x?Od-2^46Xg=B zx$FknO*Mc(D<XDDIHqzKuq}?ZhopW3i?yJhoB(Oj&Zn1l4uy{c(P>nvekhlUb>~$C zn*d*k-;7L0$O_3B-Af$&`nl+l*BW`sAnJ1RlWeHv9$XW&=$%c8e{6NXriUf`nL&#u zStT|{#=Y8x;ZM%Xw0!ut9-Ux)f<F80Oj#ZMw#3QeIbU;2%>DS1c)66}S^(6Fn<B?J z#k5F2j3v4YV7-*W^k#@J;Nf`9&k_*p@GaI5AwP7E`~v&quS=eZL&5^eOuM>WF2b~j zwO(6n*+>yJv=DPgK8-4ExxhX3sh0WQ<H@M1=%hw__)fB=h$RpZ@@Ygj<BIM>;>X;Z zx(2*ekiF!r33o!RKkE*n8MUE!<Ir}rb{}0*(H3vdKJGM2!WyswtJo)jU)GIR2!6B4 zwzE5!iEnsub%$RRZSHIyw*s604$)WW&J|`br7_Q~KB0||Sgk*+_i6&9-GzlaH0PWo zdKhCAf`h&~JWdNjtV9@JizSbjafE6W1n&ucVwh}*Z=Gz7c;@d0)|3rLYn{7jWxB}6 z&{j!ZYC!8amtscw?<MrF8JZ5mfdOhLdn%&dPlD?Wdyw7pbiltIjp+YEOz)3Uc=4Gs z{vuVny2J~kvrcf&)sQa%;V$RFq`!Y=>w9UpcVpab&(QDp30o#{dI<DqYAOR;+-be9 zyiu@T%q@Id2i<r>H>gRspEm}UMnl!S5q%LK@MfMC*{XgGvRihtvJ#CqdvLDz^L_M_ z8M!z;R01XaIslp#Fmu=y;GN;HQMA`}Uj1%O_N(gw3e%}7XXT27%wBFHyjPbhT()@u z;|mM$k@KFPK+D)^eI!M;y!;ltyWmx<+DrS09w0&8W`VVpl@~JWdm{JRhOwmZ?{^$L zK6vJc(59%cp_mvi@$Mc_<U1!-9HX4w>xqYPW%Z5=L}I&=xCwKI)+I9j^=!oY(EZ?* zV8qHxa`D=xvw&Q}nBEl1F<h%{tIwBJU*|W-^i$;&AUB`6QI*WNCR}UYXPfBIp9Q6D z8DFo$4MqQrZsdQX+Y=tIi{Vw=V(}n3`Rz(%VMR$qyMx?lh@Sz(_Uo@?remo}=TC5A zhp_qj6C99gM?g*}O^v`p;|*rgub-nUKgWk3L;W65XJ}~oKhkanwZEG*BODkSTD(p^ z5jhnJkf+)4)<HElNXc-n34QA?-*Q#I#Rz#!ysM55x-w`fDip{cM?IQ(Y*A1Av^2j? z?Q<gEpC{Sbtt@ufd2gIU2QYJ>v8}!yz{H!d&>JG|Coo34H_b5-t`TM4H{0LXb78%` z;_h2+yBt4caIQyz2R{nEQbg2qzkfgUb|i(Cu{kY+Lvs?y#m*S@fowlZTWR{-Ce|Ex z@6B1o#u_8|Swb<4&<ct2=DOqCs@Mb$?N~Kwu9m((q)Qn~SHE!~i|Pot*J&R?9r2}U zJ3!EmUquS+w;dC=30|P?ilJ_kTone))U2-Q{nL#5_}}1Gg_DEu1h-3nR|r7q(OcS3 z_nwTI>Wp{%ss>s?yiQ*&1FcC+f}!ORtNzwF%nTo`O;TF}-NDi<>RB(cz0tjQc~b|0 z2VRdec_yM8UT%-5YiLlE64`CxnSILFQ&dzu^kX5LYUqk&GnT%j|MjectYfft#j5!Q zmR45B@O|dig{MGRm)WnPF%jOw=`XBm-VGFmMEiBalAiX+Y~Q`*IK{SJ4p39vU0d4* zq|f=;mt_4X&NpA2nvmV%WuGs~qG5pWC0C@F?>bN0!qZ2)iU9?bESB<yl3{Ik^G$>e z2ppzouW#3s7b|0@+7#&Z6~3s_OxK;iiU(w05ao<F(Z-loS<?zh%PgnAzUz%|w}_bk zA+^&xv$vc3Q|`d~iYGC+u5-U}A3Ry+AoO0ULt_>-o|2ZCiVG%=rW;t5aCCH@{xghn z`Q_VxaCg~QzE4w_(wdLQ96>qGW$SlX%JLz8)}dp=!bI0$i}2m%s&UwYe@T1(8Xt2r zm?3G`e=}NReF<TC;BR(>5duak#<4&{TP|E_ZQKr3mOLH9&K{w0tqIlCct;hfEIe#9 z1YS27mI=tn1U+1>?tH?~=}W4i5MHE$H6sCE7ONBS>cY$*zw0z_iP&Epyk#t|sjH7( z2Cx(D%9LIWPDa*kBaSptGY>nfBe~m`sKvQX8fIM04z)FqoId{PDR`GN=&|iGJk+xJ zE88x<7R4y)&e6Ot2Q3p_3Cw_kuy*3*y=qNm8?R2n?)9~0->klH^R1AK{K{=oH*#Z+ z%T>~2`HY2?vZ^W%q;H$=v%P6%*Yx4RtSJRkE?8aR+{j{$d>haLUkg%?;(jw=X*I<9 zoIL?G>c{fQzlb$r|N3UJZ+}|vK;3eHOG@fb$z96+A9;^=NHj4q8Ko$FK|9m6;+<uq zNkC&(A!~osQ$5VmDm`3YMR>ntiO`>tO`Pw$#PGAmx|1b&<%8yViJ6-H!qlI_dym8E zO7#o5DGqqw(JA;?T2?4n5d3V{HL!>m$dDHt66*ADP?YfU<lO8Dn3qmhORpTEZgib) zh%cI$Z?-L|B^3?0#k@&F9;kE?2?2CY41%lH+(v9{v`ctyS}b9rdyVI=Qa2As4*N13 z^9l=_tFlfVH87cmyA6wg+Y&rUnYT%An`2R(xBm%8Msm=&AY=apx1xzpU7U$4`6wwx zmx#|012Ahxe$HEJx8Q0gDeT0cj=<Tzm~`c2+cWWZ02(byh|3p@|4wKle;-(8J-t=& zf-PiU?_l!mF>C6$EG+dalmT>uWnwa@b&unP{7Gh2P#BW)a$)vPG2le;s)6Ni;&AyX z7mD={tut)NF`OAQDIcg1(7dI>TMUX!#b^pctH0EPW+KP5!UH_a7!n?c=INz#b)LUk zta>Rnj%nQPg-`GkvHwu^hRo$eEYYZ}k>?`hL9n}jiB5rafo)r5vZ+Y&P0#O1+#$u_ zopA2{w_lzq%aVIPQwTjPKTX!I2{q#JrZeMOxv1gS%({`WS~BU@-tsTV573fPWE}xF z%)o|Z9+99oH8)*cptANaG3oAl-yCJma0sqkt;jpEEBy_Mw7fU`5wU?<HjvzJ>E9XP z8H|TM3eml2wZRa3Wzyu~;St|&Md53Zjit`1VV9vA@=+5mQ}U+88ZI3u<`DNIMrlEy z1M$$)A&6Vd1bpJ3<l|31+%gBeFoXY!*60I<27y)0$qUpUw`WWH8Z?0A`}wgy;qJHj zYDWoPq)LZ`*nw={n*33uNgn+tWvQ-yC8hmla^U?P4wZv;)+T1q4ENwJ9up*^?HT$w zEQ6S{knN-RBqnW1=M@Wt4xGJyZ5SHS?E(E=%_eUgfOmmhRR30jPoHTEGHo9=*9Qf4 z%ArG(=|zKX%hb#n)gKT|*d}$}NIkUQ5I$+fXw%Y=*VI_YUxXM`H)iYGjya=lIuqwP zj#~67E41gp_*<0Rmzz@?;T;vx(ogX4qb0QB_c?{?^WRXTTTZpQJ~)?k;s@Su$*!ZI z0%hi)?{Nf>>b3m^4D1QRj)8gxyX4P4)zX^!;O}kT0=cP*#0{~-89T?OqVKm|JG;}y zQ(d{OhEfL3&9}j)(S_upR16`vrQ!Dpuh%EvJ3V_@`xw${D!t2-%vuk{HH&bnYIymS zra-_B=W8p|{f&9legf*f?cfKKL3^H!pmAuld_45;poIZ$SQajN0Vn&if5XEOnOp$+ z9~$vq#3mC2NkT!x>(5jw+~XR-b^bJbfw61b$l4NX8+68_)jn)TpXQ%)MxqD(4E#a! ziKib`m~XrY+r;rIYCGhRVMKca0!OovKl>}Xy5DIVo7{5}26w!9N_pU~rE)u2Tako@ zgYu>7IQC~$oDyAK;&1ZO;seizeI9=(BRtK=SXjnBLulgPJXMQ)A-e1TWxfvnC{^3r zNW)B5FcS7d9ZUjR$5!>udvWpvPFSCitCaq0A)K-THO%bm>w6K6>T513whhgprf`i! zL7)3!PGzgziNhtYcJBt)j~V^X#ZdNax<w0L_M&ndM6uoaLW+{Lo&&0#yTS{Q{*TBZ zxef`wj)kF?a#PCK%_b=;9>9bzb#>OyggVT<rz&po*d9Z&z$h(xE=*rY%#dMfX8&4; ztH<D7mxL;qviK$1UfVVE)pdF)f%+FVS^q6cw6^`oj@jR%qpf8&nEzB8ZvRo|L~Np# z>kZdEo!=ANu2bt4e5VvGQzEP46_YSZ(bFU11KpZr0ETET2LbquJIt$L3=QU!00Wkj zGR})hF{zbyw-t#xUb>v;rana8ON9c-uzjeI^8C=?T5j@L^eX=gj48Biz4xdQ1u`dW z(KGClt6(!O;`!1@KvoB3*6YeTPX`4Br%XaSQU7>%L_nmyk*s4u<lX7V58E@Z6K{zI z4d?KCH8To?f@O~}=2y=JB4Hic7M-y_%1<5l?OrL9)5hDO?(guo?r1XKEbkwzEnJi9 znRsK<!J~D5tEn*F&)~srv(wjC`^GQY6j!G6Eji%BRD3tXgs5>?yGCd}R{a^^lX<$z zV%|Z6R@bBH+~J4Q9W$tPU<EUR*%K_Mi#-p9%+iP_f!o_A@K{Er^$)-UF8+b%e36@d z7Dtb9ao~eah+WUx7Rh4*>=<Toa{CML<fqxGZ~wOBh5pl$PahCTgz(nBnm39I`Q-+F zd8K5zpG=@Ktxg%1=5m|a;Lb0LZ7(dUwa(HeIIIH(EZlZ`w5a%ub7!ZAK<UDu<(*D| zvS{Dn8!4;W&v9nTn-(^47Dbf#0SR_!1TwCd;(iMc$b2LTL*~qvN7G~A6gP6=Tkog~ z$K=_^u`zD9%kx2Vb#a6QYbJ`r#FD*qp5Aib8L<x550St^)NB^2KlUjl_Dtnlc`f;; z(ICx}4|1C6lzn2T`S+}xwrJUlkdKhH<P196jo8oyTXWmKg{nhml&}$v)G;W(!Je|0 zK0@*@tI#t{Ry_DLx5B3O#K}Se`3!IN;W0%YP-%|<_K2=}yDd;`y4&@A1dyJh-GiLA zefRWxBLC=PGL4&8<EoaR5IuwLbLl)N%l!?1;9?|o4rDXo9r-ppOhX>k<z>;lPIL3I zvffw9F8<R=XEFV6h*d=rYc(myC#b}K(5V2yUQZzQb_rOH1Th1@HGF^zJt(<<S}y4$ zFlVLOkKz83LXy*Tg3Ux+E0{xZ2}-l*1xQ^hqu2qpFedD_({}w{Wjj5oh?qnpZt%yf zxtxCe!_-@8BEHT-si{e<U&8M2h&YSMmsUUE(}zJI0btx9#Xf!qeY^ElVl7rj7f?#w zeM_ljlg0cOG9%lLn-igW$DVJQ{_fdxBVS1tNiSX!=@TlM`}WqIxtiw9DsU1licRJm zBZpkicAOmCXx8x>+~En^*6aMUf{s&_GNw*s<dC$BXuP{bU$Q!lB5qc(#=3VnvP@3` zzl-=6$-WKhuG?!!LiJv|u~A~PX4h#53``u4z|Gd{@S-9;X!aXeCS>hw^S|EMvA=zv zFgp4c<)_?EJF9$|t<`9+(U0?oxcPm!`1|V3oNwY|Yj5P?zL93p#Q9$1f)sP?Zkk|Q z2vHk3;`wWfs36+cnY2@(lIv{Z1ilZa6Vyc6RMe@b&_vB%KV<Nbf5?ClM5-#l7KDbg z+$`<2LpNMj*jxy*ozv0TZw}BdDrQUiUB-N>njw{A8JpMCqNAxdES?UO9_B``B$dN` z6iT|RYOA&&v6hn{o!$%|H_I{{nHf^XSoC7pX#GCd5TveIWCOkrV)V^Ey4Z*BuzQ}K zi83@D@M|4x8hCwWvCTrr`yx$9l$UH`<*GJ@%^9?B>UGh&mcIdQGU}ExqeuOIkdiFi zDE2GI4H14BI;jD}2%Z~^P`<i)lpRwXupPjjcobgdwLP4%Vs4F}bxpjtqbInAX*Sz^ zAXs#jvW~3Ul?aFSc4NriJD-a;Lry1C4r3aiY1<Xe;iGY)69{Rms27|)qu*g-&KB{# zB+i!}u=R2oNHCfg%s`Uf6jtJzQAZSH85@D_lEJl@mt%cgrS*8Yhkh1rh|b7QpnI50 z4|@IvU(+CD3oz=Qp?_G?x!a}q-MJY1-d!S0PYkC$xy)#~*%JiIpe)t?Y^fMyR%->e zm(rT6K0S5-Q2$>L<!-d&(DeTbryQ;`JClvUvInjehtD%Sfv>8d;)sl0#I!$JOTeQm z+j>yxdB;g1^MLcAJk|W&tgDzu7a#2}Hqb>op`Qo-ojB3u+t(ug?{^rwC9l2BzUr1; zmStg@A667WMSmBIDCY|)bJj;Ql={4;wyR;#eTh-zmYkUN{==>KJDf?5aHC#Y<3dv2 z4?lXNUV@e~OAhNCyq>r%y_ikow>*-?0aa~J4&!%jA$yN)#4eK$0FGv6fhFZWG9d7A z#o-phw6RzRbxny8wzOGDA|xq{sNeG7q$BX?o=IjI@;o0V{QmuMRCEk`#SSZ$<J~ly zE;`Im71p3NhzM(b1^>}{NS!D>NxR#-C;183HyZt*>MQMQ61!6Eo!{F@T~+bRPMK4u zM!Z8|715?xyA2ztfn=~qYKeFndW;4m$$rsgAIdAq?NNfaJc8-3P@>`~E5e5McZ@TY z9vCLOaUJpcjF`{&mqY62qsHIu$LwJ)vSdfKrJK|h0jS!Q+NuNM?DmF_i)-o+Mj}1C z)<uz5Zp3W@=s-6?VN0{ipeo-z_Ypu;$D1;pkyqEpFr51bf=>GAe#_ko`iD*Le^=av z^?r%g??<%d5<N|_=-RWB&=%z?ZnPPxy0oyIXg?(_Ys3(i(uSz*C~U>{%BSS?W)aQE z>meFGo;AdVoep+5y0+U9ve(-eLEPcxHI09z>{&x=#CCaW`cm#t()64_hc}Dg6)C|n z0XJ~~`VezWIs7qpq+v?RzBh8uvAJC9iPKm;(Icl$#`Y!a1>;SGQ&4RYVf|GlptT@( z41f=!Qqy24ukhjiK$-XIJJ*HJnveV^Mrta>7uCo_0aGFYTI<mY?FZ!nOGK#sdiNVu z_86wFY97LasW2LIp3_m|-uaqR5}p6$>tX4Wf3d(P@4XT@0*iA3o`6{*XTBM&`vW05 z@_?Eu?CV2s%gJZ8zfFi_C5%^-1NxnHtP*`e5;XfQhpR-^zkcwue7rXbeEc0kvp{c^ zy{1`|ef~<7lFxQmP+WYi0jg7JJ`#yh<KzC0Hk6KsTWz78R-VBlq52vT9zRp2nU(X3 zMsuTj?LmjR(<JKjWv>mMInebDt!$n%`=QH1N7n5F)lIa;-dB+%EIRk;>+hG$3e2tM z*22@#P(G=~{-*?9+eQmNxq;3E%|r8zJN^l@mVa%h9Cm|0_bhXULD7)0-7~WM9?*Mn z<c^_BM&2-Y5x!WJkXT#!;FZ_NEaM0aiBm6>@w(z(ypy}^GCa7TX}N%X_-?HBkw~6p zuA4Nvqn`=Lz?7v(cjy|qp(CiyCpD&{XQI~Jc8QakmX)jj^lNnPEF8AebQ;o*B=`JZ z0?Xa}{_+nr^hQl)@;@o3-5^yKFUn>_46OSIsmCYP2HnkTpPcTb50>a*GXeyS)}j}H zi@|Bn&W)Qh#_}`b0X*WVEYzsGi?`2zJufoGx8R@{!ZeP}jS@`!{DcvPGKF_A?#%&H z#^gK~chqL0!vZRE?%a_jCRun{eyoS}zDbw-bjV0)#)yjVOM*<V9;*Y=lF1XAl5kkK zbyZu7`9%R*1!?WaJA8?IG_T9v&!ZQQC}t$Cb4Vku-L_kfht?)4z*L}{Q}}TU(nMVp zF*itxLK^s59|y@Bz9bFt8*IqK$?6-9#=ZLp^YcB|<hnT*`9-spZmz{jA%Li<1?_@k zmS*0o@`oZ20QJ?Yr1n$g1^sLWriS@315Qm$oPN=&&r4G>T;Qx%1X;E+QbeFb(x)S| z<&dLG{o-5Xo)7c&xh&ZoIC~aCws>URd#8%X`WqsKeaO)W{ttQ|4b@Ked0k6lX<ahw zz|;rMtTM6mcIY;Ja;_~MzE()8p*xx67kDpVik~qZT<mfWn_pcb+8qgJ24iZ>ys$8} zxv7ldkzs8wIGtLlY6Vx1BlVN9pPuCvylx~`RnKMiA&g;E)G6-%Uasnal~i3-^Vos= zT^;gG<~+%-&pN8Xhm-~HF3p_=<><aW<DD&jE4TaOzEu2}Ko;$RmQ0}Jb*vY`{pTVz zY{a!uYTgK0C-qbo#<F8{Y%I#2Q?^TT-;V)$QEcQrgneBpS@((r%!e|?fw3&aZbPK; z0?_#wW6LLQ8~0$dHOQMa&@3O;-a(Ve^UP;4pX&m3i85fw5**)^{<mjhr_USal)8;# z08sVl50%;wf4`xH1NR-NI-?$1sLK?$hIwsBJ|!|MKqgH!L%cP_HDIIT0op;Lg^#6I z0&Lrr?%Kh@lk$Hrn^Z~u@Cn}kpyJV8ml4*a2#=B{ZhQgL)I`Ylb$m0rkygCU<??yJ z%&E*F+J&1A8pq|1WuzZ9#PM7g?AdCu@Lj7?ziVeIh?!9VJu<9EAoB=$e_Gf@#2qMz za=sT(MI@x#<4*qWqx(I;XlqYdZ{KYQW$xdDRgdKfhp=JS_tIvL@u=Hm`^c^(i|Jre z5manx7?oZT=Fx{Vcs)${Lj7u3+ulH{*SeU(tB&HwZ`{fDOa0sCKsUQe+S)Eh7Wtf} zx#r=&(h{|~gQ+1sND;e_+zk0>IE4CUQTsPq9oFy+;b~!dlfs1eFUu$AAd(*T)*n7x zP8@w+wSp-ZRi1kJHLoisVpx7#>i`d4!yD|pO#>WG%|T$^x|M+N(YgyA%#L;ZkRqVi zA-sdmfK%RQs;kf7u9f1nPC0k0f@*1yaK^R$Lt^z!V=;G4-h+nf>&&@#S64rDOC0E5 zbp7tLQSM=#z5}b<&yxe)J^3tUg$!NWYF0n;|1ZhCbmQ>N{+Hw3X`<8BdE<bj$4S{t z`gDcXmOWX`4uMs<dwUK3W|QA&f6K+bC!~qaX(XjxlvM1$*$H`)E!&a}GHE6_pW%L# zb%u~k`StwGobA^}4E@}nG&jk0k9CvGZ)_L5Qj5{*QehHKxZ4qhuc^4f+_TzaNGpL} z%e$W>f)cu|^m&bkx{Y`1_*z<CVU$gYoe-so_NvNidD2-3A2TP{!O_MIbY;j7Tg!{K zMbq+)s`jJV!4@cYoO)rS*@CI*DJr{>S)jF-fVuYdL2w;%XO{6nwvU7tL8~Nc@X>NN z2ieSW9_;ViG+(%jOdTl~ziU}5oG-_R*yQxG1f2Y;27H<Kva7XjVS=!Fz+ddRSC$pa zp3#+pnVKaZ>5|P>3eygsqJRg}L?%KI<!amelE!5A$aI+}Urby$S}?qbh~cm_9BKwl z?4PoBXMFzW34HwT6X;v~K4Ls~@K`Gh6<#V|fNsq;KmEQ>4oFSGAqCj9GJw<Wo^UKO ze_$505A?!T=9C)lah}uH$pfOR3Xli{BE1t;-t*+^gQ!N#ah1h@wo)cF<Cyw21V6sR z7)p4zSM22XE-<x^Ic}UkJ#Y_o{XuR-Ed#+fsXh42smiN6$gu8O^<2G&g@P;U``Aja zNI^K?J(lMgw^!r7dFJ$2!jqFw=wS6U&#?dA`<A^Jgm)K%DXfPE*uAlV+gkpj&CkRw zTBdsBR+fKf4z+k$IL=kH=8@4Dn1TGDtJc5F`*r&|59d6Nxt0Aez4(6mpeg&XSN)-M zUe!)75Rb~#^3YWTQm5%9Q;>|g5+vBN^S<G$+D9lq<-pLuh3g0FnnTf%MNi<xN8{c- zkZj=JMa1+gjDOPe%&9-Vll=I`DrG^mp2F3ojbnwaaVvNa@%(<JYJ+=b*zw%QTcVIH zp|8?<Uxx6FD`V8?izU#=9UVn|j!3V7q;TXUJ$6*#tbkNW<bw+37gn<%6+2@Z6VAHO z{-jw!d=6$JkC?G~^$w8bMsYi)miiKJ!H5pG{q0=leH~nrM0o@Opneom#N3l{&AvA) zYtE&ZOz$?~Fbl~BHs03x?d-{}weEY<=$V|}WJfhWvYQfIz0YJMiXC#lA11gy^8lg~ z_67OKo2hJT6r0dy*51Zj_DmK|&V?pP7Y;rx=5*2}GMYeM*1eKSe2*LOsMGafG9h=S z%g_RhHp(dU;YsV+)pphH*)bY}Woky&%Li0f8hbJg-U*R`&<~P-LS~@&pODohKcT|( zXCiMj^xRECNX*XoH|gmLksSDQe8XQP=q0o!;v);qVfQ`D9v(R$ePzc8>lwfE4hx{~ zJR3$!NZ@#r9H#mCFd#?nmJQR2a%{7=9ulZLJ%#xgZNoNVW;T?CgCXQliYq}w@HS-l z`<$)C6hpu~<7^K%|2BUTx>ntYH-U+|c}wqhY3@~nxpBHF?J@_MOv!`gc`2X6Yp)vM z3z{4>ExYr>Y|#``A3^9P!~SBzxnH6r_%vmz&0+g9%xCXP|8zg|Wm$jl>EWTXsJ%XP zd8L6UC<Ew;3(hDB>|&s@*k&j%SicQc^c{CFi&cbaMN_q&TD}6XKbs?s3qJW_1BnX^ z-@Q?6(Cvn9KF`e(`f#6a*x)EF>A7crDYcx_-ItcIWDL{DYUQ^1u7?yl^OYoI{Tm;t z|E<4XMNei1U>YV2<r1SGsK(AbMyfoub2sFzc*ndLjCro6030{1_IIcaYCHPH-G!Vm z6v0OsILa?xk-TYUj*Pq%P-WnyUV6>!zVK`dO!B$Q%(@6>dDi}#a*S?p;1<Ywz9C!V zwFtIqyY?=CUecwehs!IPc`!?<(MA<bQny8unXqlz3dP9L@VK=~yCH71yQt{-O7!k~ zJ%l@&oES`A(Xez#UwV2)%63B<Lxsg#!#{p(yj;&gVzPM2LhpT{UD1HMzq~3<qMa|V zHZU*Gr>V5>_avd){>k}ToadT4ty!oeFi57bR{W%`$2FIAW+FOEy&$O%G9Oy<pMABL zx1F+UJ$!ifp*GSZYq74EI|mCpX4_@yC5^kE#__Q$?XKS5a7>iukX3@{^>-APx+L!U z`+?7X@=v){icP?)vP10Lo9nV4v!m?;&`n4&p7#%1fycs-=rYF+Ur}yG9@F_?_X<tz zk~`%4ttC(^YTAlNj|);Bi6K<pZ&pYCMBi2C_qo+#8-}e9S`za^X)*ekXiZ2DwpGB1 z4l07!_zzgRAu-UQaRF$cgd3KK2+_pXZ<Eh-m#>hF(tI2n!r5{uA;pWzBg{?jVLpq~ zwco}))V5XENattahwJ-B6uY_TXM1y9M)Nmzen$zOheMJJzw%RzYgc8u>dp7{-CR3E zYWice<bBUFeb8Dmxfad3k_ANk=53-1J};~bGMLUVpvtPxK68#OV-1%ZZ)sd7XqByr zbOXju8IvilA2+ItGb*L9-&prL-Cg=hnC>LGg!LE`TM}kxSvY@y%oPBCzTY80#IpUJ zh@$_n{VHlkdxNo}i__eBowvo)joHx?JIM0cky9C<B)z{{vrmH6c6*uwX4at9bfaA% ziv`_}35&9*5b?lAI~Zz3#&QPWPput&mJ^sW54$y=YU^}$x&El&|B_B8zxjiHw7RCW zdFKh?Zd>NX%aJdr3+_%QVp|(nl*+uWrRf*URnH)ePn=YqexNKU9=W7!dKXke-(cJ4 zmVqHh;Q)6T66{UuFuIZ18%P=LfjvJz2oI<FH6;o+^%X(6RyAK<z+?w@p*QqHGLnsD z2d)4G`05>YWIO^TV|Wh#TE90*Uemtv_<%Wgkoru0{Nhwk_r5W&H=yA1`I5}xYsmY^ zukLQPQ}Wa7gmF6KqS;!+NaC|!!cU(iYi7DnqC_RiEJkskDUv|mp3c2`-mM2gzOHo5 zS{gQga~yh(KM%46?}d4P{4)7&Y)we3_>nM&kFa_$4X`c7zM#3ngg~T6mN7aw6Q1d6 zRT8KOdqu}ci-nCk*y7!B8M*{I(62z_ODP)Gx~lsweA9Opt-53IaZ5$f!D)LUj+4M{ zGDH#I=}m4irhU`dL=^ChT-5ZMUNbF7KXCh_3s+k}9e%>N(}uvnV941AF$EVt8Xo1C zpzUTl#oS10(~eFtrE5Sm{lKjeh+wXW!uhq{NDs`(`i`0Z9Oc4R6P2aAFtzcNKj3ok z=J5JHki`EWwsDsR*ir9b)Ok8=6kt06l@Gz(nQtwjDQvoF42-}o>!<y06LRpjNPm01 z;B4gSOWPfv(je*4<@FYThwF1l@n)vxclxBya%WQ&XxT<YDGU{#ot3{*qE@36i_QYz zPxHlmRx5$3Aj-&;=#Jic1PF7l|NTyq#u(54(o^jFf4*-Z$UyVimtE3<#O4fO1Cy(Z z`NTRpj@Rh>?WTF;@yBmy7cs{}_GnTvGDE19W?K1t!&8Ka{IheAG#0UGO8=SwZN~7L zw?%pHKC_3{@S;HM{#+p4CIP15djtLHQkL{}rs^bToO;;@iP%MyX{U%3DcStz-pm7+ zySZr+cvP}%cF_S8#Q_;YE!2j&D%27=o!UH6O69mR6A}(u(w_kVEU1rsbS<Pk4RlXb z>Ap>k8Wl|PJHQMWxW0!4Ad@N}*xVF4_Ob%-TUl;n*TIQash)R(vLkscPOc2dykGPA z#SxZNU8nwI8Kyz+L4@a@dOz=uxnN?v4QqM-I{Mjd7G+*vuWQ%Bi^MR!(`F=Sx*A(@ z?rvWJb6{X-*_+;h(3Q~AG(BvzUKZ*a1X>mHh~29t`(Ig<ss3-#2^md4_Ke^Tm&9uS zXtxV@SJL?`%}_F}Jo9`3U@mC%|Csv9xTv@9YeKra!J<Qu?odQ&=^jF)bLeiQ4N5v3 zkZy(?8dO?hhMu9Dp&Oq0J%7FTzTh)&cy+!z)>>zuy-t^|i-LLxz~yFg?a4LcZ?EbC zY4fyVx);9Tn}@iU5Gua~W<`08Pp~GD$Y`%INep)6bdY&ZJS=gP)swFO&20572v3iV zBA-&IcMcDz0QWJW6H_W-g)wa#(8A2i+YikgQ$TcuO|yf^2z_SAlF`(|H=I#W#E zd2LFz39YP;U9uo@Zk|irKivHN3umXsv~^^?p{hNBd-2w0)j3F(B*Apx$Mk|}5^z{p z|Ma9SwH)rW@W^l0uFVT-e0;`xJ@*ZKL(U}(tB%BXk^7Laq(jCCX(ZYrV|p++P8RRg zwdu;DZTtYMu+Yj8)>O0S%ax~9qFJWb*_lQE%9`>ffEs%i(mELW%-d(@|4#3Nu<}3P z$7o!F&ZXtWuKT^hL84T<Uxl|zOZ_$KXhx-(bkXmRnr$lSJto%GVDcQs6@9a#)Av=Q z=#GTSoLnifEF!uN2^GNbfl`Nyp>Zyk5yOC$Zc`l*;yg`*TTGPa5!BUj<7eS_B?8yi z`M&~%Ub->y5n*XobWaK~N@3I;!&w8OoJ#pKbGfOK(5U(oO2a&-jLzmeOa+KrZl3NB z=_9Ej;U#LPmXkR%Eys?PcWd6r=-><g`Qw<RqiJy4Cz>`m{?&CI(>VhRi_H>5H|t(> z%%oifDS=>Tt~5S_Ap)jjxNoCRIL=b%-s%D74jD#Ssg<F|SvJDca+GIWoxR-vv=!<u zT2w`(0R*@$_u0hbIctPi)@<sdm08@^GT|zix9(kcaHiGBE;)n#4{lpJef}#c)#yq6 zuI=3#GXTRCyz<y_L~s&M-(@|0am(p!B9D919R3z9;MkCvp|*JTosYFwRs$x8vfmc< zAW<)!AA=Z^4SM>0%ANznq0eQII@Rd+8;wLfeEv&#RV71Ftv5SY_F4FID_5KMt{XT0 z7?YMnIXs<K#5}M(?F3-;m2n@lB~|L|i{WRT`A@$8wByjXt9g005p9E)+kvh9)(6#f z3gmK)PF?0!plnF$J38+(hs`5x^LdcBM8d0AQO$^`oy&@)0QTIwV+~}^`HhWp8zPdB zgrvdIe}xE|8!EV483wlYCB0y)D8m^Zu0q#&PjR+BM<0ws@67eVX-VtVuB<^geah6N z3qSuX0awT^@VPTxeAh(AhN&B?5!j1BvunOD)fx-v(Sw0GF8_-6Vg@3Ti-A@(V!fN> zHT#GD)il0F`%@ncxFOTEPr)xY4IBM|t6EqfKd4sA40q)W>{KS2Al4=K1EjXy?%-<) z#$q#&Jw(>qmd6CYMOJAqHz8k(udo4tXHp^FmHIO!3BT_(DXC1hcQZH(zyAbtt@|8; z^UHpIaQu6ZqE8dX7dzM8RDqQ$W6D_901VGnF&^q!Yv+XSOFb$JI%{oOTaPhj2^UnG zDFR7*BsKZA&EHNYE+mMeOck>M*(+HEgM94~D2FrX<*Kyz;Zo3fJIWmreAu>OHu3{W z`YZt9Sq2;<rfOtL8wfWrntKDDw;XeJMtGsSoiYAqaIrH$%^h0xHQSf+=*ii?w6YGH zBaNpSM&(t18QR^!8p?09W%b?UnlhagA(hpaVp*daaV$|!!qBBpgRuLC<IO*L+@SDp z9v`OhsxV@%FhLp_w-HjEb#?zMf~ceGz0f?jI9<^A*0bTAb?`hx{8qPf&f5{wYAlDQ z(N{zs?hwWWzcO4Sxa6OY1;??a4+t^;o^4bsdWN61PUCJ{G2YKFC_3<DAXkB8M&76> z?A}rrqHXO{jyr0gSvpGLSa6y>Y0n=>PRtxN<Ezsyee!$`4P0jbiqn;<#TK!qot|Oz z{G+i5CN_<>B)S>1%VD(Gz<z)B9fQZEc@pt&e;SkOBz?#-_2TXR(kg1u&T=qyxXe9k z?PfJ2d@0c>Z_b3^4Z`iDmQ$7Z4jjeTMc<m!Z%kQ`Kv@CRxo9Pi|4M)Q(Dc3?*t6mQ z#;2vM25#`}s$O^45TbUn3H0ZM(!HV=g{4I8NJMo8e;kClY}JSU&EtQ;A{$B?#><<p zEvR}?f4s*$vT*&y28Fr904@2~@SW=kYLd}Qz+BXCWbTM8>Hv*JUAoZBv>gm7ZtPS~ zxH{6$=VZ7Q8>l0WiR=s}w;N>{2r?*ncz9e7L_7K>P(xQ~_Zz@~!>@+>r876SEBp;L z5t>}z!*rUtqzof&nOC2imtR!ZSUojSGJ5gCe^a?0FcvG}c<&&w)>9-5o5&jsA}t@J zewC}BTa9jIqUwp^0XpOd<-*l(sTx*TdW_px3Mq_C?v*~BVA|`~WLER!=ld+Tq-1@O zK2y-@NfW6wa$kalWB3m#f>26Wfs+SOJq|v0bQEf2#05wn<muL+b!gn^(DO!kz6FsZ z)b<eNU~qJ3(hmWaXw&>@xrYC=-09Ek#;KF39QnH{xB_~eLsXj6+gRmQ{)dfJd*_IO z0xmdUY3GxgC#-3}aqfLUHVensyk&6yt>ek0%bW>Ml#`=_Fndic85(GF^!;t(FL}>u zbcol1=ml~i7rt4uf{<A<cD;N#zRWTZ{nP1WBOuY}u)n*x6latYk&kcxoT!qCx$F`a zgRdwig095=5b)iFkpN?dDKGO(biDZ~_#?KqHn$6jQz!f~r6arB)P~q)pFvFNo(9!Y z1R8$sCmw5?r_j3$5Rbunnk^QWtY24k(3RcK+a^`x8}c4V=zgT1qTP!~>FKvcav{VW z=bQ3}ORhVtf~+C;asHocRw>%Y%u2~Go;1hbR;n}nA#Wo*cp;Jh7g-KJX^c~cwjzct zi~PJ@8=CxprOw7n198s)(9@uEX0VU_c#`)k!6<0%!P(X1EImE_<81Y7UaNN7{kK-C z<ruJtq$y=qLYuP02``fnh@(gbAT3X~QtMm!YE_8_wbY$u7jmZSQKA!b|GS9<hRGM= zAoJP>Nh$D;VV{{2myoneGBT)5AKL7<rSN9o_>If!^i>8jRhp8*tww2&_C4UKkII@$ zba);C$+GGV-AIf^ApuFacp!ABPPtWNlxZE^d9f&{-P@6!$v=DX#=aa<p$0YGfjAk* z7l(u@Co5VZv!t-cat5M^DvlGN!7eFUlciIxGrO+Ql@I)XyIKv9UTC<}U3*J7J^X`w zf&U_3x<cWNa|(UOP2|+toymbZe7qQ?^My(38DQOv4-{4(i}JbC9Y{(8(MggBujxPn zJ}o5@vtyd*yS~ho8<B{V2}(54(YV<(JA1)0TZ#{*Q8qx~VVVsonPqFAcN6^kwjvTS z?=Adoi3mhCK^+*;N<iuK%xIKMu>G`jcJg;iWzf9yFO5vp-T6;R1}Rm~Qs9~kPLV{Y z<nj4r;vMJWjjTmhGgZQ|<MihWKA_}x{bGs+bbw{N`U+{{m;S{7$#0VN_UiP{+APrH zOD#?_T?wj;kY$?*>VzRZZYc$NWy=HoQCaleQZ_EvqCj<evn;0$=Ebx@SnzK<%)c`7 zqkkw?#aAc8&-<j!jNC8&KZdA_<Cto8Kh>Fc{V6s#?Ok4~asnRxCPu1*P69%J`6Q&N zvR}M-@%<tEq-|Y1r0^Gj-$y>OdMR}p-eNXc)SPc!xzsw{xL3sW)8NN+<>Tif(fqWK z2DqE|&*jXW=$|f(sy;YfK`D9CCp}c@%Hf&Lvs`a@G|hNA$5*}=Qha<S;uIVUyq>0P zL0w6C>D13}<{g3Sj}CV{u%4Y`W}(W>*BfpRyZe%)OGon75mlrgt84@4EGD||4eB)~ zu#CiiaPRxc>w&|SsqI70SFId#=0q22KNIR`8{e`pu($woP8kGERQbKVA^3|kk^(fQ zV|QwMs$D9QQJn|BP{_dJFEVhudh-u5aDdF!KJ9qPu-Udy7hbltm6MRNx(Ci`D7ZyU zCy)CF^jtExM(K6n`}p|KhMB){cvk*SsJ~tZt+jGT|C~#4*lo<oh%KB&5j3&o#l1z@ zpqSEo`h$RZ&_6%|Cs<mlH)go!qn)4#zIrlz{5fOd><e!h^2rtF4(XG60F_h+nmk92 z*r;1teAyT)fy=mpewR*B>e5+r=86vSviiNOy^?Hv+BIMQj(q10Pwjjxd~KhlVzWTO zfK$hh(0`EW`=sXX)tiiSu&0UBjeUSML%Do{TWnV#)vx<(C&73veAKHUslBCd`T6Ud zV*W}Sq(1)m&Law~0PZGjg+JQvH1)p)X1LfWm69ml<KpUQC18};nK`J`#)`FhMbUUh zDAmxfhixgh@#3mR=i(|*zuXMuz5wr(lfLRb&M=aL+MtUBk?*$1%av267*#X~yH8{l zm*|u_fh^gJh6%7#b%g-w$4ztFR`=^<ZJ$={9kBQTiqeK*?Av?!+D>36JRfP2_ZtYf zMY;@LgV6wRKNj2Di`=Fq44j@=8s<MdxH25fu(28KsuA?FO61P&BY%~Pey(|@Z>YZY z(h2R^G&EmJ9w&S{CgRJv;P@~tm(xRSd=gn9q2wmOt+zHq!gx>vL;yZHm-LJZ!$rO8 z*~yEdJ^wbrw3-9Ee<W{@e=&Fws&{wb82K}jc;V_ZkG=p5h=2z5OY;53y};q%cE^F( zGykRVw|I*LU|Z+e#+TM7oZAQIvf5a-6ij8z%u{o+44njA5mcHLQ{9B6h+^u-FuiYD zrb7dBtWd#u$qjdX*1ir$+WaPqyjve#s0+#MYb>@2O%?6jkFefZt;}B6Q8@^j5*r+b zqJ#QA{ig`R7O4cc!8<w~szn8SZ@z>|1E=-ZGM+6L93wHKaMb{OQy<)+Ejs}Sy&fl@ zhRig1=)q^+!W4y>ooa9!arqqx=Q}t|B;%sb{5u9VhzA=RyQaMN>xY_TjFr(*CltaC zqH^8bWlC4cnYfD(HE>m-j+%wkiLO0ATlybOzI*;>W}`g$LFZqnxH+E6y2kpuO5t3$ z!HG#?y0wOUK4?X6n#g;p@yb>Huq5~8BP5F{Vl3CBX_g{zhKE)bJ|#Z~lc3N;yAHP1 zxJFOW5^Ery`YG>~tPG;xI5V}p?oCs>Ziu%eBw07Pld`$U{Pd`(kx;(q7N>|!1?fXa z9LhC&_hC442mw=*)aQEZzuD~Dq1?ocZJN<Lc~o)GgP9F>wV6OMm44Ig^ohwLR~yJO zI6CJVyMMUim)ms4w@W|cX`DF^lMbyjzu(3#N`@*MMMa1=w<#;K`XBcWiZ8Rj!_R9+ zfZ@I&==!4Bw}x|)(Vd0VZEZ^=;a_eaBePMn7S*ene^i5V`hOE>{NCBHHZQ;G#pKZn ziupqB`F|O;Z_hgRFIR|GmE&JvCVdk(Jd}-g!i@4Zt@WGA2>hx_D<G_oHlc%F-r$^$ zDaNeO;MJ&Wptrm8U4R$e;l<djlY{9LJ*7snaIo~w;h|3It+5jFm1KldoUoXtg7kiO z8<AOQ!$so)CrX9ky^u$)3MHqBCROo`7G$$>eIQDY?atIdtZ8j-a|ME+)@^;)Zi#`E z-d9!QYsLB-Vh%5FZ00=ETf<Vv-}oDRt@s9B46VINlZx962;YlGmx>RCKvdls96_4D zFhH)-G=#QJ+Y<(&5)P8<wQ;k#a(Z3Ex2}3~nVdN|H)3ful23pB35}_z|FoiEx(acY z$0dlp3v#EtIy@&G{nxxBr;g=MJFW^U;)#pW7OUTkM=ssHtzXJKYcUanNLVyDLCcb< zUJb0@oaSOx-OAQaTOf6S^NDn+Vf|=LPzlO7s8o}8Kcez8Dv9Xx>+Py<?-Fs8!p_D9 zv^AY7W}UyXh*fGvtgyp>xcyiw^!=2%c|=&$GNyZBYmeW)sgJc&5P7KHOe}mkudIPk z4@{gLPlB)A5v^1>`=3nYud#(!dYR2^%>N!1w@|fq>0Z3T*75WCdG?!#CTHCIhJhdD z2Sl`&pMcj52)j=Kpg5M%1PnvM`FeWfkt@E>8)`nsxu53j$Z!<etvP1+8!FiUhRRfa zD(e*MnZYKc!reHDadW`{54#S95(v1<Fz&8uD9@RbAS1V1x=coVxncF$#6~L_5#k|g zI_Qj2)7&AZqkD|;mN%EL^|=~dpoI?}m18hxd0$MnA&v`sRGk^R-c1mNi}W_I4_0?P zz#-(BHJ>~xUagpduf_wY0^F&yzS|q?(~M0;Ixi`{4CgcS0m|#TI;B9?{o{O&m%7ET z9?gFVjw@j_L(x*cV)t85|L=T>WxJlRIWv-y@zvA4^#YNg!9yLc%c9SI47QO94or7< zY<g%=r={5DZT#2XO>ft*=$aa<7G@v8AtwDn+R=r75UpP5zvW}w1%+rGP@^+>0sash z98n-vvZ2}aVoJ;LnoW&U;2iQ>;nLkFHGv;w=kfIW0qO_F@+glB%F~BJmq3yh`D@<1 z@Q-i&TlUW6D^@;JC1TG;SmW(E&BfQeqp~)yT|K<~!pBmaqy&zK$De{(z?+?2kEL`X zw}hHZRlCcDSE&(SpYRLBe3cC49L>36tVP$>-ZUxaYVr+&GLQGMyRylu?7>WZnpw;} ze03A+EKQ?Yi;p-f`q|613Sq{8q*^Gr{8+M}Y?{k^P5)}vtHs(hfY=<=nE-<Lm9)}M zCs|cClh-mC6&<McsML+gutV5Ul223br~iYmq|*Q9NX1odjEa&(K*HDWa$Zd~?0Gp- zu)3Pr%W!BexZt*EF!o%QQdjCeO~r)Icxg^=44=xun9+sX_<rdnLEfSj^+M5<TR`$! zRGo^U7uEjrGoVyYU>z|FH`o3G|4{e(qt{ba;E3aFj-Em)F?)IIuTvXcHdaMRg~2zb zJ{JP%QZxB92l$g^VK(~BTrktl%zO5%CoH|$m*hq69-fJH{aK0A<6P45?Wd;(XZ;aY zWvPd%{4`)|!=D`#HR2)C8Uv*lX>QMZUZn4sp*>-`b6&^^OFQ*$k>3EL5c^<rymWQ^ z6a4=}sp{kRIDb~Xr$5#AExyiyJ+C_hots|UKb=${Cs)9Dnz?2fJ|oQ>KP(&{ZQW@# zbaDzC9pZ0XqpA+<>c=FEzfGqzhV^e+ida;CWX%Un*}qxXuJ9|{uaqvUea<cTWTZLx zB_CO{p6>gG$)j@_4NuhYTHKdUWK$Z`2R9Inf9({^J`z&LZiHM()u}j9##t>;{2oF~ za5RW)r3}uW{w6c?T=-GC9<=pwxaZ4Mm1nS*@h5bbhR?QEs(s?LGJ3ydC}b>Ebtid~ z9P}X`!pjGjgD`^5(E8Cd8zF%DDSu-#%fy@lJlik~GtO1>#cZV4$eaSTv@kWKSOHx< zJ1X$HhjKh_!E-{-q)U)k!l7$6IqsFsnYPrmHGc7Zy!jp3*xpft>?n`Q<!;E4@Zy_c zb8ae$&@YmffvL3&l>qeA+V2aCq(woM(`bCfPJl)<!jDJ=cI1`k@Ibr)a-GuAWji+b z3DR~JSY@>S7VD2mr~&K09-&Bu^<z(7ApMom2d<?|Y=0~}-#NE$5K1@jWkoI^n}8O+ zbU$Xz#*&jXEFC4gZ7FSzImI~oHlO1+H4{aJU`zauGJ~N@8@{T`+2m0c8b)SASvlu# zk)Z+`JvE9jz;_K2C)~cHfGGGb@Dw9wnqL}olsUpCC%j~9KQ<YCvyWfequSgm*5TWC znqu7d5H&>a!HP!UUgQqG*$#atQ;=86j2?#fL`UCt%uQl7Y7DRJm(+_r=a^rChApC0 zAc@6tq!3JGy(q1Fgt}pn0)Jn<d$9felgh`Gp-b&yPyX6}RV%#w*EASw&^-SFkKUL1 z+9)8!5Wn-p(}ir5S;<iTd|B9h&^8R<yECFYoNb~Nfb1%jJe@KYI%qDJ+?g`cKD~aW zC8so}%%@;o5<4;0m=P?Ke=#X7?cMNv(SBW8$ar;>2JV7$oeqPMsJG9N;}Vo5+E@e= zCvyL2L5MNsu_uNS8$ElN8CmnC`rJ-ToLB|*@iSNz`E6E4B{o?dhI>7;eM?vI@3g}% zmH7Rf9PD$S>3Ou+PkgH)_wJFb_Nzk2Om#2af<96`h(}Ea$PEOWzUl*LA_DDo*OsTu zE8FpbQ`QwYrfc2CTKw}!Z+Q|VsD9(ldKT!f-+=qqB-ZFZel5>D&ZZl_&8^l1n&+1h zXbxz22%9~TInkDc)jVo0Z6?X8yO>8WKDz4I<8xnlz0n-hK)gL^q|J$DGN((Gu}e+7 z8|yRwic}lXMX&VT&IRDs)S5M94|z_3+))1<&Txh2m)XK(Awq&fV*wz(ofP1}9t4|W z%VcGS+>UkwmCQvJvPCufaoR~+!aV!CFC5nJbJ)@^Mfxa$Lu7rK?Xjvf9rsqb3=ijt zBg}1XGpnPV6=&4dlF+H9?@r@_7S=$@4b6iLLX2~j^WoF>vPW^=7S29+^|0NpJS^F- z_<ivH8$#sESzxeZO4(n}(0siACcwt|j*&a|H26XSXpa8**3>v;#@lDuv=c2i;GU{1 z=X&W}LQ2|LnjO$m_+ve1<iVKb_%l$fumM><`_OyFem>{}y-!A6l{=F@Q7asjue_DA zoTxzg(|VQG^UpVrrW+|~A>s_kdum6B?7YVNCV9Wj-<RVWEZtJi(a&uxhQbvH#+%5F z2`nUz*mI)}fttIPPWG4*He^Gy59}DS0j;uBn|-e<;E_rKqc1Ap%CkqhYG#*hje@D| z`RG~sl83K?3yP*NsGM7H!(KrZ8?gD6BhRZuSiwO!=ZN)$bbSaTw$V*x1Kx!EQa0hl z3n-8d={gHsYQ2j5>%O5G_aAS(JUSlAd;IVEF|%9LqgSS;(GtyP4XQ3}0U_rQubtA3 zj`Lj8B9+q+CGx0_wmLb0_OYoyexHJ=aUVLN08Nz^{viIu7@Jhp+J+UHlaXYy)r3A* zOUld2sPR+^2dYzx+@S{nk1&I$CI&BB%;FuQqfaqU@_W)%i!#nG$D{&+na_+rzNy%i z>w6rZix&xhVpaXo@X*NE0v}%*;Ewgoh_*edA*{IL&EaY>vUtCTa-@9N&B#?|P#MbX z04i{$Y(2-%Lg-_zWg6!vqYS(i@?T#na4+Sioa`!Fa7Jo-k#dLcc=}NLq0Eq$Fw)E> z{pP(Gf+Vnv>EGkLM!$cu*Bs2sng6F$=1cy^!Yi^<f5)gu=%kUf7$S-lGX>Idj+pV^ zY-<XUy*o4AHL>Q}JS<<9UaI1Pq!H6XT>aZWw3^^wDwOnBb=8)3tBEHFf`n=<xD0jO z(Amk&2<}~I<#FU$^>nH$GN;so9VY?YIiB)cWwP;hNJ6%_sE#)bGFB#M31^>kb9;w| zh0Qj;^4tvaNYQq_#1EUDggB*VhlfWaN-$lW$-_n_g7nAo>ZrTw)%aZs2^>x~Fjoo% z{W%kZLzgdTaH-G2w)WQ(yk4R_<KIXuW*x(EEBk7BlEK6_t9;25B)=3maX_W#JTJHJ zQ*+WL>a7fEtu*mJGsMAev+vCW^-W@%_ujv5xL8QhLe4&&{}l4Bhv7QAbFqE{(zb&2 z$1|t9!~H*1Rsr54^jqy}E&%j(xASfm&C`C*v=a}yoFwbIR=Oc8Zgr?4TMjue7O@Sw zU!MXInEm3_Rc`@3uIzqI1doO3D3etrKQ?^QHt_AYrYPH33ztU&d7F`4bHiy&+IizF zg{PRPsWE}|ENv|I-O-G8+kr>MXcdd4J1|bDIZn~XoqB(?6G+TciRv&xc<MP(?B_j) z+SQW_^}pDv#_R}!`{iwTHw#7>CDjpxT_=H*>OryQ>zV1xL$i$E&zgjjhH*rg$5VEk zn-$#O6=Hd@oFPpOV)j_y(zrJ}F098X6Tv^DZ26YTY#kYP5ok8yOP7ETQP|zdV{?u5 z%-%7WE^1vVM8UEEe5v%a`B9Lx_xB#Ee-6s%KL>?1YMw8KC1nT|fWC@paUsv5YT+_A z&k>X5gYWR|Z!C4VU6*bwdH-Jja$R<Cy+?x;u*=Hrt-GG;j>d{pty^);Afk1M&Y<na zP(UeN@@^#yTy!O55M|szVZqBa%BK&HJInkGd`?(IPvEh32J1y;p~n8)&*sI^f|~L! zFXES>S2(`!cSzZ0mNTSsLUA?_kBBzN;Z<;l)@gomtm|B&>@GpzU~VfT##o$%-=?r9 z){a!yO(CU5aO(0*$4eU$9{=rFrnc;{SM^T*?F|%xJ6XFH3yZL6%)vgo7A)&dt&gTA zFL$=Fqhc?ND={5Qe!ovZMtNkrmZwZMWyTr&B%TT!=rZvpTJPWKa&pT?iBzZXVlDpP zNQo;&xF)JrP0WP-aU4bf*#E8FuK7rAPhJ&l5s`9Ey3YjWHN|Cdni|gl@!Jte9f34y z&W5+Mvdv2f2lmp9^%wfr0VlI5F`YAgjv(erU3a2X(;Bj4ml9dV;^fCEs(L1|Qv!z) zZSth$%IRgX0JX9kk${B{Ym;;$4J)&~9C01&T*8HA+%nqyH+RYF?M2ZpPRx%*=L_x* z6wuE=2>+Qes<!Ix1VREjF$wBvd}djkAnysTTv2`GZ`!-wc2t06nD67Ho97Ql5U(v# z4OKBT&o_T^<E9QRMD4kt$p7I$_>P)}o11$nJVj?r*<#L%r<|s_JlV-r<O0@X3R|sp zlU`4pGhcYU<AzcrII+M!@ag7lC^|sZf1hL`$6s+Hj{N_QDI!?<KZOgc3x#(~&08v; z%)OGk?5BkBzFelVOiU~cbA&E8EDN%<e2!?ns&Zlp7+bqL+`dUN+d0lJOMCW!kB29s zQp>8^u{9r4%;<@MA$6)2YQ!_voDn27XO0YK+c79Ad(Jl0s5&)|dM^E)DnNJ5j^pk< z4UKrv@>3%RBT&rUulRLL!!%iDy4A^PbXOyj!T~{~CN{Hx>qvMv{-S&h?uw21L6Ddq z<MX)xg_ylbR}rkz_Sin@%cJybn^^XH+~DQ=yt-(8s-kHk$Zv=IEg!4de#geI551Vc zUyarKn58SN4ZmyMcPp?_7a3uS-LRLhRq(TU+_TMJS<T*}?-xBTm0yZ|?USDAZB^Nd z-6mo;T;<hMKSm=uzv;^D`f#tg<ICCn{{AM}pTnc!{7;BII%N0cC7_>fxUd)0j<5uH z>mQDN;Z^DMisNoP_0l1sg-gpKeSB*Df@IFfbI$?IQe<LZexg}OyenJfFQ2?;t!(82 zDbQ4F!BQi4By`?!Yip-W%GDT@leInW+K%AYrpo3vJtWDS8K|*jca0<STq&^365v5i z#fx|`R)kY?#~$|<AViDcPh!lN7X=jDzD072Wk&}dBX6Y`-OYm{0b4fj5uJ}<!Dwtn z^4_B2wLiJT#3enjHl|0Y%Il($?04P<+&*V_XANNt-?Yq#%iL3x7>_)mx6c!GTf6dG zW(u}9L9ZS(@(^fm=Vn*r#LZ6bDs!3)aI!nw<gw><$s{02bMUkk&OH$?<{Pnq8&1`A zYDU+|VUiTcmUngaV;%U6r~ovU1SJ1)zHDpyj{_q?RF}eG2U;JMMqAaQ*gP4KuDltz zkT4UG3zPm8y;NUVNPBR{p2VW~5)Nox+>kYyFneHT@FSvIYsT7u&)3-fHkGwh(-vdS ziz`g~@h98Tbh|u*@0YZh#@v}FQ{O`NKR;YL(d3dMN$7nMp1*m`DB~UxATw(3g)?-G zwAlz)?ASb_F;@DzC@?uoC6yW)U59*vxxvU$DK}(l6h^_0_<8GkB(zGvZRVnaG4}OX zlUvLHwGvUKL=TxZ{x#5i89Jqm1@p1;Sdou=y=Sr`%)n4k;JiRj|Div{%W9jcGlc8b zZlIBejh$_qMzaLHyqXE8P`ID=)zw@slT9zlLZ?}DCYA{fa4#i&4nX`Oykfw)5fy#j zPxHY0x6YV%5_`?(AnEg?5o*>yc<h<kf4YOh%3@0@ClMwuWKnfpzJZKM?}M*7%dc&P ziXm$x%TnzZ$tni3(;E}CgFDE8w%`=-ge7=r<J{T40`!dUJ!;3Z+)qVXuD4U@Z%v0n zR>VLab+I~+$NAqIVi=>|*q#Ve>}3?g68Opt)uvjStp)fbAYJpyu^UA@7)-YP{fS>j zX*Q#TZ|+JSvq%<Sj$&d;1<pvEXs!V9I!&0*tl_ywuDzj=Q~|>z7-FJ$8q%0JNu5I` z0}fT7M!o8B2divR752m8yU^|!4KmeWOl`5&_%~{mDH*6;y~aFDe&GUYrUSyqdbNC5 z-?dscIJ`=Ry%^bw*;as$PlHo*-O(7r1*)BGefQ1Q=;qZFv&cG*J026ASU9)h9e*zC z0vac^_lA0(M4X0FctVGF@D@6A-}vv_Mwk69gfvY5$>sdRNAz3lKSjEKLyKFD2x#S` z{j19kjSjz(nDzB#8h^ua?kONSxG<AqI+5ffzPQ=LB3Dz7JHQ!I9YsSa=9*NaE{ZSl znK}_Zqn_M$_S!$+NhLVZVg8bHwu`9+H5r;t>J>OlB*v;Qypy9quly83BMFI#>sk{q za_CP?5XjAOY5c7#2%$ydu;bq>H9r7!cwl~wn{&hv%Lt9GMK*=L!O^RgwXi@>OpI&@ z(@5;mYL{Cg0~vLpP~Ar}27T9yW)zfTE*87<jkSS%F!Nzl?M1YO8I2E<Ouo7?waAJh zUST7)ko;WNETw>+tW~d}t~xzbI*q1>>L%*eXGNb<K;Dg4LW`*wUcodX5XYsKw)!#6 z3X%Y)7hM-=A%%9Mw?6+i5gL;JoSnRY0f#y|$&{z+1O73E2Qp~`t1ZR^Fh-e#BbrwF zI=c2Zna_fEjjpuHXleu%edfHSAzlUaEBh50{s3+B?{8wED8u+Dx{no_hQhPGI&Zao zg?w^oiZUB`v`Tb*U!Mv*w&z`Q|L*Sn;_XOpWaH+?9~Vtcj2bjdaqaX7jS~Jn;Fj;+ zEFsFyNBsBJ<?CRY2mROqr>o>FGEB%;V<_<C*J*nGyW_42Usz@+POR&E=sZ5;>iQ4S ztcy0cFS>3BBVg4>)`y$b^UH&eyrE*=$14}w_bibVx!t)fB-t!3;?II&c%L{OyT6?K zaTBG!{Ns2Q^6JoO?v>Ikw{Xzgq0!M#>I0_p0yx!LVu{9v6YJxsQRs$FW@1-Snzu3P z6AG=M`Y~{)YbGHP9+s#tvXQyzN68)&+CC~O4NyR4W~SgTkm(EkmvotYXsfbtC^*$; zJOyubmQavLtaP>KgHENY0|P(bUvfje7&pR6T5k3s+rB<OKdc|@^SN%x-Cm1%qLx;q za!sK{q2Q>klNMnU3K43>F6QLelUga03nYUo1M)u{q-~RO>r!=dbu%0e*jI~G#SqvK z*%vi3E)})&ymGKg&&XOH`da5nywR}QsgrXb#50N$_H?Pm^2rPnZ$zB}+Nd==lxMfj z{Cy<!ZuxP1Hm+&cfQGztNnIbb0EME%zJBHw>$sAAD+K%$tr5F9WQK~)*A_Rx3xcHZ z5mB$eXHRZ{t-|G#bc}OP-cFc7Mt|+q(0BGnELY)!wHPJ+%KbD_G<C0^rPfw6Mc1YU zf{5V;CQ!ID&vN<kTd!!ETRGYF=}i9Cs&L5SwAD3L8y7li5874Bjx{?{-)=OJW3RbY z()e%tF@gOT`wW=pH?jCsR$A325cmj$Y)uuvb^f71?Qo>(ZPf_3P9s6e%J_K>xZSPN zMUzMwsFnD+bs$)Rq(*nZ0~4(|5}qxOg*dJI6yI7s#x@Q|O~F#3izz-?vSMwho95x; z(_7ZDeFE#(dLin5qwrK87(UrDzQQ|4Ws*Q45k^EnK&PIN1g$u~al{G%g{^a2iOcwm zAjeKIRS%dW<f|?tfQCLim?Rgjvymy^%%{;+)w?Ee;9ob)-RZ-o;-VAyu_Dblrtn7$ zXoDjw;cGb;-A}ttL^-l<C{aHGkw4ee5*&R#h>Ai|>HB%&n&0L(H)4AhCU1fS8lCjD z${BE(wn0#3PUhg78d$y2xr;bf{dC6N9r~-P>lfuY+^L7_nO3K^^A(CHx#ai=nkizw z-$Vsm5dLV7aE;cy3ADoBSCs=Sgt}letNHJzP2{vT_vrp*F<3GGiQw;Tt*8i2z;`<^ zd|gjQgX&TjcFA1zEHKu6h()r-%{(j9z-2Urh|5*uz@(PXh#%9%#9Zvn?5QpdqC~rR zoE07B)jc_0l!ej!H0qV<mqw?;kh?n>k38e)qwH)IsHg~)wL?~yut0)<?k#5lK^hi# zx`u(d<f@Hw^gF*EAGr6^6D7Qx{sv73ec^o>2JNUNpOR7D9fJ78RnB=^w;OBBci<Dz z+~i}#SFDR5>YN6PAk>jMQYYp{pr|42jlq!D8CwA?q9F`O-Bq3-yOWp3V~{#Mf0YG2 z-G1EFjp94^bbW$=rv@;BBAAc5AiK{u*>&?OH5OCuqiHN-vrMbGLx-94&w>C8W9lTC zBivM~d%+|veBDw^Lb#X+HZ2oVpYr}=x2*%X(>?AlCv89r(V2NjE9k=%G%^8wuF>2q zP;xzkyVIej1RZXPv$%-aD*e49`JUGm72x;cd(8{Cpl5$Eg6n@ULfE@%%>Y`T+Da>} z9?i@u37l3Ppir0}vSx(Il^ed`?Sxorw=f=XW6o{#*%Ot{$tcOGI|pnXi&k;+XYivu zIX;bUpd(GH9=qydRsFWwYS4A(JUc%l*M2t`u2LX?|9)fLe!lHg!AaNAd6l)uLWKdZ z`P7R06HIRWT-?utup)f3ydTHt#r}NxWmRk3?sgTv^XQP#&He<k%dU^bnGtbOY4N&w zI6TWJB3cmnF$#!>)L+J*<`*U!mBG<qiHIplH0k;!42KF`MO4D=qRqQriMsKMs@>1$ zML8EbJT0fX@jOBqKJt6ANCcOz895w;vV~h_lGtmjq(Mn35*f+`XV=BlO<T37@sZ&u z>+{^wE$-HEc|+=7sCJFE1Fb4Mnd|ZX+_qdN#;`cM&D5YcgKg70uwc@w>?M!8*noLl zItO3Q-WxF6h&l~@R;3;4AF6?dV(s8MQI0=HPDA>icKGPHF{)xO0(M>eaHgBJ8GlF> zduJ%7vfpta$J?xz!PyAvmKBq=Otf@#v7K&e*J{_kE?M==^~EU9B}fxZo$WK|q+wDr zBthOG!O1X>vgF<89Cs!->YugIsA=jp^R^3|*vI-K5x5OuZZzMEzErM$VZ+5hp$L>^ zBM0E!;K<_z)+>{qXMmmK{lS2?AEH-Pj5U{q#Z2y?iRR#ujgB0=3#{yAf5}%rD|YM{ zNzL=ou74xjc^KU+Y7%y8Q%#7~vy9rgVFgaVZ0f#^ZE3}BmPd{s8a16#7-7W$lv4Ct z<UY=*xZS8wst2b&ynWaYuw`-n8eIwOPU}Nt+-;tkRic+Cmjcf*Qm&o6yi&KmZb@{B zXWY$rN+nYjxh<hweM~$WKR0CtrLLyr_As}B`dXcm+=)i8S!}{t@UOGsV(Ddk1M|KN z<qUSxA|N;wo{x6VRp(r2hr0hhrrl_JZJpxZN<+Xx7V`J@qRAX3P?Dg_mhYrbRaXu} zvx7}Gul$CraNfQz*>N*QfjQH@J*ZbIq+v*j+5Pf#pfquOJOXjw>=<j-j@u8{`(4xM zil(%U=Cah*{MdZTlJFvwr6rC*OmGgbS=X@f)kEj!6?XMrc7B81o_XSK%TJF9zP1oy zCs=s{=z_MsuZy~zG<$v9uFM+b4m!q*cFAtc9JvN;#0HpmAtnlYvS1>(&c`*3rXeUL zMG3ozJWtXM>sg&%wdG|oH(I+bnd;pCbX^yhR+sJFN{2X;z&^U0uh*P8H$r_tfV>S! z@A9OxGCx_3$n+B2vz5NH0Z6GU>f#&Jywun|>V9*w1$!Uca@E11C2esFv^GRN%6mjz z_k46N1bi&}sp;e#bxTmX1HjYMT5;xEj=$n)?YYhe;{cDHhZ3ORDiSHJQj!2A48QHg z6{pTR6yo!k1-7;ly#6DOo5}sBdq$45+CF7z;Qs0FL3Uz(u77;Xl3#x8KyVwE1Q<+O z;-5`107$$${<3r?mct23GFAS9|6I;s3EH?<ikaSoNvnXK{&}<BVc;y?KsR&S(BTDN zu1ooCN=3KZS~+=P<g_vUEKJEHbyKzCqrPB^$n@l-(1f7iaN@MNdR$+{$48^c(6T@o zj|7e2-nW;N@qJaY>#pxCd;xnX5&0(VO%IL^i7X7Y%<FsPN0GE>_TR__9>&9mV0wMm zdOg=l1pgYHt%-6oZ&4oZZ;`wI!+k$fm@Y*{nCXi{MGgfT1jBd9Zesj78ShbB4pF)( z1p@ZtlvY-ASa|vyw&xQY|25A9Qb$8QRd!L*=`-G#rj?cAv2k%w%YsGl1q=#J;%q)q zQZjC}tH>FAZE`f{LvxF*=dLtZvsdjWyg&W;OmplKkS|h6vV#fmrGxQ`JV!HGj<CzG z^6t6%?IuIWi0Z1N-c67H+|2mM|L10gMkqXT`3)S>lITm6Ig9%Mkc|dbOqiUiZi?`; z5B9d=3zxm$oNBwS<TZ_H@Sa_+ba{HQTSxqB)JlU1#FM}(l@uFqG+m;qYe2LR6{6)h zQ%^S6SQe)Dlt?Iovk*9A(oRt8s|($(v07PqV#%kb9f*34LR$EC*uV<q)3Ux=^4b)( z_Pu|yDOUey8Q3;xr~h#)v@g5<oVo6DH7L4Iq~r_3C+*mKaVn&Wc+w~#(Q`;i0@=}~ zloUTn5`DT#s2vcXSke?m(k(dJwdw)GHjjS1Z(kDdi{4}UaeB?+gos43eZNq)$pW<| zkf>J_H@Q+g`$>9m#PZhYTd8Bku*(7Y4F*6GQ7_=dt?*mOtlH}02j^6dB=F!??vq2t zIn;`b|2Z10JP2z0P^(p1OZS3Pk&CJb9n2Fq?m0NeZ+X5Xw|peqJ$Lvv8Ejz)%;=}b zMK)4aUx$zEfB>}w$EEt6i4{)7`19~c1*Em-X(&odd+op9gDO7x|BAH)`2Q(Ba8&VG zdi{jO!bsFTNcZcxMfo5Gzj^<NrCNfww6mnlAutVD1K!(KE)PKKxc%0{09pGa(<169 z^ilOGS0X@LOHb{Mbw#W(z6vLKj#97-04NTnU8hklY2r>?rk8FCh<KH_L_c5^>25#g zh2dCs_xWMk@OyDjzqXT{%$*+#r2d7DTLL%zDuF>~TDk9Df+hHE4s(N6-Isn+eW>R3 zDaD=e-j7Iv5SrCdywV!R8C^#x)giML#n$B^YFvv(wT7teif8*IEH)eZ?fX$9#tQO= z&kQcKi6yKe8zLEs-dEDx?o?H60=1{i(Ca)h%&!>!r;IO8LIqUVckC}k;uwI$qAJqN z**1iUE0cY0OgM@ho6J6EUtz)qUf9uFg<Wph%7jo)L(!Jnc=WR|rl(amjQi7om*SY* z84Nub{$iaATD{xGul$gDPo;*EOcR<{^k|*FV0S2W?cw<V@f#->Bt_AaP?CtC-RK^C z_@5pSy&qsj`G-Bp`{c}6%^8O<SS85h6NpVHWJ!LG%v5@0n<nTNnU(X>w3e=XpJ1q> zX)9KqZ#H?Eg(Z7mxee8jaoFS9)_7g8DdkD|bJZyxWIV*h#YmV&mnY4`OqfP!7)CJ3 z`X`>;1Wd(zD4i72RYu^T&w*VqyOSH&+z=DLpBx$$t$F=g$(N{#D7Dl7bhajiv3l%F z%p?&8;0dcOjs6zoSO^6nbmjf%PMV`c_kOn>DCg$CJZ(|ipaRJ3B0G|1%iM28EFW4Q zm$`I&7zCe&SanSYHMvpjGKO?^zH7W({VK%>2otCA^LuC)VvX<DFDHUCQRnJ~;jS_U z#qqN7pR`hUk-NtKQa9GeUs>xJ;26F!4#lRRNa_LUXLlj`BhbFcs#I6gWc$*GziNJx zmu1k_LMxEwH^s}iBdDt%`25p%iW==0N@Y&R0mOOG2KY_!M9sOyoJi%)vM=*3>X8*O zQDKM*Uvqlv0i+CZI!j!(;hr@P%`bl-;r&3>txo_g8B0$YMI6TPwRhneXHu|6tXEN* zTfQ9i2HMJ9AmVbcg;9^z?nE#ha#6Zb+D#)b*W~se3IDQKa*6(LJ0~?m`z9@lGdV}@ zPx;RHLni|{vgqmLH_g5D2u#^K<#?HUf0tn7B+tS9N!`2SGM;Msu38?*VG_W`*5`u> z-yp1}kcW4TlQNbvE)rRznWxDCzm`Fn8tN(=UT-e4`|kcMuGZPa*Guiz(mQ?2>D;>Z zUaRDt?rOyiDMjF*g0r|+IqzdMs5D8gPX9QP>=)n@73l-?=p;tgFF$o6wtjucNT+(d z>{>2P-bxpkh&YuLs#+w6Pi^Mi`}|rz7;rpdqGu~~WIVc91Mj}OHIF00SCNqt$Ma`5 zFLEPV!cQbhJL%CQ*ro1v<0i+0wV|he%7IOmw)gf;ZtvLtb`9@Rw%5@LXR2UlA~Szd zGZ^ORkySF8n+Qp)XGjn+KQ)Wo4&;35ZC>9`8(v8V2&!<n;;w4wN6XpyjBNYmP$-;g zJ)X9U1wvKq<wj#?d{MKPNU0<pE=8`Xp8qX5tLIcDyLSm%H*LEdmTjmVEgH8WeTQV< z@5_adc-S!5s>+iM&1{1Bo|Z}qC;IKbZmP*+(x5>cKBnBc3-%$sh(xKk<{Jcm<+S4@ zv44P=&v^AfBM~yAB~iYt0j-U;vtNGGI6Jd~GxU|3hLx8i7BJ|1X@5R_dB8jAC_J$4 z8;vAIV}igg<Pf{jWhoKk{d*gZD;Wt6@nBCmIF4<FN|mrOC(mF3YJbb-=D43*TIr7+ zU%s9fFN6zReqJ)r(V*sJUM^yHJBy_?U4vst2~REgJ5lBT+k~CY%q2tI_%AHNgx<yX z&V%x!$muwYMQ`g)s&H({=ezK%zTz`UDIp6o4}qQ&kg?yz6nM|_dsQWyJ>x)_6G{_G zL`Mp%3X_F3gl@5lrH1>G`1$7zVAO>X;mV@{k6qtC_P{+q4KuyBiCbTG8Q$5fI|{EF z6OZIGFem&al4oz)B3$ydq-xyw4IY!qGgHsg?d}Ki>u<s$Z_SU)Ny683uN?X|jsz?Z zl>_lcd$hRNT<1~~c6>QN7uOxP#*piU1D#3%E7bc(#(^%*n1RBb=`YHWTkXM!jinyA z`Nr48lr@WUK$2hpP5NUAZ`;!vM-;r^vgmFZYYAUU!@PAJS9e_)BV(+GiPv-yJ77Me zPmfEOBMxv)aw6HS*<)Fx*yOw4_#@BbI{f##-?oW;?7nTFQI@cm;Ol#$c%zRF`2|cy z5ysOGsXX|SbcZaaT{fNPt@$P3M~(W<%Ud;s1MI1YD2Fhu*x^jky6b+1>SRkkX^lr6 zlyC0K$5|2j4hiED9v4Q`IXj2F+SfHaWv@c8l$R?Ha8M8g&wA=Z1#75i!QHfY#NbXG zerp3~K7))1soUTHvn((w2Ka@jcLlrKrGg;6-_pg2YjgY?qM{Y!Zb28F=6oP>spptF zSJw8}d%%fW;!VO_h;b$T>Jyj6(2a8beNBu?#>j=thieKFED{k6pLn~s7#T;xCvY&| zRNtNnf90k%FbV^H;TNV5IXzAF|4tQbbzIO+)I0MloUd8Ej+za(PuE&$zH@SNI{~Ni z4F!`Y!vNIA1GTXd1xr4dZ#^*A9O37X+?Ptk9eQg4``>*1_F~CSlUO5a^-{-aW-ff_ zt6&P`=yaoruW|+6!p9)$-0fz9+68eTDtlb13kr6Qs?~;Jwz@?f^j;jNgI3Ct)@XNw zh^W)Urfv$&h<n1Tfs!z4duPby=>}KR54=IFtO?Bz3I5{9IDbd~^&C0b@h<zn3S!%T zz~VEmGuT;Ar~kGDPhNKPjt^Pop`5n>l&{kS+kqo=Yj55YtR)3q9tJzfG5B1_wcJLq zp{y&9O7$0F_Fxx%7{|xQwoKEvM9S*$+H27<bY(+>RK@3rt|8i$t$;Vl3Al}1C)@N^ zu%;mC${jt^))WDqg-+qbMPz<I*8Ia$V2|7Qz%Q|$0KXgxcJ;nlU7-dbra+Snl}F*r zF~p&>L9y>fAG)l+U8mx$oBZ~VwmzENy36hK;YqD?rWM)SSfaL_5w&bAH(r>TJC@51 ziS~v%_%(@i`-6d6eyeCc#M9o%eXj@TL(e)d#DDNaoknFh0h>imfz37B-x5SJC2FQ0 z;G=k~3Kx%+Bf7Fa8+7_XrTx!OrELQ2&rXRgtoZxHPnOYdE|tb2-y|P((#7I+)hKnJ z?3iuczFO%1`I3CD_A3hXPUPNTrlu}4NKtZ8hDeh@PhqvJ<#mCly86HYCa|asl&N4> zX16PCg>W(IaD)F+yDZU~mCy?iGS21kpi1H+R$))Ilb}5(i`k3eO)xwI=}l^5IdW<S zXFrFXF`)je&L3Q<e)&6igA9}Z&n%+OJjLdUzvDHZxl(x{u4Ch)iEgb_BJ*mNs1_3f zTJr#WhXILrZ9u_A0BY623zOEeBo|qkgpSyN?#dnabB%e$=bt*=OxW1ial<rs6C^^y zA5unknM)EYb5;V1FJcx8eHty@-+Y2nu{d#b)6+6D7qF+qLQh%EFq_J;qlJA73tUgd z*TkK)WJQ&)+nSnwbZrn@#V10s^{nw)ZrU2DT?6-)Z0Au4={YBK(AvF`k}1UCzr1k| z3+qcGnYlR?$owfx8g#8C(s2^(w2=ZO_7p|Bl2>vyhf#<O(PXrSr3Iwp!+l7L<{ESj zGX1gAK~k!!UA-RZ)82ViBM)aUemSo)By#n#4pix-TXHITEaJ=ROUi&hW6$bjcTDBh z0->6>qK_r?dpFR&<aUnk_T(<bjjM3jkQR~)9O{!TdN(=^%)X7yc}Wi9$?>yi0kogH zARV^TxIwN=IHSk3^z`pNJebg`eEKR({D*~2J<*^AS@OI2`sU{c{giC{k-##-2Pk9% z^4P>CmN2MW>0D2!c77n77NrokAeZUbG~|>_?MHxwNH?}SBst0YXyoY|?i&4}&eP2Q z5(S@e6zJ(_8fXm89vjqWwKA8JhxDyl88*2E8i4EO7$p;0JP0_z*EMNfteO5k3xm^# zoq~4nY4r4dKhGUKjuLH4M9H*_0~UVvv6eNOWWnLD@ok+5C2)~aB%n?W!Wv)@3zQhE z%{dbh`^c5IPsi-7P(E7L>!&FDf+G9U3W<n8&deT?y4}@;58a4}4Btsms52|>&O`WE z{*wy`KsNP5-uy#sP4@3ZO;HR`hDEQpn`i9-V;?=1t%8N@4pRz6f`LQpCeBU|ns=V< zucR&2#$_{1yRL*fL<)zw%s-$ZipuTVC08S$c}6eB5W%O?@$>;$<qZ=NNci3JeD0>r z7thhvS4SDhpw3c(bur*^xWMPfMl_TX4i*7ioCP}rX}adxG<>s)!&cUj5=kQoWZzgg zK_9TQEadVN9;K9D&c}Cono6;Uiey}OTr=Hm`JWHWcWIJ`n9`uK5)z0L^OAh9)@NbI zY%p<e&S7*vBX9mKYVgbA+$`LXzUKm17H1W{Q2e$LFY;3Tw?eU2wS&I_i;u{H)Lgi} zGC_NDGPMMY<mM@gjBgy^ofI;azxw+b3IFpM-`4&Q<CL}}e$%}kxbY)?Z{f}Izybb1 z2KB)EQl!&P(u0?F%lopq6<qz1z-JlRUAsXQr^wf_?9SJ5qoo<^D5AnvM_Pu?_|l{k z!UFeUPPHyf?vq;=%jv*Xu93llCUrA3I`A<>nCT0o@jkD$GftS(PZ<Ua2pE+3iMrJD zX0&{LZ7f9Oq0>eb7Sf}X_}Or1^4q5(k0HMSmq{{{L}1@X#K>@lw@JD004us^e1-)0 zU`w%2Hmmyb7?YSpy*y!s=HZs%&2E|K@tLH^XV;1|ik3b(3_gaaG^eOfl<(ZD$5v&I zLJgT(!Zy@6FwRB9Sl)IC#nvi3^06de7est`hoOCSL%*;#UOzUjGp3sj>piis>ZTm` z<MhC`A~e7*ED&(m!PcKpP3zl?6@=+<-KN^#>oIk=h^bWje0+F|TO<~p$@u6KW9-f^ z<?$6z^)7$km5uB%JEORJ(|({)YUE1G(=Ttl_F8aJW^O(kl8di`gM-5b>%2Hzo{Vfd z)U>H>&I9v|zY)67v8xg!a8BXuM<C>3HB@UjA9Gw}Do4Z07Lc=9xZRY9M{nRns0vz) zs<cl&Q~ya!pZppx@!-GAku=BVcaDDszmrXtn%AbBW1nYuwLj4Vb2MlubTM&!Gzr&a zJz8V*kVVG-<4+F@!xb0EC7aCUmh1z<3GFY8G6CtRkwO&FFyPS(3Ro&O;IW(&3B0}K zfWsg-GdYU`o=>nx-x~Z<FhmqubMjEWpF7RcdlGNMJMxa#eKr>4T`3Vdxa`_yR*fZK z<D!e}ypPdOtDYtHv$q*9*}Bgjg^Qvbw(p$xgiQo&oBUv|dmq`hbQCwZVnJxkQZ|P@ zcyTpYWm4G<SIR*%)69$KR~7MRva;&O&$%R%eAhWv3FC1PqyLYo?+%7Tf4|m6PxPpX z=skkfMMxof?<In;SiSdp^+fL_g6O@MT?9e&vidHfw`KLR-o5WP_x|n-GYo$iXP)PC zp7WHWnKeR_8&c_UnWQ<=X9k%QRnTNk!_|BtM7;M#uv2<QhNAKgxYp<$1%-)Bbo~TU zc*m7%5Rl|nMR&2I3V~*OPT8|~mTn!($=S$$bES13eE$BOdAz6?^}!rk23{+)^KxVn z@9l>#%L4ucF)_z&=!1?715Z<SE!>tl^-SFP`e{WS7Jla49+%V}Y)ug56J2TrsyVNj zj=w(`0CZDQp*t+5yFHr`;l#Tcp@Je)KE|VvLR_(F#C`Y}CNncHrJju|_5UCX<9~)# z^AC3wFhqkVjS!3Lx;ZVKJqyBIX?^Tt*wQOe03fLDqAJXT{ZK|4<RzeX<hqaw^vBpv z(h1f62c{7b5&Fi)AMa5mKev#SM7V_EWe6kcV6=xI`VUU66BF{t2H*Ds6kDU|p^qJx z@>?8#e6FDys;f!v*<&saguYjAiVOeH9a%3P6U7#j(a~owSG(Q(FraV^L^09K%fds^ zq@p(Fv_GeRiN|vmPNj=YgQyDV-3WEs$X`8?lh4!3)vZ!AX3Qdk*K)-S6x*MV3O_2P zn<hOB3j-d{>e<6Z1Q>S=f6aWoWw1W#zK(y)NZ7sg!EvZRb}oH{Te;UL)LEMI$5caB zVvo@y5CwrgAo}rRtg*^-y&o&z*P+ufVD)Fa5$g>ExF1bCknF<TkIgF(?ws4RgxwNS zri$An;jkJNz{Aj#jY)u;xV~eln!F2#DQxES4AiF?js6!MUH*)e)lLgoN}g0eFWGqP z&-FDOScso`b|M)&?hZf>u9IVA{dohjH#C<oV7r|0qXszjqWwob{=(0rd^W}P?X?y> z-}Hhhdw^o2!iZXQ;TV%6@J~{eSpR3~!_$iu`uEa@)(pX?{4drR%DJn*EtulpDG76Z zQEFmU^85Jued_iTqrLVnPd(Lo(}PC)N|ox)fDTfZ78k=oXNURJ%1_bcY?Do#&j&J| za^PcxGPJjsp;tb%bv)f)(qd33_#YuLX54qDOJ8}qMuav8!Z@(>|0MUYG!crO=_3r; z38#Gd-pdbogqKdt$*HE?S0SH3!IF-BneX+#dNQG|yD??XcM5+|(x|?<pB#|wH>vJS zdh)<)?RWs~(%sJkC=OhAc>5MV!=8E!d6}bzBG8Y~B`l&6*K?Im*nrTrR1GA)Z*6es zjMsiIskHZQ<;|cGRdKL%A#K!0#3zFnnzOMf=KSMmGomR4r_*|6Wo4(!pD`20BbgON z&#-eIZ~x?M6B^HGa<isdT<8fC7;H>j)8mrDP9T-^^VLWGcy|Ca6xb<SpOE1BxOGh( za2dB}pw-e*YKBpPpCHqYV1V@m5!_&mAz>E0#?H?OI!1#%!c|HNv{S&M$0NFG6)LyX z3$@E8bMddl1itV#X-ID?MFR{iyH1ZfEaP8WVZWn?2(t(6B|>J?+dkHm{<H#^<QLV5 zJO?BX^DQ@zFF2F*_ejD}qPbpcQ4uI`0fy?-WTNFouD_dyM?vFe(mm{GYJR@;6nac< z9#ewAL&ciASXH`(az&c=7~IO^zF*xYnEp~IvU5_*fb3O3X!qhrbz$B*73?z_gtz}Q zif8roKgda=ku%5#uf7CR5PlE;*^WSAC8wHIxyebKAfy3ikH{~VK1G>bBMbcwzpQ$1 zE#1vFBc^1LkI<*j=OzlXrM$6VNG@Ni4wpg<M+b+Z%1Xvcstegml3cIN423JS#}Su` zXks@2bg<SByqHWPN$PfP)7AUvn2jpp{>y!ixrH{!hANi;yt`378=b8Ct)cHZ)5<)} zJKWbUj@j4YEn`mEqm{}2j&0!-Q>1T8;8)HgT9%|;7Aqf*{K&o76yfo@X`V|f!<D{- z!xDir2GO^bHtgJw{Q1A1ZmC8u(Je68kM@uPcpsSn&~_)r{>F-T5~OaP7QSsY^UCtq z0MlN>q|Y5eA_YbbgE&sYOvCH?vxf9aaJL|(EG3qfOq^T}O#3p|lN`x$w8Nu>r-Khb zwJnZfAi;HP8D#BJSNkfsG1ZM-{yqNy3Vl6muefEm%;EOB`fm63sCzgz!<+i(7qfXZ zhhEJC917CzX>M&D&J>Nvct~k|%$WZ|=)lnUrQV<b<<QE2ZorF>|D|N7RpXTitv}y9 zd5{*d7%cy?(n^}<Wpl(A+z*yhGJZwGo?;JqSz^+9FNJr_z_`_ZxU<Hl;#07cRf>CO zGMJ3i;MncNBU6b*v@aK;p!e6v$QO`95g448#G$H9o;<=y9YaZos~(+&HcBhW_2;kZ zB;vGZ)qLN7^7HfBVlRa~lhjD=fzb{qyo;e?P|lOu$K|+;nx1P)J%)=iHM{&LreQds zFgfmbwaO`?(VS#u&}MMXC7oZTLh&?bXm@oM5Ir>&ZTTX4>P6=IRJ7KVMEre!mJ_g> zd+~{TW#b5LHd~cq=VeSXoCM&GY%+p=Ry0A8kzoucfiWt%DcdBCX+`JiWr%S}j<|>f zA49&83?HGFubeFEtC*^HXc>lKpT-Ok{`-)J#Kf<Fz&W0ldJJyEXY;NtEcrmK?m?i= zAum5ZV`sC<qy21(uE0sW6at7!YOZR9eUe_SSSf>J86RbDRK`x~NXw3BY^~JIuc=?N zXDF4gK~3i##sJ=@ot{Uz;bx)3v5w1ct+zmrVx@yT57lZ>LP|$KCkbq~m5L5oC-%5b z4`%z7zkIH})Aiv2Rf^rZG)(;68JXZ`0TwJd*O>6PgjPp;!{En%+EFd&A%lN5s1S7} z>gT4}?@DAyZ<`}Rr>KR>5~b{iR=MWt@I-kh>0L7Bz9>!unEO^bnEC5*@LFtbB*|`f z15lUmZ7$Ei(i&RS*S`m~Vu=&R7Z#L6(+WlMZ0zkTxNEt&hMbJJQy%<H_fIM-PpeFN zA#imu4&kB#>qc{(%gfXG`rpXPWN6jKw6f3{eX7;r5O-UB0p;Q7OV8Og2|}R!4)EDi z2BMjvXY}mCcLkQT)en>kzkV!2Ur!|`P805Z-RGqE+<2Nejq=&+zE7o@oK=pNAbOLj zg?FFI-(dl`m&@9!=o4lQl*qkcn^H&qDgt*V8El=oX*gOT1G#4Nbkz3EA%~Qg{KRx( zKy#_@3~GiJk~XU~_-}cerh>~E?4SCexQnva!%Gc%v6R(%r-gUJdOX}ev`ZE=772B- zV`jJ1#Z|gU2{<pkDc5Vlv)8cL%&uASln9E&b)aZY<&-A*=+YVW+u5%<Gd12{A2?x% zOu4zo4Gbpx##uDiV&S?WkMDc2-}+$+te8D2IdRYoCqs#&5L>B@5lRM2jWX7{6tUGc zvQ7nzzKbL1an{}O81?hav0)xBd1}*>)hsJc-IWr_AbgI=QZR;$CZ{j<|ADM8p@+J^ z`v>MH73AnF`_$Z~H@Hs|^8CmQzcgwFT$?^B+Hydpry#zaKEah>cC}}DI}#e2QcHF> zmw*UmzLbNwtX(?CGsrBdUyHXo*g6zdH`4^+-=D!QH=CK|xyXz1djr6RdqXWA!oHpd zUz<H0UZZwfgzL)=F3N)%$`vI)J3m?HoLmi4D*Y4$(Kq!ueqgztbg8>aA8td{rIH-0 znjEK^8qD4rKD6W%){+5|&s)tLAd2gYBnQsaH$CfXKipoAC|{rsT;*pge-h}Bvs5WA zYO~7eRBRa0S#TsU5lN~^C~7yisk>p%iYgZp;qpk5_78UBPVP3znX~t??F{5Gv)K7W zk@nefE<s6(KE}OJ+ld=eW*2B)WPHLX`EmeC3U$^zpqvHc4%ilGbGxjcK{a_r1>RRv zHZ(W8BKfL&3}e<m$y~LA74%>!IapN#lnLuODCuAO1yq$3%5Uz1X)a^O5)o3<L~r50 zGs3r0c%?KWo{>n0aRlEttDgtBhI_L7k%nUG2;(&VEm^u=h;54nV&8J?zLy&_*mms^ zM!b>|!EHW$soo|A(C6)Km7AVDGp{Bl$Q~B!K=nHwc3F|Q=C00DyvP=Jjc8s*>M{&q z0>uG>FX1<|mfU7?54D^6TE!(KB%N|7Ta8l(a{UO4_QLI!jGDRMz8&bt{4~5JFU~OH z`1zZX1+Uke=QNzwQt78uT1?6*7L!`UD%9R5<IbwYDuM@G)_y7zVbY=4<z;nZwH`}* zfJ13x>2KU=pwB%izDlQOId3odlYhoSaeo$xfP6O$Wo|b~^mNg~(gBZ{0xhnHSl{!H zxiTyhs;SNp_a$&AtkYIuZbG_#TgFgN5*l43&m^0xvWHgo;mIhgSVoTaUVh{RzOb#B zjS?D<a`=G0+B~eI!EiJ%Q?UL6gdwN#=$CCQ4O?#`TguLpl!NHeN|fKutjfp5roxoX z1evQysmsP{A(+i|N=PH{X8Ujl6Ap3gJy<*(P?o{6#!ESr6R$+dZs|Q3I)EJbFiOmX zW_UB%dmHR+$G+Yop$$LN{T%AVux)}3^i`*zP|w^7FviVVt{J%ftf-sz69Xi*Ep~+d zR9m7+*ZNP8(JKC5CN=3(kT_$43uH3wPYSlZBX8*oCUbjb>v#s@XHSc0H;rm6jq!}L z5)wT)-l@*E+ykPRtH7&oZlA#E&F&>!>+4f~fa)m`ZD)I2l!WLWLOuAFXEc{SRufEE zB-|$Rs6u|HtdTu!*kz=v^EdL!?v)-iHNx@T5jiSU4>$sWKN(2K!?90is$%sm-?IB& zRZw;U;40$T6P*`Tx#dsAv9=&sn#x@}yJ>H|Ti_QuOt~2I)XDCbL9W$}C4}#W4CL_o zSyXuN`h4D>F?u`}oKwjs?`T9>F*PSc@;E$7*`5uPVXV>ouY~!sibiUqPXivF7Lp4B zoS63HM&tzM@(qpb$-nd~gxnmLLWkP)sW|@Po5gXn?}&7(N^6}r=sJq4-kL5=Ldv)s z@>I2MO3a?0TU2g9Q3AuoD{bO@?amU8y*qv)LxTdxRPBCq=5&E@t;=U-hVv3^;j+6` z$~XfIlED(ElWU!;c_;8FAz_@5D;$JYc%A2?d!awfvdicT&c8(^Ob3mY4XMOv9Hc5D z6z^TRHTZk=ngMM?jU<URfmLBzC^KYr{X65{OA`Zfu{4hsZ_i+NAknYQrozV1qnlV_ zGW4ige*&h2q=dTC#MI1))|kxO3M6-8V`38<_Zfo{9gIv2Ao%n2RQT^Qx!ZlYhSe=B zx~oAG2Ynh{a`+0_%OLHMU4Y!`o=tVHN_JBH7QjOQr`vf?@rc2!w#}O5$O!pDn6bLh z6bp1Xa*_)@J?@59S{enC4k#w4b-hwA+^UUK<qZtRRg%$*FVRHI*dq8u>XUi^S7PNo zE)%Spt+OFEwa@TWFXt2~WWH3Eor~J@#-dm7q-YN*V+1Aeu(t|~@do;eH5>0j_9!6k zF0CwXrKw+3&oNZD+7xZt1lhv5cq%X(*i!b`V2#Ylo5ur8>jL*{W5*p=_n%!FdPhxs z#|`US$yQLA?492`Eq+Z~UT(>T=14OHJYZSIAIiBGX^rK~=|>;inQCH|^u^gr5CAdK zWH%wC&0}~f>c;0W>8~|j)C<<X47@bOZz?fgfGCXkqA(EH_>5bNiFkk10NpGe<o*7? z-D7^1@VblHC^tKt?J{xoI`wf2#qDr05q#JX<c#Ks3G?z+ejB<RtJrMzo5(~gV~v1e z&qA@@VNujn$_3}$H-3s^1t8zLrKSBs13@L_T_@0>y*RSF0J-Y?n)O7xMW-wip`Fj- zEGi^4v_0oFhXmw&Rp%UEnSH~agNM7JnX$8Di#C?7omCh#4xjw8Pn6cnO<$$>-KLU| z`8D?UcUa`hkzX@Kb(CK3&24*mCB~iWxD{O5sB_=8Ca#kRjYe#(G<4=bSLXVvNcheu z{^IXCp>ZtYROe9pfd4kl{rXjBK)EZg7{8Qe$cOYQ<=k0q)Fze3koH*he1wewB$v#b z6VgV#cw`Qh9M9Y)VF+y2d1S1JY1BhLA-`1{D*sv4vR$%PdKtc523N7KO`)>8CgT|B zy@+DZI_mz+NoAs`KHYGBm|*HVtao@Xgw8F<E*i@5W=F<SZMq_O+d&H8x&ucm;gPa5 zo<xjR3vM$~)eW_PYgRZM?l>=prkZPHfuta~mU-rdoGEdM^vh=25Dol#@<-VtAIO#- zrXB{KKTO`VB^xh;SMg?(!dJ<EX|J>z1x2z?mcnpIsfSih0-pS#o8RThA^#K-etItB z&N5`TVrO>WJ{IV41j@m(U0;6^cnN*wys87=e(VOK7xlF|+n=_M|1hlT*UVTXl9ZIB ztg0-0iWyG<={m9u35t&=H6F0AvyPxBQDyVlWuIytNos!S^^&Wi_SXniMtb_kk8a7e zwa?L(Zd@rtUoN#$T-TAiP}W-JG_UyjCS*!Tgf(0KI{LI>i!CbshcpJ?<H*ITLwGM} z0a9Ll@U8u`A?r@oJ3ceJWVuc!97zf9)h+h-q5{HvsmlV~VlQa&46o3LS${pRVb8dY zYbu@Ql>1z+xc1>G20L*!A>8j_RT_3fnIgvGuBy&L{}(e@WGUBvt6X{}f$Y!EgVX1n zRc$NLv{k7&Rfm!px<XgEzmsr-lDNia1F?q`pG!-RjG<1|G<Zjk9x%RjJrDuF+g7W6 zSG?1Tnt>}jjrz<+QmTUIIw2DRmZ4m3W%L`S-pns2_#~Yrk9w|q=hjYo>XkwrML3}! zlzeK(*m#wVm_#ezKE__BK#l>SHNzyZz%3y6yCtlSx08R6>9PAyMSi4&p0OF18xSX2 zT6S{kkFb)YNrG@#7l0{FR{B~8)00BCb@3NhoSmy(F*$i9(yc`U9XRV_E#OP7>euY7 zPA5PYm&C3W(<SZb!zxuK)aEk_FwCht%$@{ad(y3+ElZL3^}1m=!BC4#y^_6UEq%5A zqsGD7Xx3sEDFedHwmmjn#{=ooq3ofhHdm_gOn0xDF4DtR2fm9gM@FavdOBiH+lF5Q z!9OkQb#}ZuxMks(8@4XR%XYjd2;w9WP}X{E@D61c<1UiyV0i*aVamArakLC<K&I2> z)z~?DF!q02L-Hgxf2`diId4hG5m^N(xe!D#a0C^)_6#%$ky2}McW>i(m_N|rxA;mv zA<~!cpmW>rAF<9X0PDov_y!zOwB&0&JoqTt{Izk-Gw`O_3(;N8cgj0CKQj_RLa(7T zv0~SHp^~456n*ZRj`mr8E0d7n!=U^qWmis|FDB17N?nz-1i_s>D~<l?({zIs3EP+? zvYKE+1CV*8g$mi}#n)nMb4MnPBhEQE<PA*(F(uE@CO<rqOhWZSZs6+LKe+X0VC_Fs z<2L^(=uC$FgT43j*X^+!KZ%K17Wfiu<R|=sG&%lE6&O|NCyxEvDZafIWyfw7poyZb zzbb#OO0?q^u|ANndKI8T2LC-vE03<@`0_ZiMl|`;#QitzS%q|Zddui83{^IDle%jk zRza&pSen=y-{%-tr8GBQsH-qS375aosv1{6CCF|m-!>|k*=X`d>x)gM0f@#s<7U3G zg;&KNeCSOlB<7`M?NB1R1Uk7917`X@V|!s@CPPafkFDO+BQ6!(KR&$z@-><CHrOho z>`bz+?qGpt7+#A_amj}*>qdP>j#s?v>o(J;Zn>JJ0Dh#gYq(;lG>!Qfj{ew(dcvi! zeAOS`JVlv2^3<{2qrX0kB|v_1iaw~>5!Nj?^tLZg1mx^J$vG-bjfm%~@z|cbregq% zAP|D!OQQR@!NKrJXtYX}=#(iZ2BM(3Cl%Fa7SdO<^1yo6`F3^eLvdd0M+9ARlF`*# zd63e@ss|Xe1`S|p>w|6TP^HD1({m+M?8rBZb%{?7a&d9;4~6rfU(MCHg-_+>PF%?W z*s@;Z&bciDf&*!R&;FMadpuw0^@B+MtqJ&_p$oNo$Vvn@|7R`1Mw~BaDEH5X`KMcU zUsQT?0G2xEYi2+VN(#nm>#utv7*fd7DF&ZaT&b~v3xBDxUS!A6I^<$-3uzp<9>-~J z?U4$*4pr0SrPeSkNO?2x0kEK_6mDr)pux#FS|C(aST^34h!g)Fz{AMB@cY(INQ@u3 z)MEApJUH$Ap+b~viIsq%vbBn5SY+{J3H_uU?3E7=espPm^90}@oyHwfXi&}-N+sw; zs!Ga#mHhE&>-AOyhc<qHJ)-iMuG=U>58Tu^r;6Vn(%&_ul(B{{b4gL8*L4#691qAR z_i*$@zj+1Q*>+)PD}L9B;nwL+yLRgm1(5-;{4QXfe7q^Yrc>h9rTnBx0{X%JAYi1W zHoZw#*^{PeJYGk;UnAOYOlRATXm&2s9oY$;Y+9wl@Y_HMAejSh<u6fELeG6v9l`6W znmd$0Lc}67fqW?q(Q+M8$sI=99o6=Jag1jH5hPVrOXh4beO`Xp>_?F7;fG?q)j_1+ z|F7kC!naiDylS+~sOjK=*s=zkzG-j)n*Tj(s~cet%>TS_4{^*{ax!ri=tvtl1zCsP zM#u1P<OB+3cZJjeM|~9r;JU7q@|WWEx!ow{o-)d=t>bV3zub%r19YRwm|yQV=rtBT zCSb`4dwF>|Xk#gc?D*%pn)7evFQu&*mCtI+-B^QlScBbP{}hdeefy;o<xTLkLOYJq zkv)+9x8QUvlr^%@KZjP}x7Pmr^w3J2chyQ}$%{O@cOnDdeGH5Q!h!le2HTmgWhJI! zL;0p&k0eDT?-{a|jDs#6bg6xW@L>!<{=mH(eCSV@(<>L1qm=5~nR(y9Z3_xTGkP3a zVDIGbpkse!*3i2r`3HG2z9#28Hl_!pd4W{HgSuL6&O?A&SYfR{_flD#_^dg10>w?g zc`dDFFRPPHaDF}ZNoC8thhck@_Eh)8SXnl)bo)wJ)}8`aUwha6fz-)Q0F96Ce1|vD zqUSyy-2H}<xuaLEIa4WbF(yjs3{L6Tx6{J7T(|z!6v*{A_w+mrto}rzHH}k9I%^hg zmJ=6OnCnAYOv9yh7mJ^e+RN0fGm3SArXXp00sjUW5zD^=ZV!Xdyix!`Ibyg$Dg28T zkybN~f8E`xK<?E`w@(5!AF<j$ETjy*WB!_Mim%V)d-^<{K|FR#ggwY#RvEA4#bZbC zov#x^q_*H2=sr|k>4l)-<~E!`AU9+EQa!4>)<p-gTLw{K59LvW|6r)3`P?}ehUg%G z8xknriG5bJZ8~eNDFO_{pYhqFmy1-M>hRH+XsKpqx=f~&I0oN^PePDPX19HYlTizK zy)qN&`S$PjO`jlhWwUx^q^MQOrUqwc%hp=<k>AiM6019vFA#8N7JwRC`&}(kypTjE zD5w6IC?p7Cc>CnRdw`nqw|3M{o@s`($Ek;n-&(O!f*J6+Md4m_z6fc}8;fh<CaoFP zfah^h=1Iwr38@qpTUa1RSz*kRoU&hihINca+jAZ?hCn7iM7bZ_Up6R{W3-%7EPlA$ zv7K?iT>~-(p0^rn+x1JSMd!dNI>>8fT<q^|vW`#_v7BnTqBeoUK5EFXPKB!<)fU6p z=pcI~c=%Acax$-0fJvUw$9Yve39rkPbodqY<OUMRpWN9x)A~oLT-}KMzZeVqE6Qy* z4zgu?4k~gadG>xk_`1vebC(;H<cvu*<RekqzRy{*5PdJDU}kqWX4g4H@7S-JC3sH@ z(ocI1Ysgz!F>TOnpkZd)%TZ?a6fxu(>e@JU%Fx=1$)@9fA*i{zub)w815|ni;KR&$ zhtkD)?%pF7ixg!I$YNZa&9fX{U@&^N)9$QNT%aJ#s`T=$?-{umok~Y<*<Cn=Z%nd_ z=|LAbssZuy$@zBcCqH-1LKO<|^CIef=-aH*>l_=fO0TviN*5{`-jk#SM#;(=Dx%)3 z0p9(Dwa~bKR>sB0luO2o-zrhdbKGmaM=jQusC6!6<SftVue4^Kiad@vn3@ZS8{w)D zX|yT;hB@hn&;bWe?O7Jv*|PWA=9;8LVOXWY(!NJebM`)1TSr{nLE631eJvWFh@FE2 z8`umKBbu=@`rgNr(35GR+^9#pW|Z%Etez?#357Q-|K-^JC}-Jkq8b{+wU%?Eb^Ar2 z%IUF+;F@`;&ZU5(HQw2edcm%rutx%32tKlo%zKY`>?1T<;cM`J$o;=P9h|3wXes0= zoD406ObB);*q-DD{4~jA6~t%<^u{ylyLzKC0CN|Z(X9^pmY27(f$?Yq?V$~qqJ7s^ z<0?o0yvEMXC70ome99`m$>;vE3qEmHdGtdsd)+3S0(vYzEm_(RmFPDm`^nEoCPM9j z89YV}A?MleMb{IDKN;5ZXEeyaUwE43@o7-3;UnXMkxAPLmjwD_anfybxr{c#E&+ad zEX3;M-f<P+FVP~TJEpnGi%XSH%GjsMuldy@ikFSg{yiV!Y=Z4uKrcwNq{a#Ym}vOn zT{?~UeH5@3nVNYU_g)S^>bdL#inM@-<{=oeXgTB8R40(h`?pAIaImCK>5@$?$(;{R zNVAH?4P~)jC=q*V_pu*^lKIBBpP+WkoS}zdwI7J7D+=6U<+k9>v!FHD{ejt40a;g` zW^F@Ie6w+2Z$Mj{&-l<u%*D64HtXZ`Y8NzULksU&LQ@vwrvhHI-C?NS@bF)sC8n2h zaOR=-DgbREuXSqy=mA;^3pz1<cxzrG!ihjt<XiAPjg$JnY~Sy%f6u1LeYZsS2*eOb z6|yS#%#=<0QOWCq19Bz!Ebo#tMtNP@VdkT$D|*_UE_(IY*!Yw1vA`~tAhedybwq)K z*$i`*1kP5xwiq0fR%-J5T2Ng*t04<lIx^FlLIURLTbk}cma^twlbuv{0rSi)2Hau` zP}YH`)J<pPEpnuhp*mMtpMS*p2bVr-8*~K@WY#ACc0x`~|9EhYC@spZebOXax9CR- z`ACiO?+^lYCyrs*QaQd?`CaW{&3+FjTdDu{8>AiI$`V<43VL{kOUiPbg$|{Db3bMn z?KQK{Cr@YrjcF1+V<!m=MAX|+tbt<`bD)b3B!j|U@f6mY0;^@x$(%ddMCnjIi7BNE z6WQp+F1+wH|090@ne6R&$e4G5I=ug``XyIiZb08yr#A}SO643E4;`g*i)p>I`kEu9 zx|$-E<C$-CVX_qSdd@ua<k+nHmsI;#_g}`-^j;#9kb2ke9J#@@$KhK!58!6+1)-nu zy3oRKSJMgoAKl8-(YXJO#y^4dK#%<bcQZINzMiV3YZV?#!iM-oKC~_aAfa#1FY34k z%oC4AKI52h;Ic1Z+%LL8-<(kvN`WQlaJle_N8sUSWM;BHAZPQm+@U@oBO$5tzwto3 z&=pI(8)K|`RH#Ek7c)0x>dx@q#D62RwUJ%;sTt1zMSlZJU}?MQos^EGu0a`haFX78 zQ(!lenzlTxk3`n+?u$3+EUEAJEwdk_vA^0UL+0@O+viRZi!TY8vOe+qWF52<?qT&w zpxOH;liaKMyt@hX&^}-Ct;&!Y#l`P9O|Wyq%997&M^jHSw{8M97+|#h&`Nrl&ZAur zxZ%Ed>|04mg1D<|l@Y%~!^9o?(a0$6ua`m6hn8E!?6@Bx4hQ*G%ke`<3y0GV{htn9 z@u`(J8cN4S0s*;dx1%6{f8Y;JT&RiXvmIqR-X;Ie-t(1>d855jbw^c+^sjj3<6OSZ zU$L8FGkl}W_c23O1N(n5_Ty3HPjNP{vlu^2R$cd4#$DmGJ}la(PO2004n3oqHCjzd zQtIwMgNuD%#hn~vr1NM~ZxA$8B=*E$MvK9FXlXGN4HWs^>u3L~#QZp({9h6*AVB|& z8T~uJU=<R48{X61B1O3Ti}5K;T+kWFMP@WEKO#asYZmK}t@T?S(*k7%a2_{oa{ID& zo#dqXS}b3icVd1<5j~BdWTUar%|)i`v(|60u)x%Me4$Sc9fW0ODa8)h!om!yc5aMD z4n&LHN^_V67M^$+gy2-gPkZn6Z#zzfIZb)TXaM9x>F6VD%m`(LYZT~sB+T+JXXxVX zye#Zcrr-(v4v+~hmwD5|MYD^560YmT%1zRS|4jtXAWZ+H&glf&KM4D1D5i?Q`}>V* z(qIugB-`hRCvjZzy564AlXbHmP7PEZQ6~Eq-6uM50oDHK<W@KvltT=UB?}#I^QPg> z>)y2^vyADpwJkw5U3^^<rdYSUT^hR;-inN*@pEi%Yn!WaexbxAVF+JYG?_f)rd@n# z5mP|iRJ5J5Wh(X9{(Z@Fv|JVI_r?4-(cFo5a?<M}Xw~&b_BnQtfdRRGcxSTC(3?8H zaKOwA=3VFaS_00Ib!QXYER$_#xG~1ez1s!$kt|xjU!h62<msUJ!{Mz${=+Z4(REoM zTAo@VsIdLJa8~O*B@aLbx=|Z0m{&SjPw<oW2{DKV9}Za<A&nVawcfW0L+po{u$Et; zGX!F_H(6;T^EW6ChxG3ih&i<940;i#EXYVEl!fxinWA}kPg&VRN8Z#WDZGlz`N?Z- ztGg+!JYq))8MUv?^Aheo&DSjxhJen-tEvfJ=_SELF>1=yD;f(Y+)j0x0v10-DJPSC zEj-m<Z+e?1GG@-On)p9!q7xx*k^Qm5#jWyjyktDKPH_8=-_=nHj!Q4*5^!A}!l8p} zkOd{MxupYVXrV$4h}d<f!P5n~nPxiIeu1iewaSyRQ#!9*+VBQfPKNh@VY$BXTf47f zb7d$J(|X|p)tvGr6X((?^`vwbMjy6WYo1!*?ilqIvd3jcNAhQLV?oXBPe$9ON|U>V zk=caAZY@=|W1oqSf<assoAF^g@Gk-u!&?}ks%JrlIb;oDS3pRWIu=E7uzNYCnZ+HI z%+m~E`;~_>m4%kbF&+h5xGm9oim;O;0-gM(+{c}}Jj~2fQG=xa;1%^Byl~NY<)IsB z7v!mn6;{_+iI9@bm(36#l73#9z(z4wCU-}SWmvGg5Y3rpfvbD^umgS(nh9-;7sy)# z&RmnXYhcxj0p7Cb6ni=d3@H{QhZ;%gB<-sVjTWCYC+^2NzIqh#c|FX@D&@Cj*;bzc zEMnT31v{H^2+10}x8X7+>@@Y!DTg6m&*5SBNWWcf0d8Wq%<lH{{n~n(<m=9dnbBsD z;z>lM5HWQYM?k@w2SyLHz*Rk?nG20Q+tqyjV;8q4OVSro;f*-`+EZZO+*^@;c;8L! zxXS5WB@FM2;5o(7qL<MQ4Z}gg2J%H@v!nm@ph-Jw@UmMgLvyfrxG2ENUa7fpqRrEc z(;st)x*waC&}s4J6ZkCd6JX@mDJ3&%JVEgJ^X}W!8BI<%r<rp`a|@tP=7k$WuQTOu zqqI9Z{)jV5Ytg5n2YspCeKp#rm-3hLfiW50ct&&>dj(5aN+qeC4M|`;Nncj-U&C*0 z$1CwR-q^xZCYN#duGQBm)VW3S*16|)BZ>;fXuqRUTwWlmLgSI+{=tv+uSWjJQ?Szi z&<*{t8!TiNTKn&PiGJF`lS5^U!XDwDHv|O|pxx-m;&bKHV!PX_bly*h^pdcr55fM@ zA+6-ABqkvd5|x=9#}-3rDm|AG9o^(J`uS04&JD0YuYms|MP$8h1kJYzwWsmK9Pt^{ z6pJ0QI0BQB$~wdLuv!~SVbM}m@$+7#*NvqV<08Y~GjFnFCl=EmRGBmfcq}(2caxIj z=gQ)_mP1+GWaby0q;kUXODsB;6s{v+c0Z~cKa(E8Ms+GvRlbFG-rd|o_wkSXf4;f% zb$Iwt!Bv?zbn88;e^N9NOeM~c<`I7$`g`dKq`ry8M`c=4Ob~DV=CVI*z(4QF!bND% z3lo#AyoH9HFE*l%w*$IklFRMBdY(#qxtCkDq5)7Y3D`N4Ch$hEA2G~)FGePPN<v*% zW+-m#xlHm+%QiWreNnZ3Q8GqCGDsqTPy~SQNa!+O1pZF*uFj^0&kXA^@!ZKn>rI1@ zWBlW>dq(RMqq&oL^#^+lLxU#cKHM{}1<z-6S^+7fQ;??b-4zJMcO@265q-Yco_2Gq zJvEBDh1+-mX#LO&{d&>!v_JY2dXgzIm*9<m8H#`aTItuwuixo5B?*16eBRWK=yK## ztzH>1c_0bssXEYibyh&Q4T})F!$Nyp)_!xLuIlspkbi4b2~D|Mk8m&zfoK&UHgnUm z1Hq&uJV^NR_)2IfSzW2H@fBCNF8A(6dG7$p`tftS^As$`{@`+>vaQczRpg51MLMr$ z%M`wfCDw^Zhm|7}H*(g)KnG1Iul4ofDEMwvOnl)>wRj7%oKJqi<R@MQW`wNal_8lz zzlcT?4yx_K1rmfo35I%D5{KdM4K1kDg+<=?eVv2VBDJQNuYTS?mkSD3-+hHvd^G`d zpm(VLqJlzi)9Ee1;ojbWe<0=<k{fu{ALau1f^+_Cb+6Cz_(t*pg2iCpmnrvXQP0@d z;ph<Ei4v!vxSHL{153CbF3EV>*>yIi&gw0{xiMOa){Le}VAwP{@{%mHBud8UuPe6U zyQ%7;E}{f3vw$Zr#Q53<BbDkN>q8?=p!nhExMtv)S2iSVY_}iIcr*q6axv6sJ=jiV zoPhEtFY0$Z?MIi_J3rs*Ua<3CKI6CcNC~(swVk$9>puO}gUmhe`R31OhP`6M>B|!% z{%0Zt=KSB7WTDv6ra_R849Q_vxSMn8Ux&!Hk%mO+v^H<#J1#|;fFA*Mp_BS><D*W> zDSC{{fxt`rcxG9RN8nnVc-)%xF!IY0kT+3|iOHuTrvc{f4DYTt2)iN;iNxkMZYN-$ zV8Q8(qODO1g!^d-T7rG*w)YW~-JnA-pGDb2MZoZWk?yhb#u8n3melMM-@S97(i;wF z7CwoOHM#F4tCyU^u9xXrp-1lBo6N{SilR&oSHy@!lmToV@Ep&4YN9A+qND9<<#0Jr z=q~C00ybckSDT9Q;47t*6qACq56MG?R{&Kco`&6=0+$KJ$k|t6&=R&-YB&1>?v1Z^ z?;Z?<Ko#l$sokaxXN3XXxm&CF!6vZ9MIUHo^I^<nKX>X_>FVmM3phNE9(*wZXwS*1 zdLEH?iHN*hqv;xFB{03QTW-0>I0(n$Pt7~@jsT+DO{3N0iRDA^rv49jG@<%<<=L;r z)4tzdNqzr?=jQl=dpS~*OL>Q~`*)#vG|h%jce1=-lTY}?G%|AaQxcgQ>*E&)bAmTO znOI@G4zT*UOtT%}55+V-{ts|1FVRtG(Ib=<=VqHOTr*8LcC;PYG^o@5H*T$T?Zss6 zlXXP|#YR=u-}jh!1p$)7C9-$6>>M0fgm5w3rTXGXXea9I;|l{yrbEcqI7<K3$u7b< z^mb<E?#J_#&m9u6S8oQ*?6$PS9CdbgTlU>3O6kYmiYURoDZpp`!8FR)&?5ksii*j# zUT`K!Uv*~n0EnWrWsYa1LhmTVwGo>`xI<9KGHP$EZswDKevSAOjG?AY{o5M9yEE{M z8%x>qjVIj83<@F5ECK66<6p+(h9!)EJZk`hb8%HvX4`tofW`teX7+hk0*&H2BwhXV zP2$`|hdSlJM&7!sKQrzwpXW+zJKC6rS-*TOaaxr3u|xH8=SAhgRZ}_UnO@+rZ2$^B z##OIAxnL*?TIp#j_rP#c@rcbcL^9aA2mALeo)kP-87G^M(PNj0QZjNI&3DC1>FN-= z)U=4EyYFZpx8dTC{h~3wt|o8$#pN&|bycxC;1ob;1xi^T{UhP046*U||H0=$2qH(V zVE+t5UWF{4?$gX?gRjbWvRm*d%5N{qJws{!y1TG}qdjq%=wI#-Q7R(GB`&0F10U9W zG;-Nrsh8|BoW5_cQ&_XH^YhE5;7|<<(XpukI`)=P>I;hQW@Spj$dw>Jym+D9W)p+d z^eK$-KGh4qn><W_e8rAn2?6KMO!0zE;fdK<dt3dIYbk{RbT}ovy)b<tEAiG~dI?7g zC48PysD8e;$tqppaA|k_g8ir-Rer)f>u>NRC1SweE1>S$n8Wv$Jr|T%EpHl(-;^x& z<~GxE7@zdE|1?tO)Jpbnj2=AN#Z0);!VF4Y5z%k~{Po*$3AFI$!(4S5*m(?o+3_&} zw%r19usTq35qt1}`~q%7&mK|;#8~oxL$1&LWI&koMXBps=E&=~8$yQzv>om=+PL;_ zOYOJjzdFj)F<Xt}<FcAC^5a(H1eiGd8yJSrx3ul(+_zs(>vaWRLqXk9TI!~qOcNtD zR<8wD;UwP>qu(C%GbkT#+yS|AM7~{j%)FQN^t1p4vQ^lkt_lfnrkp%U7wmFj_flU} z{asmd48aorM%7@2DIeWGa(>tm3%UbZ&Fq#<hUq|p|DL*zaI#>|FxmCB*F@x=<dc>b za%<CD3{{fuRm)EsayCTYr|Z(R^j%!vW(=7{>Tvn^w0WNlavV#6-~6;?WOFMN8hQ5Y znf-j5xH4vYCFhG6z8tk=HC0FLkrune#7c(p#cI;B2<O))>UH|AA_Un|r9xo-zVfm{ z_cU9fmGQLZ=Z}nEsDx%_^~l__WYc3>?pm{}b-wEZC%&2+>DDVT@3@Xoi}2$yY!3iG zWZP76SOZM<H~H;V-dkQ{GvB_+-i*@%i>7uv2b%S0j<a*QQn&zAaq*F?f$NPS?{@Lj zA9c#{hCdr*_`#N6*ab07=8WI+?n-#xZ`y1#mT6+tWG`G$qnkp;f$j|E*tXgsQ_<3| zExP(XHoHytzbpW8HmduBfb(_UJUJ%I`oLBP1Oq5wmG-)YY|KZ{R*r|$IA5EOT0_3~ zdm)E9g@#DTEcG~z#;9R9AMjT!d%8=F=_$(NV7N**$K_?Sp}nGf4WVrII^;UQ$z&Sw z^A>4Hxv$z?p^_SAO6G^iU-v_HL3lOQ{_Fu=s%~1HgJ=GwCTXc?p_t9wXe#tE6^cAy zA4{|G=rA&M*oeICl@ZbIHRD`-uGIwr)1lY1^{Xs(YEy}8^1zGc!1txv#m4-Wm3_{_ zhLU22g@vXNAoToX0Sb=S=8j_zdJ%}8Vq+hY*;}X^CFu+*mk#b-0sElp#zZ<pfW8=j zQykUvtI8b`V<W=003$P0YZJi9L=BdSf=pa|JJrSXaihGMoX0CSIjYav=ihnfn#n<1 zIVqSF9Et9BRXSwnDf{X5O9;o}&dijr(Lks{;Po`?m8(&Z-VabRBrd7LS$wPI)YY6= z!PbN#Y9*)!-7hZt6&J79<ZK6^hB#x1aRn4IK?02NBzDh$u>}lq_|68OV9f_tew%U4 zur7{`ww;!v>bS{aL#{^9Koy{|d9xZD{f5ba0{7nr>f2V*_-NR7iHxb>JL+PX6tUdj z8QrVelunDiC^C=1HZq=T2^qVqHVHj2BkBY`-QW+*AyU}t>FSoSF*SAH<GtKko>7rj zQz>NfB`mg~&h`8i89A(8b#;VTM-TH%%(VZb>MOnazZtC_!i;w%O!!qGpYf;rM1CkN zR)h+pQ&NNrMXPJ;T>axF$DT5xJ(^u{#_ZiYXRHl#tX|pMI~y-l>lT-<DQgg8!|ay_ zq_{PEZ5?Z=S@VrRPfoqzty&uy{NlefB`7=FOt1Uv08hOd<9$%NH#cPxj~U+ozGAJ> z)ToBh5g7Yt@1Gg*xUGu|N3XV_x@JrvQQ9shV)|FF#k@)1(91HY=LxDZWn7GNn`=Gx zsv|DhN-SKxX!{1T5?DEyo_mLy{mYC<*8;t0v;4LMc0F6dH+_B`*9Sr$=F%izU{C6b z3IIEU;2#aP^{+F-p2WWfEy0>)uIM@ZlR5)J^&bp$2KJ(6o7j?^!55>F7aN+T%I1}X zu>?l~${35~q7E|S(E9VUAiBp)n~bnPvbSbFQMi-fS!V{vmQ{8`q&MZ9v}Ix5)%H5f zqp=Z$;ezaX$Az24fG)@uH|mP<+pB1NpfByNQZV_GTWo3^y{~?n2ma{$RdGmGm@A1h zpvo_0yU>IEnzrhyeR~hmPGohoRJQW@&kDf&BTU{uC0s}iq4GDa3vAC3$%3)qV4_dc z^It+dJ>|XaHUQ0;ZVg|n7NZ=F`ZJ5}l3eOG3?n4E$dY?o>$fhaWbY`V`&jzJu*6jF zB_xv3h6<lmi>_7x{>*5$$XQhL4Avj($CKRgWqPJ9V?T}+#Oq%8&B<X>59%l&NTB?h zn?tjE&`mH(8`NPYTP=fTjNK{tc+%2Q(mvEWRh4X2c503cAeV}BJDLawuW7=2O{0J& zgOg^VL|&TZ0*j?-j(}cNi(#703hGW)#CL#kV7;qVbOH=jD20hpF~lq@(TOE?Jxp<m zA0<<E$grV5+ea^Z#5WD1WfZOME;Fq)@xQ{VX>cxc^|)^K-$H%v%1s;H9XvhNjL%zL z#`@>Z{knXQ&U2338?+wy<=wj=Y!1xsXUzEZujdVc&`KC&G{=J3p~$P7hX#c1>)ddl zr?q(z{*d+{05%`8>#uUQQ1m8<e`ihAMdFZoN)y%7iplb6tqY;mgtqh@9nl5(EsX?O z>@F~(Bao*TDH51VjD5tF+<BvS5%Fh}Zuq~lh|UMJo==JB^5!^|5cI+%r-kRrZ0DBl z9Q*Xu_)^#*@s!Kly9m26^o6(DVBN|dlCy?Pf&0&8ZpiLw3AC2g@fIfN2AuWltw}sP z58Xf38&Ia2!!h@N5b0PL>79%7o-q)umNm=}JeJDCF%>2-e$>$>cdI)r%Q5tdBe7d# z(Mju3ABnA*gSzXB?@6I^gBkrRkSOvA)_C5ck)u}!R%x;8AJ8}WR5<Xm-odU-!4Fdv zJiApFcg35y|Ek<mR=FL>yCqvWKcEP1{Jc%&P*Hh$?eGw+t<}M*;QaX^B!KrX%PaaE z%bvs$i!qq>AdGX>h>L=8<YEo^fxw;^U4bo<GR)OD++7C%D@niRf}PDiK%KP!hwYo# zw$KCI%XL}Qx4WVQf93gbSw)K%8L^!^5WXRIlVnY;{!D=14pH9Cg>@1dr1szo4A1&> z;+1`fD2-@^I$rf2(Xc{^Ko0Snzs3LA{5sKn##_b+*@mHwe9X;g^oZhdRQML-#cDVC zG|K&S;??}k<?g@H)cWv0(G-o2rhDwm9d8aaaj%1$1l7z<;Z+a5bap&$O$$wqX*=h( zHxo!zp5k)diOb&c7NEw5U0fm60y8ZK;?d@R16<}gpS$Bj_dZp%o*Saai2D&{)hJ=q zU|`sZzDgdfh1HF1#|XOD%#PU+%j(pa?dor^-R3feJjGB={T#t=Rgm(U%0|5ezjl3! zHKn>NS6y5@W7WZ}%{|0R<bEb^sJnMca8-n%Ozldy|HA^M2mf(b^PnS`I%y>LF)9yy zY(XDoO7t-8Q~XD#muMB`ua%Z+N9{~;)x`w`axnvH32}jU>^_y1tbr;fvT%Ju-w8ug z^w*Y;Klz@G=12qfmwi(jXRrG?v)=JoYTS72`^XnmI)JfE{dQijT;zH>A1<}xzLy17 zwr(!$p%?OOZtLzfTE%WC$fOW2y$jOpSaOCiFEEbqS6ar6CpCmFxoKvrzbU(+uhPm^ zn7AtX;$d?Re615r?tyW2hLU(;b5($^!I@fW()cB#yi&HmAYjVg$#ET2Mh)vJi%R(a z22aCy7$5yRs`#M%7rKc_0RcVFi}<7i=S=T_Xdm6o%K3cx2;C?ik6x&!TAT@<F{oLU zmE?;)p2f}v1@f7Td!F+KUPcD~Rmhk;OJbGJ$f1l`Vw{!*>P#tb0+B%lNVQ~808V;V za)|T2+47Sh_Z;G?FCAZmtJKbC-<g+fu~UFW$XjG^D-si%z3KG1LNjyZNaD;RIqZ~P zacFg=1U7Iaf!(`mHjSxoB2kl*Jt8gq9zVlD2>|gqeFnN+a!3woEZ#(JWrlri`YZG( z%l%!NZ1nRK9Dy(28Wo=Qv3CZne{^7D%jQHfj3rQXycFr9kAb({UHM?%Omuv^RUx#1 zT{wW$)D9b)m+JH+<0;UEl`ruTPfgbK?9p<A<J~ghQtO9_mAlO&owuaSq-LMJYi1X^ zx&qpP7b`y>mCFG~&djdYw(tagZ)CkInZ=TQr=J6F!{xA{vX4sa_UHNB4TLI4heAWz zL)=rNMkD+~bw<Bt^8gs_hY3M&7Pb<#>^IWL+a6aXYE%)9yod&zCI~<^v@#LnYWb(& zDuVyBcIutZpyz*hFRo)Uvs{0+pZU7bq^@ElHO|4icP?HJV*MNwYe|YAj1}+{@cHx0 zkWhK*U#Y*buD;Oo1Dvpr`<_1htJ^DOgNnYxsLtvmu>MWvV_R#VVjG{*ja$_Bvcuh6 zoym7AU3pu!W!KZ<Ga}1{&zC{qBcA`;T<#%w0yHYYzQ8_vp}H$<j^KO^w>opu!KQR| z9rMS{*FAe>M$^_spvJKS@+V6gEW(gFLG&)UZ!vxvp*#jSVdAqm$@@#wm|gRH%*@gV z%JZkbfG=|%$SYsQeaHsBhP5idA6w=D*K=)lu;SZ;o;Jl*iZp}{Sx?}T783TQf2WU$ zsQNzeyc>Yp?3}$SFP{Hl&3w_0^6?TRqR{ev4YU$5S;y$tHOCYO4;|3wZMb>DByOYB z0#pV}y1uxkj^EL@xw*5J&AQ$B6aZV69x=Rm{WhdJzA_=q2!?cGSp~S=TwDA=x~+jI zFBshKe7X|W#V&J8+9f3S1m^2Dw2P8guezeEUQh<P+W?JVyG6sWk|(P^OlZR&l+cZh zkVH<^dhCla77I3v6!|^RyVF@C$E=I@01|`61&mt>L^&kUfCF0k@_}h?P`qWsG#wuA z?t>3s+a(eX7zU#1+{T%+Pc;<d>P!tnY5*VB;_{w+@$;fQ+fGu?oDn1?qqMM@0Uv9? z7nBEEFMb%O|Di5l|IexbXB8*0vC<|8jnB5w>bS-^7Pj#O!LSJ@Rl?nxs;Il-N!H5G z6_PxhN@tUV`^yz@z3+u1F_ps0w~P>H%sF9VLnEWs{h@L}73}bS=@t^u??H7zks)bt zzwo1R*Jy~2^LQhR6Z}-<!z)MkY1ck31{x<4Yy@NMhetUh1*UXm5;E@e4?U5(Y}in@ zdtHK_MyzAvqf;A~hiWk?VOvsO&(B|DOY59g(nTGKa{u*OX0KG$!o;xsoc<XY*)ALX zW2G*MW{5>Vgb~7|?S8k*x%)UI9!|&M^!wqtAM=<y_7}h|0Vyt=6E#28#;_xmbV=`t zLc=s^*olnh5&f1pm|Wd>(zEwh)x3}j5ZM+7wl&gi#|l7%9_`7Z=9tUIQ=|@v3L0ml z6hc%=9EwZ1u$63aVaJX4-HVQQ$J4h5maIUdtY9F)bqHWgqV+jDUNci6ZMGn`jnf6o z_9txQZ^_W$eAzkDw$Qk533X?~*E{Lwl%v5Eb9u(RxGadDZloyMF$u&tWx*x%1>4qr z?)Uc;|6?wy4F7j~_er*SUDMeZ1T-R6Fdvi{F<9tUJd@?L%pz#ET01ThTLF&mu9uC~ zWk(-z+bllvi}Wi9Dkxh9M?7i?dG^$6r_L(deUw^xN}<5{{GK-Ow$E<WgRa&y`qDR< zMQ|#r=LhrD+bgEB&ymN9)8m|F+hKd$rYk#N^Lelw8|(FEVk1M7-<HLJwJz)!dz`Ir zSYJLC%m}%O-14G|iViG4dWE==T2onnNNV%=jm2$Qc@^`0%CJX2u30|${r=7NJ6h5{ z*w2~r;fbN(cl*Ak27<YczerviG4@GD4wyjuplwSRd+q$H4YF~Ud*P(3pTI@66J4hr zNL59SBrY`|m3Ts7`mVN6hAG%?L~?3yS~GdA8~<<%`^Xpc+c<YeXFPvr&!|5-r98y! zL8T{m2VmJ}uktO`ouBYW2Ot506kZ8ot5<at4oTm(8rUH|{3I{1OPt-!(fXo=I)%6o zu1+a4pO-3*&)4AkfmvJnj(6YJ_FOTPX~`h$)eLw=;G@!LUN-t-#Q%Vy{?E;uhpJcx zi#`H~YRG95;JsXyv%Mo+hs4Pno3cM)k4}wxp+Vefr{u9&2X0W>`O!KI)b+Sh<c$uo z8!eFo9jkIun61mg=17IiMlxK%F?a1St3cS0Z<{IYfw6DLo9!9?vh93!<o9C&TGCwP zj&Zlvj}@=xBV~<=Rq>G8li#+CJsV##J<qjZ+iLE(YBv@^24o4by-tmTZVRa}I(NOo zf)xzrp99bG$~`--uXC^i?*PmK?Y;!5$?bvis{of%pN9%BDPkgK+m?>#`{dJdz`1%G zl<_PD&)zysBk9G1Oke{EKbE~{oVHKS<hudUvGG652Helw^^9w)YOAW`u&cJXNH)^# zaP8JJ8$q^Zprx>oi3yD=Z=}xtayx#JomuT1@_QqC_Z&(O$SF=Pz)1OjRDE?+lxzDn z-QA6fl7b-J4N6IaG@^jy&^?rZv?$#n?a<wgh|*m%2r}f*IWT<BdCz%&@A;m!m<5Z! zX70Ia?|tvfV7t=gZiH7h>-{f<FO3j(*g;P~D35K9St-Ut-*Wub;q`52SK<Mf^1&x9 zR-_*dUdoJoB8dBAyv$@a5jtH6?PXyu-~=j8$$;SQS+DR9V?{swm7G07>Ff1R1;qH5 zNm$>@M~<dJJ#2FGabHXnML`HUr6_ett9a7EJ^{;(k-~+#>>#5+mg*|%@zaH-1D3zq zeT{yl2n^6;RHh0Qw)2}s8oL}1lFnFKTn_gk&Vw#`H8v|cYu1`*U0cq9F+L1NoC0;D zqK3qipyZ80CR(*8ae?F~PiEc<#D%lRg;%u%6dkuXHviy~ve`fN9D~`*vSSRJ_paZS zkHISFPbmY7*rJ7`%tJ7*cNK+6pcU&TCPZg1IO%3R(Q#LM)M)3wU8fa5uXFBatVu!Q zOX5^srDEWsF3XBRXdNC?EI0vct%Y(S{wCNarx$E?3puzWHt)%uYtdQpn7L;3K#9!G zo6_cajQuEyj8u^&D>U$g$jJ8{0kvrS!2W#@n;N~MqGI5cVs`;+z?qJ4+EtcXvDm?x zAYhQmS=<1$p-wWFJ5h*MI|uyJmq0m(^mz3kLkaD2vh_pBI;7A$hacjI&M2x%w$%e_ zvcx+n!jE-A+~jLc%%1ohG%9o#gg6M;OHVmg2BJp=@Hc?Cbh^hN<Ff}0%RJ-nf>aao zKl|k{(C3k*IZ}Lo(b8co2~9CyA{VQWOE1M$EZ^Z4)Z_fnz<Kryb2qjw>kU6XX#2G- zu+lq>&x&mu1)&Jhq#UiYx3{+%^@C4OEQBZ&B<`1-O^=7_;obNf4B~&AdKu?Qz~+qG z=QI-WIh;HB2Lh_refU$l$4!*K_D*g*Hnvxr22?p<Q87op9LZBMMmn$0nkZoY>?rQ$ z%{w>0$dt$&l8#SV*1u-voqps9S#hT04Op5BzQm-nb=h1!MEN3!UB&VX_P3wV9DIBD z(K&%RF}rKvCS;U+(z?N8lPMv#Uu&Bvp$*KoK2NF)<HV3~KfkGpEfNOLknj7wJ8o_| zo%b;hI{1@T{YywlC<3D?#y>I$BJXI(`x>le6o4$|EH;}rV7=~y&dOdN^VUlQhqKPZ z8>Yu5cp=V{&!!-QZ;qKw4*><Y&RI?)gayOsC?HhOF2||z0lWWujGF{SB9UJYfUD%p zZM5>g|HQ{sJ=&)j!g{xD<>;6^^=IQp=Ih6EPa@I;k3ELzih`t=SXAzQyB*yw!Vf$# zAGY+#!#-<__#v<?a{f6ww0|Al(eqD@5GY#Lm`2hBnP>S;&jJ(c)GO6k;`yd<VVTRQ z+h>#}8AM&{ibSq0B*dFT!`G<bTilI}4Z4a)D27@VtI@g_#kxWwB5pVIc36*UaJuj5 z)h>gWPZqh!7x1u`xi4Mg1zT>0ggm%ysH0q!Hz9c6XWxKUh^3y8WbWEf2YLJZfc{MA z+krf*7IMmMj%^GnET)cT7LGeZcyZnaH5hGNMbuI3zk8m@dKLRBSb{?Ju4b=!<(iSw zTR1sl<*JKSJivxzz06f~?c6jWFhL1w40RPpiAyCOB7F<W7@1=wLham9whRp4M00|? z7q9n*v%4*>PS3qAzwPbq`qf+0dDj~22j3SzJL*R5I2I84izHigy@{}B^K2!6BTj-2 zE0$f`&m%ShlC+3kFPq?W5c+a}#=d>w#a4ea2HThj-*Hm);SEEK8Ku%m5&oE=PNJJI z!FC&ecA57F;9165aqUPvu3c!G45NFBdZ;r#pMJ;hkobp%7W;Q!_wEsuP7}JiZO(#o zUq0^eo9zRwUel!>M(M~w4i;zQ{mzq94ZbBbPK%}PL{=0GH{F&F+Z=&KqGYw)^pgDx zU`~~3YO>(Dv}2r#ZGVfh<6Ju?<vhSCd?vtAlc_?KkdT(sr7}3;sE-A;H&0=s>!aIV z5UaJ{&iI{YpwS0$!@+HL3-!6Ud!MNJkcQWJkv|_cxj_yV{z|>1|LL@JA#Btq#oeRS z6&2Orec^biqGefjO90fLBu=K7E(@XRp<`3T383ipxodNIO>_~&D$2(YU_o}k#C+Ky zw-A4hj_gX@6MJ_&A0My!`&rlc^0V$h^B@Ux)|iQRa927@2-2UX+Hz^tgIF!2>#(x= zcDx(Tib4S%6~T>jZN-h6t}DKo&xzO=I!=z(LnXn-v6k6a7)u*KI~N=3^PxF*%WT4~ z@ACw`nGX}II`6LBrKh|qqw!pA9{l{LFUfhmYJq-c&>EN&QC30o9kV-=OT0O|r}Cc` zAp!G$erjYEwm|Qu472%p!2+?6SL;o(X^7{o3?I$x9c5X*q5P-^?d=+sRTrqoN`8YB ze04g3N&4H7m5nNd(zb>e3r01f|M_dqR|q6NrP9b|Sp>}=T9nLk)4hGmsZEJ1{fvWO zZ^#j-@NL14LzOvQlWpZ21H<8(jmBmygg$Rhd62cp*?YatwYv3B=!t_}SlT>~=J|yY z;!N*_trxPuELcfD&(9?<gKi=d9YZD>O%ZqTZ9xSq*QT@BMAXM3p0oZ1A^Y-Vq|8}| z5tF0u(p-f^-LZy|;Km`soKCP12Muz6_G9;Y7sB3A-SR3@^xHRe_Ptx!4R=nrNm1jR zbWW@x-+_5x{QLCtuDRWI(V(dA+cV2g<M7JDu2LCu6VZ3ift#rGqjeM7a(l1-nt@O* zL(0`a!#k_>0Lv27jNq%S`GgDBn<EOrZCP2v=b961F$nwcCL<Nsqsqu={F!jssLz7P z4wN=l73$Gc)bl5BMvkN1fABvWrT^JYelS7<CM&EJe9xZ}Zb|q>GE|9^bPFkAqoxmq z(Gg6Oc^pY2Rhs*)C+eZvWx|)M?eTCQ1Q9ZX2bgwnLC-S=wAkM}zkfGaVL)x|1p|Q8 zVDgTgoSr`j=y!4^j|&x`b?w++$|<1~W4ZjMP~5yktda6UYPzZLkCqpPk+^Th7`mBZ zbR`tVgKbD~BP=CA6A)(;7|K8l64r<mX!?WMR;T0J3NYysM_rdtZ2h)?f|Xgu{oM-W zJ8RKw)$QNB)rryFE@DuhRd?4KRu2r^X$%45sGuGRs_@nH2WAO@B&?$z+3rjYj0XX^ zE@jotQ1|1(J<5{z?|aUrsBi75;jXSmmznQ6gAVo8GE5xLSMPl&^KPdT$49Rn7e(x{ zk8!4UB=ogekd~B`#g{AX2Tgt7VlAJ%b>8FcNdXpB<i6$*EsLRB@sR55#c62Dms~2S zq@1dEoWS50N$}sM^|%+co(Nx#f$8751V7hvcacg;1H3u^suoPr|C(ny!oDxfiH6<} zIUUYBQMdddVOD4Ne9?(-<Ruq{IcO9)C)Bq49O!wGzP1F=%N95SvcKHitcIn<{$;`Y zIS6g|1FWe@q^+%8fC4`mN4O?@3KKf;i{(uWrI<UM!R>gyY(UybJfz&B=r_ip1_mg; zh0%jduQ9^G4s@oWU!66zV;Ugq&4;#6wSTU?JY1duI(tkdgjOWb%Yncnx$N*<twNCo zU)@X<DpP{DC$M`iM-57oS}YNm>}0w{;_q-lbnE+3E*7#Tw5>rl!-Xw&vhG(y?ZF#5 z<6V}yhsrt=IzK&pS4fquMYnP19Mhh;%GhiS{lV|A3Dnj(1a00bJNnalRa;E0dNjVz zBo1l&lgfGw&%4r7QB{Szqu#tuwP*&j@$!b+81x#>&(5#94JWE591Qxu16t-^Jz1fZ zp&oWQOy@Yygst5$5=s%G(;pDKL<6wMn+>r^$L#+8vMAP^VJTLyNr-L=-mMW(Drh-& zr~V0wBGrEf1>Ngq3E~!PW2wCXe`-&A5@wsHo&(jMJr0yH8y@4*q4w`UNBhusZx4j+ z0SiF4Wr(b;=UX8lKNY|jhvcG2VEWu-5m{M+Pj`3u^2V7~)lp5)ervw%{U{!~VM@J+ zg2abcx!oF`UkxQt<{2%YOBP)*DvJ)k$*XK4uSL2wA9-HJ`_B+6`&t*)r7pB4Tu_GC zvVm?>9R{K4x0Ofia}Z=H>aydq>B`mGQ)+h)8{=4L4V!5XIqRkhYGC)gRe&Ml+e5rG zj<C5We}#|)1g!EiERjlvvGvXaewvU`5-Zu5U=rs3uD#vq`Kp732JeHDqnl*bL4)A| zXjfHkqk4cpRAu}2uA24k)BSN0G%N9xwx8d)8C>MzN=kgMb}+xxeb!_e+~GJkSWVtn zwk=9Iplms2rZXAD{!|ky40IwU^P{3V3Zdm`C)pqbj4c+G9WAuy`==h`jOXhd*qr)z zRl)3f?lM7ze42mzvWZFjZ=I36Zv=qD$YRQ1{>+V9a=?l)xe$whRZ*EuVPs5=ZV_Bi zz662+H||>pR($W3ajNsB)4Qix@%TM2KaWs(YY;Vk5dqfeXy`?1s0;q!*HN>!wJbcV z4=%o%x`>f%UcqLf4UXp~7e$~T14^oU<+*}6j4ea>W)_r0GavhUZ++pe&a(V7YowRF zj6;-V979%bD%d)nqO<;Lzc1Nsfxn+*Xzl{TQP8Vjj4|fslx~xPh?CiZX(J>U#QI~n z(099~zNvy%j0T%o9Nd|XDHh|Gklh6Y$qYVImL)a%fuFpPC+Cd{iS@V_@O2+boqly_ zzBD~uoUEHW$K95?ZKuP~_^tV}0g<4b#t@k_Wm3tCI>KE6-JQq95smNO#v9kZp^inS zVs#gl?3C{9Ro$=oxZW%m`KDOt0lDcHR%fp(cAH(!3bjOd8b{c(9wwetY-Z<Bx|K;B z>%^-)=JTuRiC}v~^lMg>V+`fhB>=UszM5(LXVJpx{}&GYua_Ngz<p*(<z#1=iO70F zpVL3LhQ@hVvbZQWf>G6I*ZF$*RJV0u5U(27(9lrJX;a?s7MBM%OClrs6%r&%TAwwF zUp)CTGdnvulg*|2xN?N8EboqRqdiZlpg`q}*9WDtQDEipp?0F;>4ISb4_i!3)yJ+R zW2rA2&A)Hry>92mNQWPlNJJ?9l<*x<bY^7}@rx9_o|WzsoU+22Ta8|{bakeSSg#-N za)VV=vc@K+{jnP-{9u765oA+ksaY&5n$A!agS85JN?}@rg1&g1&=zby&ck~8sMPiG zrphC?$B3b}V8tj`vP-5akFbp;5zW(IX=ZgzGC5UI>8GMB<_Ads+0TFMe7ro(B6Zaq zAzhb;qNl^G$bLWkZWG7UYU7cq;!$*dqVTFU3rMnnK6fe~a^4kuS1$hQgn`4+)DF{? z(6w|-qIDH7yEn-8NI89@KpgV`vfX58?~Jn{Hh$?ac&fe3^5Ish3v1>O+ihajEQ?EA zR)Rc@{qJ(|^I!Xq$SklwkhHpD*27aX<x1(#gd_+bV2M6~X*$;!%dc-LE2S|6EcmQ* zd~b%xV}@f!U0wIf_FsBExQRR-AE9^IX%i~fCm^DX7~+iUotAy$4iCDDh%SEwO6hO@ zjS&6_O(g89mkedYJ^FS$UYoxCqvZEVybp?-YT>2+*oOm3ezQypN@j$?$JihBlXL{; z;?l*?W*l=T$K|#?w%{Yu$!~Sv8Nn|fnCz%tvON^tT8S`DejXYEY|+GU+iW0SZMTnS zY>Vn#s4XKDqX_WQn3&bM^`OH(P#%NTKt<gN(wKWq_WpEsYL@2tJ6Hlu?4cv1aBaQr zY7e=P>RfGBx8FCXvGue#d8e)FW~=*_6@^f@v~qtF);eJ_J>8z3!eeBU$zJl_{X!gW z_2df?3CWHbU-L3oip&}0{&d_FF15J#;hQt$(Z}d68Zp<o5ijm-VvFn$meVW$aP%b; z3;{8U50<Zphzh{R1GifU5X`Q4X;Kh~k=mV-e>9OCxc}~Gm4Toe?KwoRU!Hct<|V+P zndofi#HMYOYsZaf#jf5MEI-^F9F<iqFJOcSvlX#Poxs95`^(6K^%j~mxl_0kOFzHd z|Ek$nhhd=0m2A|vcFg8JzLqEmPVXTyn+94>a;C%&36g=OLyE5s?&5!0vn;o$i-K8r z@G0?UJSh2%pUR55HSbW(A0^w>Nno^fn7U#;T9hj650YHGpE6xL$(Yp4x_P+02r1r2 zBT=3|@qLOCrwH31v3kZdd>K9leQ_I6kpQjRp#9O=CE<?3sM<@7csG7|%)~*K(*GT9 zqFTeK^kVP4G<&KESiwn6pl^12&QoP6lsP@`;u~ONzABNd07S*jpZgJL&<^2MmuxB0 z$WhbB=b7Uxb0Y*=*Y0lRqC28>f2lEcHQ<7upTEqbbw#e+xJ@CuM-M+B97<q@Z8l_P z8Mz~DT}%J5FMfDuOZb-@8N!|rYkeqkLlRnvc79X@^7RFO3AP9;&AIw+0gKZZ$$;bk zQ^O-v{$0cAfpHS+7Edf-Y~-APftu)AAi@RRSclX!Gk-CnZxbW8C3EDWalieDGI^J_ zV3LT10k+7ztn(v%7b8Jgp2Jx(E><gyAi!>t6FR(tBpXYR{7#Bc4$#sVi1)#q$LpUK z2lv|?)4{im4H8{b_@%Pwm~Mams4KAQ9h2I%vQ}%Tub}pH92j2O=rxXeLBv>14lX(! zKnA9)$5mUL$FClO$6s-WhgLQ_cyZS3E@ZnqJ*VcVxwuo~05z~Gs|+j6mn}DUSngdx z@LHz5?^DgY*0bHmU4^#%+G-1W*W7P*V%wLNmlY?C23cR>&X=2JK4<1hd)mqUjw3Cf zYSAfmeD$gsm@Za7z%{A+06RIriE}VhxD?Cs1)7M<(m+;qS7wPuq;B~@u5`dcr;qCc zj6}G%WP(^I8~_O6=th`E7<NFu8Z7(R8*5vwpGVuoJfPexq-Z+os7Hp7r8+|&Pg^ED z(wz-{>oT64%|mlj_s>CGKl~TtRhj(F*&II**FMLi4wC;XM1Yl@<^h9*mL)@zkYW^R z#7bDM31-Ax%6`{owVNJ&L*!(VwYL*AA*04NE~M#8IS4w`<jhn`rG$rMNbY0uXE|Rv zh&#AZet;p^NZIm(oQXEVk*PZc3~k}pxMtE@?G;|_DhYkA$6un|P6*<+6sMVY-%vQB z(n;s0J!;sX$22SPywyVXhUg;Rs=}SeQFE?$)fpCyvQ#cb^IQw%-d8F)-S+0*H@n)L z7dCyaRP{vGxS*E!Ib~qx8Lp<iKp&O_v#GinaDaS&dac43q+a<vGts{<sUMSglJw%S z!sKgZj3yFgoA{C^(<@!xgS+>(+$kztX7hjgS#LBEU3+7GLAewkyJL;Jt@W<O-yhn; z_v^=Pcc$I}4sv=%Mp1ih`~K?@EtFT<Ky>J4_nfjhnlfW495rGgU?ub%9Q|e6EP^2X zQW{uMtrCXG^X)krduKmqC6#u*-KL@|lD@BzhwuXZb7-3EXma*A-&yfLRo&xX9?E@{ z+25S+aE_F>*sv5Q$oC!SEP8ymKN=E_x#F*QuRYeFqz-Jbr)td=T<}2*gLHXAY~T8( zceY<zrK^ZzNMxwZe(Vv@S<uqurq0ODCR)RH<ga^X-BlCcr@lNwicrMPm@q)B#VpU4 z;Wg{Eg@#_Oa3!q&a4Ym!;L`66!6ezeHv8FV8XZ>kabR{suPw-N0CrMqFJF(YOzbD^ zrM1tr?r}i9wCn;!nX;lx#GAw)QM@Sakdyf6a>3L6N~hY@GeIr+`5zbPiAW}GbdSk~ z%CHR|v}I%dQp!_oD*`yHdDq7Z0lC1ZnG|3=|Kv+_y@>Pf>y_DAYtDBLkQ7?4JC%e@ znA>?pF;A0cQ?sSL97XX$*B!mgH3utvgd<PxSIRY0uH9rIpJ8>CSTHUL^W%&L@x$BG z*G+-g>S=sM0RGU{CIPtfUm{lBIF52B@B=T+5})V;^N1*gl5#h-vFzTa2pd^=fX4Ro zaF+9kd|t9}ug7?d!}N-G&+`#0ID=ewU4p0Cgrqc%s?WYBXXDbGwEYu8t^bCugcatR z*066WPpQMQh|2Up3xwGP9AWRgYD!rApO&5WjD-7~y`Eu6-!~pc#G)|9U6e2ZL2OXK zg%vx6HI^sYUA9Kai;~X^-Ye8hacOGGz(|Fe^om?bLH3gJY$7)95KK{>Ogdm(G<9J5 z2QQc6-s}LYYWF@~$y6{@?QwxsenQJp-(!cVN{aV(6ake(r8{>yS_1}X_|!_$aAB(R z6<1Ws$qB^SNBX>gG^p|9>#IYm%l>&bl!Quvga{3#-e^u&(sxGj@D1~x0VSwAEvR8u zVjG<VuHs@P8u!`zcOOU$N@(6wHAg4s$o{2mbH!tRAvFc-sKM~~#jZBiTvLt)#IkWK z^QNtB)*jL@x4%$p-VHaZ*0Zs(nRI-<r&rNf(q0;+r}f&1g^^Bdpk6Xpo@?;toU!F7 zp0+k{For(6CxD)gZUVS4-mU-C{Ja`^d!zIAn82;BsS&FM$5${^-PhY+QNXvBUP<*C z6@(WcSOOet?z!bw-AI$O#o-3WMN&*vH|~=bR(d6yal9)j|Bb1C=Q_tYAlKmpGHz$j zV^G?Q=HtcXq8WjB_ZY2}nLX1#xfk#YRKH_Tt_l!DHU&~~tTKG;qogDvA<8FG=8g+$ zvWpAX`pmDXR{RJM0Jr2ariZRlY{BZwq)GLpI`VEO*5p>cxuM3MqUOXxzi{b~eE6oq z%w0gTS$c2>p>VTFnxM|{xw-Qlc1?NwO-{H>?w0wylwfFDy7b2pV5(}$dJn_xmim)_ z_$om5bHv@1FXv{P_FAG3hAIG(fgj_khPhIaGK&WQ4RYDxJYj^1ER|2ush`P4y9-Fl zj8#0e6J{onqs1{Me$cR%J2vL6$TgkV2DTBEZLwONovd{_F3eT`+_cKv(Ge4TyK8i2 z)OAbBoi{#yp^qb*HOE<OywaRpteyrWNwn?#eXGsy<cRir3xWuYlJ|AsejL6QSl_i+ z=w+l9tlc)i$=ao^$v~Bi{Ej3H1-p1n`<41ELT9qmmaMp2yWwqqF@4Vauq~pQVp_xs zVJN%+>`%0Hs>pKtRa^4rT4UsTI-=$2-#D-}_}`d3!;`-h7^3Ko@XoT45F!3=y{}<a zu*HQHA|73NCdWQ(Xz0|;whr;;@~ibhLfMEclDM&A-K2s7c?uN_$rK`{9=C@JTB*#v z(I2992^8spyJnxCZ7L=i6%CPCOZiBG!O6#+<FKfpA?~;U5sW8dWbd5`-z{(she(xu zi<S7Dj}vw^%^m7ff`W1(pu6dC2kZ2TRwW)PD=vF}ZEWI*R-4@Lpdz8gN$~Q<;eF3M z-2Z*W?UGxRtFw|&3To}@?&NmcnC{q&28`bx)DJ23`U8H96Quy!#PC)ab}>7OXX-5g zebdw)O?x_$?XmQphqzcnw#AkjfAV<Da+?3wlg`*zdpp}58eA!Ijw&ju*W0YOU2ARU zF2a`c)z67i`OJsv-tnLTqm0+ye67Qv+Qq^0=&7WS`~0fU=W$$1f`uAuHd?c*AucT| zU{%BVAnk@0472#n&aMf^ksWHwqrC9FNNOFhCBglB9-XvQ;OQ^Xyn$dq@>SR5MRKG9 z3xrAK+st7fsE|>vI`=)YvBq9k!pLOEuSH+gCXJ8(^qy$Q5@+Tjr^XIi%iGn6hFghp z*T7H*y6+<lGhkQWU*H)(>A$gpcp&HU!Jr|r@Xqg#LE91x3E5aiM;d2e^9At_MBZwY z3HC%rk5TW-?lq5y^5OJ&F}rVUaK8J{cQ_;S7rg&igXmqdq(29{yZqyZ>PdSLLHgaR zd=i&odPeKIU{=%>7L~l_Rha;-S3bYTe!Z@CqwMT~WDyz@Wf)IN&n)?b!HMe^bX(X( ze0$jFa4G#Mv5nO7GP08cib`ND^Yi@d5Hb-Yd7e+A1WVTwqtL%I4)okSiC0xX7VL>o z_!p&byDND<-c@+LIcxp6Vb3q+I!RJ2&VMd9>LRGKp}N{_BU5;lH$I*|S+}vuQg)wp z&SY<ENMrb<t4n=XcgJ8-@2&^)a%UWMZdrM-oW~`5S1<F*#Bo}q#^Ib{c6K&G7bnsh zbg*3Y?v&n+-`5^kj(k}g43)|C+j@`a^f4X8?*L=cnu#@2`UVCD=Ix2G#%1?dcJ7oU z`#eU*oALSR@TKX6D=PZUdj%hk<*m6RLosocuw-z6^hqN|+Y%y2CG&0$+qvMuij6`V zc_6(_!OP<OT9)UU+igN$r$bGzl*A+JZOY8s*C$}Lc^iJTh`cH6+j)TXygUBCBMtud zk>-#M<$=ksoUKrQQn|2y;b=I}1<((|7-C|PzU$Sf$Tx>?v<VK78X8)k_$lRCK>#bY zec$NJI8F3HyjZ^mTdkNPJUraD;HV7E3-%<g{ZJ`BQQ-QwOAM}sLc2>!k<s7>=+g0y zl2yL#nA0PEgW8FAyv-va9~Ay5M0v+6iWM$#5n1#xNHy60x?l4<9+d4DO5C~Ti*0Ni zc$8CFnBQ-|&AFCQhNPXSGK~%*8D?t+(XGbOnzDK!Q*-(Y7WRe;^QpJn^nXZrYz!fa zS69u+#K5Cr&qDXo<O1hPo_`xOU)`he@v_8zj207taSuNAIk!Wd;23aI>omUF^c+{` zL{&+9F*7sg$YXmv>J5M*S=Rgy8vnCrQtCS@2s!%bXbhffvnTB%C@xO#fnoXmgqjEL zj&bOtR@{7xI=n-4p-_tVGS4O4cfN0zNr3V#6B848hTTYRa*;ga&cVB_QLJENCD_K} zeNr%^ywh1R)-|5sG(aqXn(<?Q9yRY`QQ-HUdu_M1$#IIjx$pWSA~Z7&PWX&T`2}=^ zw+lmygD2d#)ydqdf`8bTYznd7kNhKzygoYF{Qfs=@z*Oy4lt)-p(Kx>^-bp%7y>PJ zV-eWQXA&51<ML@eev)FXrzLHwBVS+J<yqaUqCOpqcAzI0R#mY;PdU{~xnm50-McB= zib-0fJ9~RJZ{L1!5{cC%=xiaqKR8s9J{8(g3e)!y9Spyty6DF0iZUc%&gE@W#`OPD zq@hgtu^|a2b>5<&Z2d!%8}#-S86Hoqg;fPcnoR=qLGEkG@)^SRSJ2zW&MeV;3OuF7 zB^PMXLkiC#j|lyE<)F^>TVO6W-mjx=1F_N8;*zz2J0}(yqsNkXS}Ha~-B|;2t6c4C z#>|?lD%<PpdEYNLv1S_$GIvkPm`u;DOx1ray)10g_ouhwF7~yae|G)Ta;+!m(nYW9 za9kCs><HQ0+j||b>(9WLh1Q@Oqc`_W2cGLA1IVj9B{YqEE|VLp_UaDS0ywD%fUc)= zMUXkS`6))VahKE$vmU0}xu%xJ+8fS|)`WzM*r0<-z{qlUcQ+Z{>frv_1-Gec6?9WA zdv`Y7{7S3q=lu)IKY(&a1~$4L4>T$o0GUMKlu-w(VO_~}4?{AmeEM4RJw%Igmv$ja zAcNE;D$4FY%f{4dxmV<-lTVyq9Dfb}O7~TN1N7Ms0Plzg!uPOGHvjL8tR4Hmt&n6E z!+_3+{OBHi9@Jn-;Ua_~-;b*j#Mvoj@@08pAomqYd?RaIE{om7k?1cr?=81M!iOej z#{Q3zAqMYcJ+a`YUx<i^a0L1b9QB#^Rh>Ht*|G+oQKkE${8p0Ixm7`p3qPN(c29Qv zxJq_bC}4<_JI?yLe+G#OPKf@}s59ARod7q<JZ!ye^D#I_Y8~HkW7iMLMg4Z>UGwxP zd;tf2d%CTVq9_*Q8yPb#8WR@zfNzNq2_7YZEd<JLT@9XkwpH=f)>S{NKTg(5W!Dfa zK!;vpuBWLzZX{tb<)AclaPzr*pX1C-ORu)5#&r@Q<+I|Qg_=&hPl{n`{dsswk)t*5 zwzQM=l3j0d0p#Q3V_t5oVeY?Eyc<(lRao3eKYw20g&}*nU%yiCycehS7kRV0w>PQ< zOS6#Z86w_0uPauclnV~-M#%bV6B9EV_Or2Vx^HM`ZFy~DbvezCF^|g}^<X~2$V01Z zN_q4#2FwP+mw$V<|J49SWbqbj`QjQ^preBG{nf>$r>aaYm$;?WV%p!=4v+kmnEt0+ zuC{sp#174uLk<`+NCRn%rK$%vWa5SqqKxup4Mmux745JzN#5vV0mHzpX{JCZE}ieN z*QXb-_jzy1KjdiO6gvINtZ8fRU|lV*uC^Qb{N$~wDjf?wG1jkKix$M{ReP?g^sOMn zT=j5XdcGLwV_zs{sBgK#L)Fl^f`H~91ZD?w5GH~lucA;j&W0kLFAUPV*etLYPv_ch z!n_(!jf(Dcxf?ykxg5LCSGImh@@s-HXbZ_@Vp#7c-0Uiip1{YnIKN|1*NV0^)#Nol z|2j$n-3D)>&ijYswvr`-6$?anZ{nG{_1Z#$EK8?%1~M2$JiVHmo4@LoH{eJ?3^ev3 zD{_tp)6Hc*K}M>>G|P2uZ0L6p=G`-vSGVvPX&)%$B;vN?QC|48qrX4x9sn-#ObekG z>)gC7jw7`=D~YXIMg6?kJ8VCcks8-CGV`K7U_KC(2$de+SVJ}?jl)a5FfiY7fJ_|; zArR*ZV{Qz!=B6fY$Y}SIKZocVT2tm>kjlBL`yNbEDUj;zpUhZBmzGe;!w&t`;QI)s zUv2Y@8K3pg5JaxQNsSO85KE}!l_r*X-|VLFzMJ(cU+819FiB#2(QvKx2ygsures^G zy3NNH5&wzHzP-%(p8LxG+nG#8^ZA>zFnS*D8g>KAX>?(Wy``d7-qCk^2vzuDOG0?} zh0MxL<O7S>TuVz!_D)WHbx-xT(W>0<hnfKGWN3;m;I0d@w<6=9(iP5+QJ!gn)Yyqu z=np&-*XX*!7+YuC23fp)kTXWk#DqR;A6Bd_!@o7YfNs`E9POA4ek33@wdB1#$5Yi3 z{e9K!v?DpEdwAhaGUCN22z^3Z(CBoT_l1hf8&YoRu7dBCHa2pw9uk{eX*pz<VgB>@ z__@qKqo#(>%$FP)RQgC044As9Cut9mbdlCV!a@yC_YT?{WKt}cJ4t}~7vcjgzDE$| z8L37lej5Fg4ENJ(`vTx#drFUbfd=>Nch{5k(IPX5AH{*?<#Zm(_mJ46^8Eg~pOLlg zzBiGGnB*&8*A<1=V2aVy)Kb`<<{=jNVv*Tt+4~jHFS!9Nu(lgUb3+5a#B+_lI(r9) zK7I|S<)ON#XuzH+F`&sRD0t|Q-E-Fkw`dKRA3L~Q3pmWaN0SZQh_7hhc5yd56oUGg zs;CSn0F+M9;TB*F+h^t&;Q-M5Xl6<<G8x(ykOkovZV*m$#POsvj!?%BnXZ7LP}LHH z(C$xM;=%59&s6`zoUNaKuiU?vC-__K_gB6B0)X4tD4G_gGTEvx#Rg=I&KSzfXLxyN zX`qXrqBTex*3y}&xH&6MWp#Bz=A0b5Ncxzbdc2<6kM_{h5!-rTCjA`|_PmQUDoXp6 z6v_Aj8Wp%8L{dV{`X1b|B37}FXISPRp%y9gmgA!rU+h3H`$FaFP@>N3jf}0N<C2mn zu-jIKC@W&0iMPA<)#H)@DaI1<OU8Q>BmSR@lx8%hHm45Qu!$7Yo$CnqQrFjLkq@@S zDPsB|dq_YoF3dUZc1x|EDg?3Y^w%jVFYj%7D!G4_vv|CR6q=c}Gd$yMEt4^CUgH1h zd1S+#>w7D3R}H->@&6so@%_)x?7#pPU<3Wfem4XB79w1(ua@V(i}M^<D05ZWxK-IT zoCgIXgZ~tcKwB?mrWc#<Zw_8b2i>g~JoH-ggGT_ln0_PQ#|b*t1lZ%{joW16&sAHF zW7ArEpL!>cTVu`eHuL${srSz_Y=Mkj>&&>^bR3k&rkaqf3`?3M9~#CaZ_#&;Y`9pv zhq&IJ=KTD<-MN+NIOFFUI9;6@Q(WCvwVe4YK_GY3FBcB(H1?E1-FMwRo3_0nIQ@$# zBKO2~eF!3amNnn^f(pSO_BFzm?JDdSMo_7Zy!d`UB;o=78}9B@E^*PEeRYce;6=XD z{}OnH@jn9wEv}=N7{|Y_24EkD_(hf;lMxM_Y4r8#tT!|qjlQxNUnno7xagajno{ub zA#HLlDj^Ti^k9%T4%NlUg}cM#WGN{Nw9BZ}9K}4zg6=!{g|Ngp)z{;QzXZRRU9%^V zHu<)LR#L(!MiE%>`^=!W0sa7ON&PX7YS!~hS<qGnlyT%Odt7>!XaQBat@v(hoNju( z*KMY43YZEKpL^&2^^{0p@))sZpF=8-3zDLc=#tf(5e%Uv7*5hNc7!nQ?(XLz5N+o? zhG&5MP2@@^yWz0%y^>`Et62HoRC&qT7-D+K)MT84J&Bl@__&`n&=Tr5e84R${?g@5 zSafu>Hd-#{Fz>5y9D7Gs_>7*Ym0>QDjZ@}yI&bB~poHAeb;1OKL<NH{>_}zKk_viz z&jx8NzwvdSsF^5o9BsbM4OJA@f-y@jcppj|<n%Z@J3oD0_aS%9;^}BfYjMQI1qmSZ z2Na<|5%H4<?QGr;I=(JNw8C?_)Gk$JZ***al{4~<!3pmTpVCOG)W4RNkf<=5AG{2j zzr15SjreWniW(C=6_kG2HwnzHS{Qam*H}S)cFeQ*3<eLdni(c2)=VsiEY=T5q_%!u zh;|6;xvOYxJ^34S>ah41Iw&s&WQ<0fE3r_)mc)p_;0)bR(*;BMPzY&@#P+yU4Bh+Y z@@SM#M=a)i7xA<GUyWa0-rU^SySS)uVfO3ydXK%ZKMMK<ykj6;xwl5Ey{g<RBw<#N zJ?7kB!d5vlmdG2X|D`JiLURq2N|!a4IukObvfxS*<DW|QgQ?P*f%H5z<;+3`9)PY@ zV%%P1k-*CqAagsF$&dJ`X9;@b#6P!caIW1Pw^~QJzBVAjhWWk%&7d>UhIFQfi%FG8 zLuP>~Hd4>%+xAZ(kvV{O!RM6Sx`>e5=Z)<t*bvQ8o2@qPIO~hNX`96toTNIx-a7RI zZW{1PUBp^~j$rca?C#uD!5Qh_$;Cs8z8{I1I6A+ksWgO49x&(p5c<_~9=jGh$4bY* z6nHeL8Z5K%?2o38t7h^Ism1+IJ;0ypXd++Yu;UbdfW=2e;OXN7$oPWPQzx3=axot; zH#9a+udT_etB>C1^dtzD1s&c&Z-!){)WI3h)7;ClX3I;2<uCZ@efl`uG%70U92m5? zY1EU|p8RR6B2k7_)5Z+Sq7co>STadK$LwS!2x0)S*WkZko_+befNq7xMUa3&>ywSx zUOx+IuGiKL^0pShu8@=<?7x$FpU}Uss|QS?ua|F}VVFHTPm?8m**_Cd5IhB1YyEsr z&A3_|<`vczcl?003ot=O>d9o+VC>Ge*#~FSP?)6ZV^5Hpx#6!Nm3jb{`S7Neie-vZ zj#UDSRQ4kaT}UA8xBibFX4aykDfE@vr)}DD0pR>oL$lr`fnNp3o;SyEe_AN&>PJfV z06#xI`~%X>$d!!H$uK(AR!lVE(Z^n#5++IRJ~2Cm+GfLDE}v_a>3$MRJgj9-90`iB zqL15cZ>PQsiLfL6{Tb3O&z@GOmrjFy{ST1b?kJVS*aV;3Och0Qb9En8c*&f`>7rWs z2VDY)aO;ZLavoUaelzu6x7Cbf*zLRK=8O^_=+;mPhJSL+wKK$!Ur-RLH&<0uP#_Sq z;Vpb?_fYn_H=t=vSSGLZ00%O=bbp0{%A8E}2ZMa=`R__Zv9(~Sb2J?QAS~G=+h0G9 z=+R<#V~Rqdz)wd3V>*x5weC-tnW@Re+%Y)5ymVT|vGu}WJ(50jMqcjw-y+%%FS^f) zpV0#f__aYmse7L~s_6;T@4f#1{)$iIU!GCv*BbY^F}-<o1gwfY9y$agvnX(bC;$yN zJB$cMyneA_BcYQ+aPvWr`${sCsN4Qap?h$NEICQavvrLd`D!G&EL~RC_&c>Rj)a}e zf5vGWh5s>|Sl03*ONOjR%Yf#okqHvuT%Z#(f^f08nsD`aJN-U1q)hmnnE2c4&dkW6 zA-N;r_;kh=6THY5n+909dPh=eBO@<ya7p!^rf@5KgBPequBVL`u?7>xM7Xcido$g> zA-D5XdPPE#U>jR}(7tTayw-RzlUI~1f;lKg=10s1x>70h+};(okxhFZCwE3HKwPAT zCz{{kB9G79>9#XWn$ttJcTdb#sMuUJr&eCGoc3;YmAEpE*U|O;`}Z$Q44)^xNSD~X zh{yk><N}2;h2jyn)i*l7_kkDka!D>a(y5rA-3H{2V_v#U%LZ>+dtDt__tDuHaHsr8 z07&Yb?DPksNk!V6`rzlxff-hVF)3}$cD2tb@zIjsEX)VaoaWqjoHi|QJwd4iUXHbY z``rU8&Gp;ec|}Y@Qg&+RfpNGzjG(oIjg;oTJzSGMyS&un#<mm!I^EydyrzJv2K!(b zj)iLU7?ZloRe#og(iS}uT^*ko-^@hMGN+nARB6UHyt(-`^XDsFPO9`r7>;*d5jRDy zsKaXNt*hDy$`^A@hUB+F(!wiM*dl0}&){COM_5Nmz>Tx}KV4-1L8L#-Ge)N&G5)4{ zfY%T6G#Q`kS+Dec0j7@!A8VZ_#6WKKW#<D(`QD-3DqMCHaoLp^PTQ5F8-xk$DUrI_ zE_!NN8@9H_;>1QT7Hx;DYKS=-eh|~zRgm=OoH*`XeO#O^SBjebw33&nLIAFl4CUQV zy`|ve2nDV@R&L>$!x4yaD;soG`Ym^H%;1||RysP1pl$8x7b2!V6A~pO-b@M-E7C{m zcwhhaOHaToiN>T3UAV+d5~7mL`Oan5Wf8INr&k!ip~SVUdY&Aauy%5{&7{-qx_Lo7 zxRm@ZBR)Rf(9y=GqPbmidUkE?bHlf<tebqeT9)I4TdE|`qg(Lx2b0;-z06F;tTxHz zCE$Yhm(I+IhY(?a(YbYpYX!~c_<Uk!Ht0IsK!UGvNfCP|Hu>Rqb@t3If*H1k)#A#c zA|lud4SmX|SSI(q<E-HAb>J!DD+gazo9(XTpA%>C@*JN=v0k%Y0!smMGG3I8@^xp= zHTCqimsK*3pNa?ieguw6#AV?{aIkE`MzUr1@v#7l|52~DQ#Cm5`!$i(vIqdb2|qL8 zkAEq_oaPEKslP~^xEb}@X`>l-^W;v^jgKep&EC<e+GAIX=xaauLTQPfE4c)hHx>g% zYT6pYmM1c~jSvef=^7Ga{HN&tA=GkvFIyU<doDu{0U*YPWBvFazVAI5`hT~RV#$jY z0RJTH$@?G*%=TU^N9?etFe;4D!lVq$7m1AZ+E%mOf#DZXEU-oB9Uf&)&Xq~M<2>ID z68X9rp%090wuaqk=7y7UML%?3>v=>*4ygbf3xFR0-~r}jRh5><1x;N2m`>`UX|Y0= z@%MzcciIyT&XTPTBcBl|K|$sT8!ZWN@eQDdMv^em1%bzNYmd#wgryQcSYzpYKPFk5 z$S?uhuo4V{HHkc1X?@upY>I3W1t~3VwPp?&v(+8P`!A(Tva%r5K|vY0%CVV@d%IK7 zN_}dNDM~Q@gu90iYwM7L42E474r1qioCXE!m<~_nCXCg8X<Gfl|4SuVH|Z*C9DXis zdbrifEUEA9soyG3)fl!*@*7nB^fq;HOZ%(HFRV(V>PcXB`5{DU?OZp-fKubS=V?Z5 z4j0wSaCv~jb#K~zR{Z+61jmnZ!6)Ui-9F3GzEzb~9XAe3OQz-Oz!G2%K-drTmjY5! zeLJOjTII%X54$?8vs>Q0c{DuE>i5{Q%t%&6U0wb4(<bMvrlzJHKIQX^Z@UNkW@pZp zNPNiTj=qVo-SYyZ|I!l^F69F43Ch;&jkbgUsqqNVZ-CLo>_LZJ>?GJZJ4)B2%P}F) zmqKjwBjg?=xbRLtJ;Y5wi|Rih<EL{WMeqKZoLx$DH2janZ$i>ND;nDU{r>9vPfVA7 zEJyG=pUahcQ8_X+`4Ft$QIUrsVlTu~pG4h!;;b5oexj^4NL{X$%4r()WV8^1>1Nin z@j0<>=SZ8WO}}9?rm!xixjdXgIpdM?N{BD4i)O*b*3KKTgSgKkUG><1<EHZfJ!X7d zICC{8BR6;LPC?dpEe)NY{69}80%sZ3jdqoGEt|OP*o_CHQ7Y0jLT|y)kxLp-Hhw2` zHl@CBR-R}BMWP6`Zl|90zbe&%7#^>j$_`ajRu5G;8a_;u42pLPK3it=ToH9y6w4fY zTk|wazJ5}nTwkGnRtbj7KlC{M`{!OW@Q4-P<>)WNfJ3LErsi1}P0{580yN)R4T+pq zcTdmB5>uB+mHI{Q<k6IJg#wez9OpR(;%>w0sCYx3qvZp8>Z*?)1y(0S<gyDd<HHdH z?ay76gnnP_hlL*AKCbB&W(>aiu&2hJ<s}&XA#3z)M{j88%<rV6l_QuHUxwO~0&a(P zbL$<~mE3|ILW4&9dG&XK83jq9y(w(rip?!m?P3zEoLJ6{Ch57EeF*b*&t*c{RNtS1 z--crI42q@?kwiIjPM1uD<Ap<XfC0Ak`R?AQk+;Q^c$mH<6?x#_$EsRL$)LtHkKyi% z<}$DwWFwt6_x_jzU}7@L@B@b>*KuXg9^{P|>6Tl8Kx86BZp+Tiib|l(ZF0}5-b!bT zSUiBTtMS{w5qM<LK5K|Q;KuZ}esx?X>JdZGnnUA+gUFMlqx}h(obM9l4zYF3!6A0d zrEVVXUnkkw)PkA*@juTR|IJX=T8RDE9Rf5X3}Y-SGB_$~j7CR=!FZmSo2P0hmlSM2 zxo==pEZJ+tozk~EJHP8SZ;rb`M`!aJaC0x@Z)6zm*~adz2vI?XZuDqCxcm6!iY8~K zG+r(pb3(_0Kk|^7I64*(6V^8_CA=xV{oE)*mNdqwP$=C)KyK_P+#u3WA%YiHv*^&s z(`Zt!%{^P9UOc2xK2tU0AWs%agBB<7TZ{yYEPD8*dPh`qfUuGkTG>Yh1ERtZA$<em zN)i9~$7V+Ei{C__3neo#(!Y!+BC$PPbm9i+Wiy*Nn>aV7;iR$*p1CELmX-O=gZPh# zl^gFH69dU?)|NLTg@cauJ3oc1Y;fY-KIb^{KElIbZTH@vF_-iKB;9J2iys;d6&#Cd zXFObh<)UT4yIZPXZpJj;Yh(!HpLsW0tss+kINSP=8V$H%8>Bt+OzL_wO!-INkNcn# zQ;T-(+rBDh$>3mr2VL-CRr}+tUxh+?edW>kR3)W4PieHD(g^5rTDiMZj7wh@xlqy_ zH;%$_Yp$D?YaC`PJP=s9d{o*QIfI4DHZPv&)l`s?izQ$VyIIABRuq~*3ibJHyqm(* z8Y>zdsHdm(Bm@K={<5WHbTL14UF$e@6?I-XlBB)sBm3*nCzX3~{u{{F*^V7M*zb`O zw3Y*UmiPW+^;ZoT_nM)9&Q%n>5livM$8IYCU27aT_(qsL#yWuhp+A@H{hF0L6_zT! zfZ6b*nFvp-6U{GMJ)T+arC+I6)_CYl!|CYrZYMU1(FQh({oqm8gKFU{WF}-zzkZb) zDX*RAa~t#VBV`06^GNFL)Xv%Wi3wQ6pV5btaTdmoin4eL(91jT_Jii7gM4PJP^e2( zXyaUDL1V?zVkaS*mZ$xOL_$l|-eU^<jn=BHGbvHvct7XDC93u$hVb-@1#?@w@0|>u z>@PzIA2=)wUG}W>7@>Q`xz%Uv%ZcQ$uzcS#Bzo)NC^gO)tEGwMW^7SCualnH*Nchk zdAQc8TRp2Z`zUUy+U`2)pmVkB)MZzUPi2^9=jeOc8Fqyxxs>xP*lj++c|1?b?<CCU zF1OmJ`;_F~V)mJnmYpt-k;UCe@o1_<7wZE&1)}C<xx@KsufHNTt~ZG-3jHjz=l-Oh z^$}5jy$ApYE3)S(R4&T3&qfj#g{+-+h*t{?JxCk%N<c%OD4U;fX?&cbw%#^7zkTj# z7;w;Zf6VH-N+XeQecRUPm_>U}@YivYPreHOzr_50aNY7e7`*cgg`|#60}r~@C>z|@ zS4dEP(M!(+GZYoEwY{HK0hkm|%eh!tq+avbr|mM#70vLCysx@kk3YXOb|k+-ub8cv z+w+?A<*Y}ukVtA1NO`eZR>5oFjAbom?kZxzWyp<W_~pMC?U0E<p0dr-RBb@i<HkJf z#td8zdi(n{I(%u{&)-CsPPQcHc;r-unk=GBUd(Q{`b^XxX<6Dy>vegBAy>xG_WSWr zq-ttB5%KD$m&MiIaU%>ix+(+F;}0b)$u(YS?u;=nyX|l5l+W%RnL0;HjBGO+Fp0)_ zAp)Kq;Tvq!PLzA9;NnCLiY1(}^mB2_EIA411@5*(tMX7Mv4>C=*T+$atCTG1aY{!6 zh|b8LQ^K5p`5|IP>wYrTMCP1k$}4fPgnF2k6<T@**YC}dFTmYOdyy>Q>$H6v^wTa* zUMA1zW4=kotbZrp$XkqXOh0oW5$+VVCj@H-!IC*ICD9hJ*dGB;+fNXd(0|T?TxTCJ zfk@1G$76_+G`>qVSk14%H;53xsWh^z1b%pcsgMk>fl^70V`E=PiyZg!5^;DyQ9_Ya zOZ(-Vi4cRPvk2qw=DV^H`aJdfZJRO&d*|{$$YE2kW5?`8EEr~F3U1#*%J(Z^>QE1C zRJ4b>`XCV)_t)JM<6EYjPZ5r1WAqWs&5jQr<?gZTM!#jxc(JJ)y=f(pVv+r_G?k-s zfP(GwHh4&Epkc1iq7qnGyACYX^gjYTbV~^fKMsjj8sIzQ#ScrUvgH+3L%5w5TAR0< z!UHz)XD@?hvWP#dXaBCl5G!!#uIkCVJ>5vu%0q^kG2L&F-rL*vmuOmc?QCTQJHPcc zHXB!_Gr<od1C!<JmggIDT9p_p)f&qcOfcd~OH0SYbCKjE!<w+|DW1ATCK2bgILB)9 zc;#6CjeO?e-slb0bw3s*BBps|zBE<7G)49=p>V$=DblLFi^TA`#l_eA&~Db^DWZ~6 zcHxYpxAq{s)<BDsYpJ@{?5z_&&0^hPgxD6L69(m9$6_wCfcBq*dh{q}6)0LjNj(a6 zMNKV3kDamCietJBXD1)vZ5Gp7e#S(ST8*Trdrl9<zpxYh#5o^thsXBAr^u^^a1Pj~ zS?<YD`6x_-J={}bcGYy*rMbbPvgiOgMc+?I?q=?@;Fi7a#C?8BfJK0%eNJtUEziGb zFZybh;n$aQ+n|a+NMXjvP^JDNO`kEhZ&@MUnFFV<+}6h7!O8qY&bI=8sYM0L&tP&Q zKJP?wx}Ilf@VPPj^nCPv6UP%m+a26NE%qi(zQ|&}KZ<01q9B|zO>N4daUI!JW-<_) z{7N!>x-0XP>fn~4?Qq(mxpC1!-OMnRv%?7cXjZ$Q7hLbQU0#}-Y5ETAJhC}+wz}Np za(8J>_ak2Pj%jE}CF#Z4kO2Jjx}L?VKQbO~d;-hcygBP2&DK^MV)#j`w17Y?A>4^C z3MCtbo!Mi;m*)BAje>6Z;}Uj`27ciut$`%kFI+1<;Nvf3Q(xMd)!=I=0gvaR721D( zQBtDX!?O9yfQh=|{>q0m@Xt$wJ28D|QO~Yz<vS8qiKoK}Ed9HChI_*EW^6V#MGkS8 z@s7QnF8dhtNAG)U<TeB*6WsKb0M7qO&RCC0<$*ULcv+P!k|Oe<(+ZhLNM#7e(AWG- zpD!b|`p^BQzxQZ!+&D!TI))Ngh%}^3M9%gswGk^qE1JGlR68g-3S-T1Z+-PYHng%K z8X&ik;%IvkxA9eKc%-c=%ZFJMPWMG{=xyA`9k6@SHs-mxo+EE2Bz102Sf9s$m#Rd- zZ<oqe?a5A)cM%fXafEQNyYsLifb=5)mAw6=L-T~akT9MiI$2^`DtE|X*{-GZ@fF*v zXJ<VAkh>w*Tb$>MKfO4#;<7S+$IUr-y$;@k)Y(tcQA8_U`oRf8UAylfpj?kOO_)6g z2wOIA3m5MetymXdH4#`&1vDC9E2}jyv{m9^O+}$@#vlMbV9AH%NH*=Ef~sGLWaS7x z>PSR;fp+p&xnK}WIKB3AoNu!D<@NBdWK|d&_1|(asi1TupYMCvdFetv+-@35igDFZ zQF8m>Q{L^SvfuR|BYq*FuUVq51Jp)l<i*ibq7kjrI0@&t8J!(s1aSrrSCb~S>DWH2 zl?Wwicn$HWBE!SwmJdV%p+=06I;|okRgy({4?lY<=~aE9i@^OT(0M&G=}|QDYx4V6 zYs%PItpvn;=Nl(ZoKjJB(ZSI1$M-uVnTY*EYBYNh1`|#iem@5cK|w*_4+<>wKq##v zuL7etrpEyeJZRpbU}xIys%`qppfMd{*tqEQ(w=vMkeB+C-NP$7{Yx3(<4$|}^%e<O z!meEY>F%GSZF=*@T_KF0%wRAwo>4$V#Jg7$_5csGe^uMX4kDKHcIq!wj<tde))oze zW@D(0Tiu_82y(1tXyBx%Ve5VQ^1CGgwY_L}{6)I`NrnbS40ianF}ya>?)iJt9**%# zlfQc_$N#Ivldl7>`dJOp^w3aexdDd(+7DTEV(;@Ogu(63|F6CG4r=oG;zmP^N>c<B zP!JRW0ci>Xf;6Q_uc0?VM0zjMQIQT`3q^WSN+49}1fnz*0TCfUC=sMc3%!MMH$<Ix z=KlT8+&lBjFyNTy*>cL~l-)fGDkx87hqJbyGvND>a<j<m_xGunJu`ZeRKb!bQ))bF zu*QqkPd3&=bR~teaw9*rGx=s*jhnobpmLe|?lZZp`%E8=so=43O#L@=@5(<-$~7HG zo?X<-wfT^a@2wH5T?=I4&Jh%TuT74;&%{oB_f)Pd<D$2TF)~qf&Pxw*?uWxoJJD3S zbb8CleN^_TN!pM3@!pD_=HmQkq*av+CU)J6`V~>V-~4hf4;cUU|IDYCsq^Wu@GApb z;Pe|?^B(OU+nnf9!@cDVjK!gcVAHnMZtJ%4?X6tf%g|zz;A;$m=06;uoppC{HBB3g z4U(bobAXJXh(_5!jv*hoDmTlx2nx|JHtfB%U}s;&`>?aJ%zkBWE0_aY<JAA)289E` zc*yp^j2uFP?g(o1D#D9*&kP{VuucC(-ywpEJR{99OQJ9Xab8=0L3230A~@<ZKBHE& z!72C?rF1U1z+UOxf3HB{1U5ECjGODmmxTJAYV}Vx9wAlfS{v(TA8a3&_OaoypP9v; zkcBZ_IT6C7%{=@lsSIIQHH!L(V6cZzhA_E_7gOF`8GKN*;)aBmi;9T87bS<%KM&p5 zhlJu)&%o%Ok$t@MtV+~=_4(!E*e06XEk-z%+}TSGjR6K#jI$YIzoga@zU|1l23#W3 zD(tV)<5id}Ct#bj_YTU8QB>&A$jHe>Cv0{4lznrMJS=z%eJt2}F~uRg?bFrGrJ?96 zO7W5H_jl~nEv0<O8{Mpbz%qEcEWwV7Gr&L6%+=$Slh+bRD6`!XfEbohm?HJHOECZ+ zS3a)wSYrnmapK({k>kQXp_1_d?5~usLINgk3mgT0w5Su^q94Oap<hJzMCrlq(tX(= zGx%XHqUjvsjk!1#pINn9Y2CvFKC^o2D_2^y=j^LYD&g=)wi=%K`xnmnUXHj>!~W#J z8c{`#3>$VHq+&jv<*@{geg9~LGs_sjX`kO8?>1X}Ruj=;QeZszEk{On$zl1<B>t|$ zyS1uxA2z8PJPR_G)nM^rLnUGB{Y-k0ZjpWe$E{;O=Dom=9s+)fut{LAe?oxmK0`=v z59ZRiv~dou_%}6eR+T=E^xUPPxp;eTg)w;53ZYZ@Y1Kxx9K=f#T+3D*bgUnR<j*`` z-iH9?ZM#Dz+{PZ&1_enkP)rnTuG5H%x9%Am)#`U%GuSnrK}3DXzC7YPsZPxHf^sQf za{x|Uz<812Hl}4v%D>EE=5%cdRfij{UZC+=_yhLH2R9-;C1Sx3*mh<r5WXkN`t;aS zCYB5G(lQ|d((#T0`M?{|E&P=!8Mj85A1FB`@YCkV0rAsy7ucXUf(j6QYXhrb-F1~U z*l~W>L@Yq+g>oRAkHKj66vAHb@|3%B9E<c5l>e61cvE1?=LbR(5|purrNL;AW({YI z7+HN0^NFI5-gkc14l$29;Kvm4IlW94<@U!ZwX1R{wfmP&rTe$aJdH9=UrX!mIWwAD zsaWfC7u-O5wrnNvuxBRCA%F#27cXP7{(5$;YG0HqKhMkE9hzVdztHvY_EdcX@3v*Z zE;eVk;oI`h4px89J@!L{V7*JgB=csv&&bO9YLP)qZCpd4DX+DayUxQ-PVu<tpFi(& zyyEfAU|!UJ4i40dYpfrBiM%k-TV7lx1Qkg+#UdTR)Mn+Tu}vl4HTkeIQpfJZXFW=Q z4qf_GQ#ursmOV?OgAKMmTRuD}nU7;K(zDI@y(`aazw>iRcW#HZyNUW`NV*>eZb_{e zTc{o(KuYvKd#3sOq-L<p-T=Mk*O4H?$%D`8dQB(#=@D}f!?y!m#Z?8Exz$xw!Ore< zNiTbQN)WcjxPf}ImN8kC!nMIVB0?@+uEF0VWyl8}-**%v&tM$sqOsmspZs0tymn_= z`1l9$#leW4DjD+X{Y+)DFg&3^-@%wS;Q^R_eqP?Y-bbEK9zn_|S<d#C9;<&hN-0D5 zMIY}tUV~5AYzicpCynp4Eq}X9Gh`8nX=swHfAnJJ@ffmSrJw(7l+GLe7N)16ALQQZ z{N{!wa<_Vonv+vQHWZJ6kRB{5@N;op)hg=uyHZ1lARk^7<?W}8p?xOzV?eqrSY{LN zZ`18C{R}-DJJA$!W-#J9Gk$M2eJFn9@r>@)s6XBY+kPZ}yGAXLKM9{%_MNe<rZ^Xw z9eHi1<puaP{UA8YPLyE;VvPFH9kOk?OMSY!?z1?#g^@b?2A{<N@5-<jz1r$r^x6&v zIk=jn4_%|L8?-F3Y_QDhXEOS#rF_mf!W-1b#;gN-6kHg~&4kDYgwq_hP*sfF#;-do z{T8;}(wNwi-0S%IjZZb<eeR5RFO4s11r(T<?w8Dit4cO!TL`CFM`oIXnx~@Yna8)E z?<ZJ1?&vcpHNG`1-rc^Vj(hQfmgCjuz7%jP;|~Np?E+hP6$2m;QlGh{<w^m@fjg-) zzbZr$Q{V5HBV-nmv@9en{1jYH%>V6XCL^?Ymuq?Y*-YG+&v;;bv#7y;M*uht4m}=8 z5_=9N0%6q_b#C=1O|a)6qUjV`uxPGXr$1HiChgQi-gLD0BVR*s+7uSeAedOL5G^Ds z8s#V&E^e8i!R@~pSZ6y}gdJLRU>w}=Z%=Rb{;=QN>%riQUvmDr)3Jb^a^Qc0Rzi)* zRvGsjqvGtVqKuKxFOg4grsqEMr9@XEcBQzR);?VsABpY+HOz`O`b&fQ*S`PeS2}%h z=a;Hr)9aM<bg4BB+@;pSNZmn{2P1E#%~{)rTFDuTNaMRG^Sjwv=q0HJA=dB~^vJhr z`i0Y{PJQqinT5eT?pV@>MxdEImeSF6eC|Uap>*(aQasbF#(S}61RqDF!>s$H`5gTv z5+!zx`U~*~AJ_t_$#I#^D6bZ=@aIYo))t$=0lPZg?89@2D{db8QEfROeMLt5h-LjW zHT5iT2jZEX8?_k)&H37sxqr;Z%*T%9q>lWyJCvLWy){0+7w&n`SA|)MX*T#8yb676 zuD29sFL-Yq+oZurnVg)~>R3nZ;B<Iz=3u3Tvi}?6;GX3n6b+)Ci`A1?H6E3Vqi|ja zMxgQss^>7Zc_&q{r0#xKNW@5;PmejvEk89!CMc!j;CqVP++2|Jd);ZnBIORtn1QZr zsN3G~h^txRpC^NK#9f>}D8{y)0C`v(Q$A)DF8i*=tA4GKyNqT!V<AkTHodt^)3)*r zb;x*Amcda3*?ZjjZ=!UTZs)75bdoX`y-aBt^Ety(#C*2jQ-lO!C1g}%(%@Xi%zaBs z2yk|on3!Y*lKOx>044&2j1O+`SiQv#o_bn_J?O7Pn%zQPZ`8UX{=N)hPZ(|<eeM#V zVSnyEQ`YDvaA&jhi*n6Nb9*1%%QaU*nqw4mFC)DhgilDYUKqg=ioV%#S05WhAOs7l zde|i12M6?INV(Kk&&uqz$oNKjPDg{%sypcg6sCz&or(9?rm<y9118sn{_BXOzp91Q z1H1Qygmv!#i9zb$MS&l4i!urp*oU-bv2=}NvsFP2xfvGWT+7cl=7aGYD8!M^<s#q+ zIU)uKsM&)zZG-hrE}I6>L$()e@fSkH@%sH+h&ew9#c^uLWDORi!(SE_@+?y6(gNRz z*A&xlDjJ>r^Zvz)=U;$7V2i}P{J!?J+c(=IA_~YYV`Sl3+UTqHw1TV*5wr<Hlm{Hc zLq&2-Dh;C*U5a<@t5OneuO;&*fswz{FUlTuj;^X^=GgS6X=!z`Ifrg<vo1o=+izT! zWxegWoWSS}P9$eFXm57S@8g4;gSSR~T#P(gQts34bV)UACFgeJaJllnYF7t`VV@<1 zOxC-a(F{3ychApQG<vxh(Nsm{cEmv;H-1y=6zZ+ZM@o!BZ<TVnGClX8Ip9r2W4#wX zLAIGX<c`RJ5@q^F7uK`D+t)mN3&CYrY=>FYZpBF+bp0o8h~#z1s#k=U9&?q_Gm!HV zI&E~E-5x^GqNOr*L*?DeTfR8in)_6cGqfE{$+LOwZaK9WCR%wp3kzMtyAHG`LZ96) zxPRtS3{<x7u_ioWXGVZM{h`a%Pp4qw;L2Z!xqiO^WYpzY;A8J<*9BsXFJ`jcb@9M^ z4;*FHU&cM939@SIzxGgXLst;Bt>gZCb!s)SrugZkc$xkSHLe$L7!SPfjWYreHLyU@ zIW@<E{L0&xsO7CYcX2}01SPK?|H`%Rk2li`^(sz>s2_o44hEtm`$rs5<)54~_udY@ zHN1#$d@|u37DyG+Z+|m8<QV*z?1WT<z&EE~QSBDFE^Ll9NJ%_l3A4f&_%pLgd(<G? zzRKem7ukYNk)Yu-8OQ#vO(nMd4x_KJpcLsSsI0OCoQwmnqM_X`pT^0H?QSgFa!j!S zCGC?L1SJ`ay+^woW3)m{e0=WEBOLm}vE;P0WZ|(o$)!5U{hhsbImx&_R9y*G&)R=# z=G)@4j$HdSXLf#p?CA_VI`Rng^8Y2ndzqu92}!}{rKuWYW;f44w!eihsa>#EjQzlU z$vV5L<;;1l{>!q@;WzVTSrJCsZ}~-XWhoH?XQ5%aA+fJ4sIuNgalyO{k=Nem$R3X} z3gd?s6jX7BofV;`8o1tfzfzje<r1`}c3H4xoN9f^rx}}9F_hne4*GVzoeFu*8i?BZ zEemXc*f;wckZp0pp@Y=a(&nVO*tO>krm7sEnJD*fkJqmN9*~KK9t~cA_XPS#HRa`H zjx9AG23J91I%;;NJKX#dJGwVmPSll_i<_R4As;9EAQh)ANX>sKr#+&!B-&HLqaA~p zzxiYCrms2l<mrWvKU>1<)yHdlq{M!l^K8LI*VAt=1oJ@AWXr#i*qVI#Uwy!h-RN1P zJ4$o*8i^<E!j6n5_*G!LG1osG#n~BTc5aKgBSxZK8xr{RO)f*}_0uttcZRzMr&ZoP zDJ-;uL@i=#tY*3|j&|&JNcqI|QUus^_x4DgzAzh0iI+Z!3aOL4)A$PNuvZ1O;_wUK z4zv2|*KvJFa6I_1CaC_J($Qog%zq~>pA>82T&K|9&d?m_KJfz;&0ul;Ev0%M9atxV z+$+^{xZX@*TBxVRn}p-M{gp*9%ar%>i+gAn0?ND8JW<_}5uIP{Jf3mpMNhFwLv>&_ zCiZAbe*dzC?Df=*Yw36q7k?}^7}f81-~x|<=0rZYBM*z4jF?O=Kw`I2H0Wzh1tx!O zQxx!WX{5KVub+MSnIq<U0cL(V@bJ56=w!$ai#pEhPcCwQ{r_mawc2rry)W!LmN~Xv zN>^96C06mS?X`0hEfCctenwdk%Ka2S5h52%Uu%rCvbU!znaMWgwW>C~0~X-EebW+q zEfui6{LTfMnGRV#b2C(mc4q;|wh3bp=aGCwociO}u;-{g>P+On$5m-?XBnx8x-KEC z``x{cW6_%#!JCmJ%bPAY0#h7;>5~!NCHju|NO;?iUp#8+8r^mi^(6#FM`)=J%d7kJ zN5121|NXzlFk+U@5AQ!7&9;XdYWu9`UTj=wpKbVBkDUyjpb@PvU*<V<V_hs%^_>xm zjNjRT=f(mI+B``hf8yOT5O=_}{NjodSmhXJQpY)A&91K!V<ji^Z?s2j82j}PS82`e z5bw8V4O)+s6Sfl)7rz87JU2tMP6iUfgqPNYmj~>)ABV*%s%vJjFw)AQ^c5<Nlz0<T z`kK=5px7=H!XoKS9jlm&*<O6s=oTS)IHP5%Mb7g4r`=_d?f_$|$V{Y9p3ZLw+E!q; zpJeUasY6IajEE2@*Aob|6k!Q`H}t4PJ4_pXHd^5;O{fA4<UDnCUrjtdJy(?iQY*^x zu|F%DI+)8S(jdQd1s$=|7p(s*5lCo`ko`%6%6mozPKBQ2RnlNN^p;5QV-9IUoN>6T zR|JR2k&n9+5u=JCWA3x9Yjg$r53BT%QNVG#5;wWNN!Yv@$~a8H$L^Axj#m6C(cxBU z(R3)iL|TQAp!sK?Y0a$Iq42;R?D*k9sX&5FJXx(Ahds3C>({K?CUQlAOjk8CUZ1<B zpVe<)FwdmSK_|=7dBOTWm3Q4c=ILBzh>6+W+$1IX?XQct0t&uWNida%G1oIqYP_8$ z)7V}T*)yvi^Ed3G?X|gd+9rN)&8LarpqeDO9}IC`f)(d$Wc<*vQ@rtp`g!<?o2lxm z66q(VoiI1sFTGLAzz~pz<xqC_oduZmS_ZD046l~o$AHFXU`}!nJy5?_R)5pR@}6&I z9iYt)zgOSILuw2A?Q^t}6BR2%9Yu3XW>i=P1(@D6rEo2mTX%f3uNK(ia=qaUjlMp; z_DA9P|Icy0?SmZ*=#CRKcRqwRNMY2$Ug3n;7Y_6k_+9%d$~2^4v;hVt?YGXI(lyPT zO|jSO$#n{nDP2l)k0=!DTx*A9q)ixIE-XIh(JQtO2d=+|eu;+he~G;%%7@JpJjo$j zKzCdOdigTPSU3M!m8e$L&T;Jqu^$Y)vi%{j*9>~Iy+#d;=Fcg4>~d8i*t1@}jg-Pp z;i{~~;!yLgLyW=F;6_5TMHk!Pj==Tw>yQ%=2qanPX>HBi7GaCybAWt+bX3l^mKjDS zI>Nf8___)O3oQl-b540kpjaq{1ug$tb>|KxgW%jxpuwvUdS2z1UD}U~5(UpGth}i& z38tm(u#Tq`x7w!jwI&acQo&seN2^#uAhi#vL%{4HdGbbywxA1pGmK`NAI0q-XMFQi zaZBzpUEkSwK*N@1qD%C|mMwkZ@O{aiH49K1sW+mQ(}<B7G;R|AiX&1){Yqy=7p7)- z*R-fVYG-HX-b)S;bTg{=nHmefbef#*q7xSgbap&Ytu9SB^>Z%jl3QtCv7BhQ&OOE? zq!hetEW@t+YD1H$@w$2+))+Y;$-u}EBsQ!8g`gdEAjd%OYHup|Ecl})9K6g9MK+C~ zcoFKj<YBsPtm^2LSS4TJ+dgNDK?gxF%tRj2ytLr((y7M>o_!*0RGhAF?fe?(m>`g| zXyROSi}*T&PpjZETZ<FWl0zt%^bPJ%|Dj!}&;;;3iwdPBcqoKNlshzdOr)!05~7N$ zwCyn;r>kx5p%YhiajBXftE(+r{`x7E0s;}1C8Gw<3r&5g2taa2mC~r-OsqfA`340A zt@$R?ZGU|u?DjL3>XijlX%+d-x#n}l!V8UtKsWqxKwfX|qv1Z3g~JcOtnC%%*-4+L z6|<P9^PQ~dwdM&W5O_i>Cp|onK16PaJCY_KoWs|7=va4k`6hqp74|q*DTyXJ-~7H| z6f7e;;$&j|Xcb>4>(YB{k^kax2;?jDxDXg1n)>`}w5F)Khh~fxw8mJ{2P&)sZT5G& z|FfnA&kkrTNO~-Wr*m~fj$%(<o+bJiH)!Ad@l=8xPiS-9kHwOQMw=}f4XEl4ebAtu z?h$joW`U=D`$RIMB4`%!VPg`orWCsEijGO1P<(Q#14@a48iFqV^K3x{Uk`)AN<w`J zTYLmfhqMZARLvB)2Fk^Ur#EBYId54d+Kl7hV^J?a4<S6+B$c@Tlx{mR&u%F;Vv9|W z!W84R?uW`&!F7H2xy`wpt~70oH#0Qc?jpyM1Mc1>@niA?=W^0~{ehc&07tti)FrVA z45%`qHn<QQXsrcpzV)3FaP23FqT%Q)SWtysie^Wx3a%y*HOU`}mv(=!6i5{>jewni zSmrSu&6R}?4o6NuKDg5-;-k>o)p9ztk`KGN`@H6K=*-N_74<&x;DZ1Whpx>JONp14 zr#+rd7O_G*-hJ_XcG>kM$L|%wQZv52gMl%VIZzC+|3)25gvgr9I*C)6(K*}lW*9;F zR^;_xQ(0n^<D(;<ed?)qhjjBb+UDl$Ig~5*-M_h<A2IKm%JN5zZPL%u)SNuVe0Am9 zYP8_k8Cn|8;l*Ae*(lx~kxl#o0#Tnlvy+*US0~&Khg#Uh(yHKsnuGaOaQ9xW`zF2< zBZ5cragxB_E#T{HKC9rSX@=?PAWK3!6gec#jq$&8k#`jIf5qfN(O9v%dGF;($whA$ zj1L$!jKotG9XQ;K={4F%zLo!^5wsMEH1q2@&AHr;-a@P3Vhfj@IbBo6N{Cb(CTZvC zayg0s7toDDYkBe%o$uBS@yG}fcGkI);zoYum-Ol04MS_HK>eR-lc??vho|?f?ZrR! zhh7WCsN$H}OiTm3We7n1CP{O>^rd3YLHleba(?%X7Sxv3EvKQvokRI0-g|hlN~)Oy z$T#_sd_!nywc-7Bw|g>W&The2sgt+3LtS*C#~?yZBvEkW?Ob(H&<-dmnYZXDPC_@R zTJ6_V(vK!2)Nv>`VeD!I<K9CdkeE;?02D}w69R!)yM5S_U3+zTnREG+iX}kRKi_q} zw%OUr;cn8xY?Mv_6zR*??3iooR~7_SmL}wV9@_{g6A?#Elr%C)1Y&OEc2Ds5{KisD z1P!Y^MH<KFvk7SBtDVMT($%$DL=sw&NLZT#5Ro@(BHGI=DH|qD_aaTau5m=AZ~bJt zH{s*GYk)moSw~V}X#kL0uxHH{h>Te_EKY>fCm*R#e=u7%Fx$eC`TWTcqI9qcHt(%I zc#SqFc?u}avD5u|YDz@CFI;kQli5E=8Q2aD5}~NyArOZ^7t~5I4U(^q%nH}{|F_K) z{q_VJk;Jeg-tn<aotYa-5vp}O;RHpbYPM@Gor?mGOW3MU>(VL8&>R(NLCV+qS|v-v zX(6=XT<$Oaqg1e2ofw=<zB^E8#!`w|@!MbBNpnPQ<)_cgDvgix9)agzIRXJr=B$3m zv&#Tt_Zk3w$Wz555I}3q)gNeP%*^N;7~rF66VXWmW>M8nGzt_WpCxK~y1Q>zcD?{| zmO+v;q4x-c0N~k9o?Q^@6@Yyuf)<R7jFWTU`(GrYov_XakcMla%_|@G0^Zu~))G5% zBN?c&YhGr}FK2dKhO76rSSIMi**8mIOP<b|>Dolml0MQfh&K{}Xsh63vrm~W)Ph<F zhWf8L*d-pw5&=@2WC?0Hfr%s9*(xW(&xl$NG0tVh@Fti>UxQ?NcPdd@VxE!&&qN>I zFSE<J++&r*xvbxbi@0k7mAQdQ1&70cQV-gay4;j+h8-w?W9bx}WyJB8YaMA+nJogb zYipEf;g~Y*$Q>${h>rJ(wzB)i2Z7-9NfI`w3r2FSXDuIFz5fW%LcQ-*y2cEDrLb@_ zv-3*;owxr;PzeH&)LF3yAW<eZqG5tN0c|qW1j~rw*x5C8X<AG|8=PbVxZIFS5=Ra& zW?d(25Fh)}Ah2_RMgc1mZTtM87;^(i$7xj@pX9CH-)UMzvXLw?L@^J6FaU22G3CHA zQc~(y2wf_;h=||6e;b;ZL?@a1@g$b;EdqS%@3^1`RSIw_!I%ImOBl^DWEG);K$sFq z6nlY~-<`VM(^Kt4hy+b7c~(0!#>r9y^t8&)Ac^xD-8l<D*_I^UF{Z$U*i^-3KBMzx zXK#|g%=6nCZK9mDi>Xt9Rb6;ZYBaD{Ff`K<yLk}dyX6evP8Dau6MBfBS$U1#;w3V| z;SVF!;c&*zihu&Ul&e=J0?VW6d?ow(`e<p(YioUlRB)-P6T64g1FE==dWGK8e!%IX z&LI)ZVnY?jR^vqY9N~*8P{HNdS$TPRDRC~x9$CM_$jEN&Yaka3$4UGklvqH6OYBnE z6y#~G1wvh3lkDF17t_+3*ET~w4GL~f1)zD$W2EP;%d=qzdVs-Q6*L+eYK?&pr@z)+ zZU-DoC5a?cY7oVqCE#vM#8yW#p!|WAPa~)61zL-Y`HhkXMw^Sy+SFbU2t@wR^OZpq z0o6{}lk5}eliZ=NIEG9&<7!|{F7ECV7cKm@e|iYpc2nO{hd|;asVu>JkamEzfH8+Z zsu#gaap?j?tGd2hj}Z(7OD*i`eYGIudw*?lx@}3l<mp)L0&1n^`Y$?h^P-q=Bj{CS zKh4B<HB#3l2@7YeVGxLcEYW9l71D!mBvtUq03U9R*3DpHSz>nMqmSfOjkMbG*HXYv z7xR^ltV_(QV<fMZ7tLoG7#N5Jhg31O?|R5cG%wGHDbmGzMo$cDT?LIfl9WPRXs+IT zE(x7))yld2<;#~uj9h86OW@CjR61X9Owg60vFRKzbsBxIj1rraiF&Q^=S3|b!29Zb zw;5^ivAMt<u{d#+_Jv|=E-EZcj6>PI-sJ2eIvfVU8Ip{uEAEF^AZO3o3;{SeD!BCr zhmxVe&8d%}5Z3?_nZ^GDD(qmCNF$=Yrp66C8}U&S!(_FWzfytRpWpruc(SS_(K}sS zUm^&c;f`u2{3%XX4m-aZA`~qCY3Cbg$HXWx(>Z0@lsi;%#h79b>8#C16L1f3=p0E% zPMVux7>Q=Cd|Lx|@Z_;9#Rwc|XxX2y!|%Z1UZ4rPlxd9H4^`YEC+&4w+I;^tDthIV zfP9m)2H_H9kdP~?Bvj7U#%u(y-41s4^4idoZ&ad4^RDD;Sd1Jx&j~zLT9VU;`>zl& zhqo~bs<un9XeU?2Q85a%uJ%toHHT^{w*F?Eo{_XmksjcWdY7#MQ0o&3!d+*7c<tL~ z%=E-nz%*X|`t}-a_tLwvI2V}CO9v<a#B<RcwinSW7H}^-u0(L2%AVc7*!m8(;qh?= z@_VhakylqZ$LMb=GE&&@N#1ysdSR0J!yOT~gn~K^KhdjIvJZxgXn$<qS)5n%8g5x% z=;m7+nB4s8xi#Z)4bf2GS0dBY^9SnK6Kr;7a=4{+F&jNrYMjfKLJ`r7f*Ojzu3PvA z+VQCOtz$<uW`^%+0(G<}u_M_KnCq)OYaaVShaa?{N-1yiiKt(xP9mNBwa!&RV6Ur7 z=98=#RB(&)mPDG77|mq?!ies*y@a6VL#>!{Sd;sdiio-}1*dCGLX`#|(b;<#M}n<F zt;DG?Ff<FyhNg84=kn^R`$%ojWI+<zqlHdfxo_PFG>cv!Sqq_?Ktv2OW}1Pu_^Aag zO+X_Duz&$Qiyq3re-tA1o~L4z$QYgD+gLKs*1-gDLcENw)-I(>u&kMG`!~j4^~FOK zOGt>(AGc%<sOQ6s85x(9=_|BuTR{LjPZz=BA|!R8`A5%@!~pC+x7oqmr`XFKv;_z+ zByQ!difbGDeyQ_2o;abrq(2k7$rsuQ!lw(sx9wZ^1godvK*%lqNa~ktZ)0=-qBFq( zul*J+Xph3n0I%|zb^U5@uH}u<0VpKo^B=UGgTps^ZueLK8*NSWmehOR8zX%LzV;m2 zzYPQW`H7^TLiE7lBs{0v&PdLq^SvgSgzjKh&M;o!zu6*u6h`XaAu;SLQzBXh=*5eO z+Ifv6^nA-iXObYBBgO4nBqUBM5pCp`H)`Lk3ZOzriez}czOLXKXGug0wv%%%kBp3T z%`Xzo9We?30tAW=wrx0IXsTgjb5-8gLa*$6u_~=eu^FlalGN_(Kn6kg=8+7?G@x)i zm<r(9<n=ogBlb?Cx@tibX`>kD8luI}B}J}iHQ)m_D`?*?fyHsK57U;LLxYR3zl)cu z832Z;lbHK(pbT~p)F%?J*m^PnJ+!~*JwHmdwpO|jcn-v+Dt|`)zJgDXMis}%J~760 z7vw6+8yjx}>AS|>)Hpbg1g4_PIls@5-~fPyg9I$XE_W&RB8jYZBX2Z23hfB{7l9FF zOvSUgQtZh#jQYhB8M#VQk4w&pXp4gRU4Po%$iUZV$@5jPCZpZBBG{NYox{&hNeup| z`4+lbneV{DiHnfN&U66~6QJbhi0u$MasOGvhK(_hrbtpURD?iIzc`W~h$!GwX3_j^ z1MSLB@was1R^o$FBXr`i5my=gQ2=J8`W8K_W#j;EUXeTEETrZ<;OwK6>GBBQ!~3s6 z?Qur|f0`Ot(Dq>YCSf|$Ujy*ewe|dwzlCN%AdEk+?N#O3vBpF+Y)ZhoD;)dwy=rJe zXQro#7S3<OUZkjN`ooeaR?dZGb8OEkMjRGrlCZ*k7ssKD_n-KDRpWMZ*>WmvA}u83 z*h8vEz{Wua6^#;uxuYgt)R$O9NBCRCW93R2n<Q^NUj5aTy%0vlXk}x=`I2MEU2;|( z3(Q>UVisZlV49K1NqA-hFWs=-&fIZjqR=^iZGZ?uI9U>vEl<MXqkteZt*|8Y(+@a} z1hj1hpA<2M6Hg)Wx-1&#<RddoX?wCNu0NsQ#0%fc7upvg-r#w#hXuN@<Sns3dH{o< zKah|aTuBG_;_q1-2LjU20pi4xlCj+$2F~SOw2veBt>>FhC$6q(Yvebv6BcHHx0ND; zFwu~tWI-EDlP_wbyuJj)jHv5foXg!du5=D=pE3S3Jw2St?$tzr-F*Sv<8%@~6}8~~ z2_Trlh;;2|!}Ni%V!8fD9Egp9&<Xgr%`7T7eUJp|c*(J&Skq@Tv~dM=%KWF(yKs0C zuz8DWX%x3vgz!30A0iTmYm(Sc&`Y#|pKZ$rDFy{Ke~QLRpgZOI(3)2qkMpp<N0@$7 zKp-Quq%OB*^x*KB#|LxEYB(C6(7rySL{<ahkmCNvOD2viwilnTY^54ql}4hfU%j`Z z<B+|gLi3(S>yfca2z$!g0+rO~iR69}-`&Z`DYEqw&KQtihF=mm!+Xi?%%uWZCzV3- zeAX;bO*&=$43qOP%ba|xw<F#U)v(sJSGQbJsc|RbBG#y7t)Uz_dLHXRnB7k#%@cSx zao+f`{hm~prpNx}h5@EjwJ>Q{T!?-D@JmBz^L9;=yBv<Saqi2tYnAmx*Q%R><hKE< z#oFq2n?a$M?Yl@|Cc`6&g*1~Js<=z824VM0*8Il<YadhWS+s}~-#JA_jF-VD`KlXB zyu9}MN&J2|hnZ_Nt$328o7VUnc2|G@hOcV$^z<r$62c3jV}9;Gyo4=eQpp1-C3z0! zirHP6p8dS(GhXRoxsg(HFh5LVN{H*kG|xD>1p0eEIJ`#K8<N%qJ$ya=uP-Igm!kGM zK}3DL^stZ9buz^mIc<(*voI@ydk@$jlz=)wSEyUg;TzY@G@Ex<#~#GR6US*QdxW9j zU(-e`9UZycyRWu_au3)N(Xp60T5)pdtF*XS7K3*>URB2YOt+-xD)^{4kTfl__}X6; z%}wn9vLKdYv_}Cd$Pygaibwl@7eOfk(q<$l|F_kYkcb`_s8$=5I&SlZN0}~`F*=qY zE=<MY^eOCTRJ0&!uMlHCrV11ek_^i6gK>b5W$2Iir$NL1hjRQlI<OE`(@r<|xxT*M z^Ro^9d&ShEN<fZPdBN8TzrFO`Qyb)s($sf-R^BBwFJI`81AP0+3<a(N@lzHuA<i0^ zGy7RYU2HbkpTcqf*fCI<$9rRw;dNf&mnrwjn_?U0eaf`Hcay13mKYw6jW7EDZgbS2 zA<{<p%)e<dbgUSjRp{aSLFc=(I`#5Bw<_*D?O@)OvW<<6-x=u*@4ZJQ-l+Afz!Uo? zU933+QpnTtekWAfPyIBo7!tdlY7263A$?blFcP#Joz(;j`sg2={x&*sj?Pem6N>!; zzqZjPI9htsVIXZ==1JDhAh_rwl+$+1KQ=aQ*B-gswT&lGpux*)ArN9B7JT?#ipLRI zR=IWH$G^f^#_{>V{{H?h*ld(lH9x>3oEq2DIXrB723A2IJ^q`V@6ArDgXenfcM*Qc zI+uOx!=fo8DK*ee8pB^XGL&~?p;6L)-@qC=^B(5x%_>7bs9$1Sc(QrV25ClMcw?hN zH(uL)TrSI|Gx4_w?O@~9h4beVx5hZ665j2ujBho+%xJL&VWaHDe@#AcV@b;4-i_Wm zIA)xpYI*G}<#64+IkN5%k|UKim>C16X;Z;bXy-edOo!JMCO9S5UX0(H=qL^bnfqyq zzwL<A0A5Dr%xdHJ75R~zM9SOEl$g~of9zMO)T^>rzt1!<F0qEsj6>glB(3cE>r)n8 zX7aCtN8QpJPw~Ms+W}HUo%zSpHLkeHNX}|lb;**m(~$eC6Z$3pX*PbDs&Jh1GKfd# z@9p1bN_k`F>Z(=6p=`7Hb_e%r+;`TY)dFzxvEpB?>CWAy+fEuI(5M=tv{Z3Ag`Op< zmh*FS-}Aas`!VDBKk|7KqHa{4?~u;qf||VKknmm3;;0lN&lJtSNF%-6*84ah28^oU zpJ>bgHJsv($|w>HHR$4mW_Ho}y1VO0uXq?iO_-h;m%E46uRXps0}k|h>+DIbG^DbZ zaVqDugwya8_J2noZ~pzrrD1YOQbv6baKZ4>UzN%NXD9>sqH;3*@h;!^646~9a$=IV zprAsS>UYybG{f_3N>B=^Q^a#2xxJ&Ke`ttDx%+LNb&lr9m88x$TjnQeSOIlD*V)=Q zcU-M@xpDwfgM63%>e)B;3GtHmgLH#WgtRm@<3E}fxYre9EP~BI@rW-|!=?c6o=pE& z{F~fSdPTx-JtAO2cV?v2BXqQU@>LBzk<ScFfBF3A@&@O!CTdGerGB}QFO<1MIy@WH zaydJF2W-DU?M$cM5QbknCnn)%+KI(7t6HiHhIa97n1ec)tA#Z})EOQcKHx6l^dmkg z{6jZmHI|Mlz$yu4M!r_M!CU$6b$girntI2w$HvToJc9uPB5DRtmwISa8LPMHXoEP{ z-WZyyiF*D#Ji#yX)(mTp`_IM9{jY(fw(tCv0b{K|iamP#K3A6;ML-^Tz;n(rFCU-z zc4jdib=}w)YE8jlvp)4S4}>1CJzr=;eLY|2jaX`$Ya4~iewSYaPF$lIk*WT#2iQ@F z@INGFfLlNh+x&x(47L=GDAaMM;YK5%+yJxuCedW)q7{C(l7ahJ3@m_HJXd)spJ?+Y z&HJPVwt45<UDEje$*8empDom7fRBCIF$oPgl8En~A0tTTh8~bT#)Hkd{o~`MkvgA2 zIfJg+>PSG`Qx_%kOifa&eBL)Fzx(YZv)fA(*$hTEL-vnJZtAKy2a)K>EZcHe_1GP` z8fR=Cyhxvj@bQeyc(0uRbFk_5osRND(LiK>@TUs3F+%Z;TXhYUxz<=vi@%+5FB`Oo zdryuAf4~P#rv)bb)j#;vTliWntU4oub+mfl8);guW0$BNX8z{auLn9NCK|_%9RtVJ z03A~&OFg>NJp7~ECI;??pFYPp{{}RJ)B7v&mXQU5p@$2o;O4jeGZnCs;HsqnbBsl^ zHVTDWwL^dkA)iIg1vBG?dC1dJ644JI#%`x7`xP4_$JiscK{m}b;~y_L-!{Px>b8QS zr-4<QC@w0}O|1?v4ZD+B@l_A0pP$(5-goTht|pKclR~{8v$F+h9$a=7RmP*d6JV`Q zR`t?f+*bus*bkI@W2{-z!vt#L;{!_a@6n#446NYOoj`HCT9Ds&lDO_SC++_5p}T-q z70~y(J?>5-<_!Fkx5O+U$OdBs^^{S%K?w<o^=xKmt?be)A@bM5Kb8!>d#*~U!>UD8 zZ;IS5zC>P}pKt5JbiyS3`SS=O6ZxP0GauS+ESkV+Pz$68=rxkJ?3`Ki+ww2fZ;}+O zEWDD@B9xr6KODJ?t<`^-_P{R1-uHpLQA)~NC3*|&?%rC@k=`1EyIG0s16cEsgwNOU z`yIgDc~0(_o}NDJy6E*~CVv9Ij>Ftye15CWa;`FHG^R4sX3YN->v_GzcW=}PPri+= ze!3EWhKK{kXa2P}F(EF10a?}gbrPb&@pZ<iF!M0EEXBR5T`^rH`Ebe<_Oham@m!@i z-gM&wY5k(%fpE41(G^ArBun8R`wqzfqR@{K;_avD20`Tr&mkLwg63e^m%3-3Q?|$o zOaC-@=@EKC)$*#XGBQtW%-76rPFPv+c(?QZE~Z(92&9kh9|8}BSgF7y8g9dcUYRj- z*kmbQ*5c~Uh^7>kA5{>$$lWP$N1i*H`(wo(c~I)?$IeU8>oFfsgW_ctme+JMtaWN` zoffVe7$z*T)Bi?%OrD<FYA`+NJ2o#vQ%Yh<7}M$SYak4nmt2Cyz1I2K{k2Wcg%^Q{ zGk1~DQPIYDA?A5?-quz^$NiETs-xFtx)rchw{#>@R(~Y`@QMcPJ@g=9^4SOCEan%f zPh@(TZRx1=$LaN7KOb-H<;1UVfU)wcXRNIB;CUBOpRwyfzrA_LqvJfx#lXmz>x5N) zyMFfz3Um6RpAwk(AcUk&++SVA8?Q4_H@(3NHjayQ{Q&E9rYLvLl<9}R(sWD3E>?P^ z9*k_pVpGvP?tP+e(;b;PPN}Bw{$AeIdBPUn#2hb723g)xLv9@j3wm^Gbqpm_f-HuE zjkPgtZEeZFH>_^FdHX52QIn@FpqY*K*7WprPDxRK2QsoRUqhkq{Uid>l<C>;@4vZF z-&ArE>;?dL1p$$PWXV$P9|Y!J%N=_p5(Q44v^^40!6doJx4y%U|4PekE;~cZgYk+2 z+1OU!+ud;Z#rf4=sL_T@1|V>vf9wwBd%K5u%r2vTely+aPt!aSJmPvEoehpf^C$#a z5;nJYzP~F#Fd2C5kG@TnsGWav6<}=0sZSTt#OY{dfx>trxBY+aF?v*1Hn2~8V0pnc z=~i4^ERTuJbxM7N6|FI2R&C}}NI<0Ncoom7qjnZ_H4o~?){a4z@q<T(Bn0~IHTz7! zT<hmoglXMFU-{c9?1(fEQ|4H!$2*Fw@jV^izw4|Ms3yZ%A8%s`HA}u*ZHyU}J5-Re z&?CPPqE%o*yS*@D5wtP4_i?X-c4eC_UbhLPlua#~SSu@q>*nhxz0yy!`V#nohFCtO zCsEI`hJAS%^y)vuI1N@dI_gW*F(t%KYgQiI082zAtlP^iG{pHr_2#9B^Mx#rtMIg` z_Q(W#_o22H#+$4OWtdd+p$ePMu&z|G;2)lg%pLK;?7&Gl%l?Ps;H{C1fBgm7%YRWi z<j!9M015l+nn5Tp{{_sm|3HuXA8cun|AmOGGyflLFk&3YB|wXzP@<=fz7#y~AMozQ zUw<L_3>y3|@k39F;X%Z6=kJWw$Sse)0;}7k_#3Q1UH%h?K)7Ik0vq(R|21X_Hgo)s z$p5!x>3>89nTh`q8S?*s>>)|=;{P!D$iDnvGCk~z@e?7Rw7+!{J5g59kT1Do`Q-lr DXkF?m literal 0 HcmV?d00001 diff --git a/az-animex/az-animex.js b/az-animex/az-animex.js new file mode 100644 index 0000000..d2b5ad1 --- /dev/null +++ b/az-animex/az-animex.js @@ -0,0 +1,312 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://www.az-animex.com/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const ulMatch = html.match(/<ul class="columns-4 wp-block-post-template[^"]*">([\s\S]*?)<\/ul>/); + if (!ulMatch) return JSON.stringify(results); + + const ulContent = ulMatch[1]; + + const liRegex = /<li class="wp-block-post[^"]*">([\s\S]*?)<\/li>/g; + let liMatch; + while ((liMatch = liRegex.exec(ulContent)) !== null) { + const liHtml = liMatch[1]; + + const itemMatch = liHtml.match( + /<a href="([^"]+)"[^>]*>\s*<img[^>]+src="([^"]+)"[^>]*>[\s\S]*?<h2[^>]*>\s*<a href="[^"]+"[^>]*>([^<]+)<\/a>/i + ); + if (itemMatch) { + results.push({ + href: itemMatch[1].trim(), + image: itemMatch[2].trim(), + title: itemMatch[3].replace(/\[.*?\]/g, '').trim() + }); + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descMatch = html.match(/<div class="su-spoiler-content[^"]*">([\s\S]*?)<\/div>/i); + const description = descMatch + ? descMatch[1].replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim() + : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const initialResponse = await fetchv2(url); + const initialHtml = await initialResponse.text(); + + const filemoonButtonRegex = /<a\s+href="(https:\/\/filemoon\.(?:sx|to)\/[^"]+)"\s+class="su-button\s+su-button-style-glass"/i; + const filemoonMatch = filemoonButtonRegex.exec(initialHtml); + + if (!filemoonMatch) { + throw new Error('Filemoon button not found'); + } + + const filemoonUrl = filemoonMatch[1]; + + const filemoonResponse = await fetchv2(filemoonUrl); + const filemoonHtml = await filemoonResponse.text(); + + const episodeRegex = /<li class="d-flex flex-wrap align-items-center justify-content-between mb-2">[\s\S]*?<h4>([^<]+)<\/h4>[\s\S]*?<a class="btn btn-success"[^>]*href="([^"]+)"[\s\S]*?<\/li>/g; + + let match; + let episodeCounter = 1; + while ((match = episodeRegex.exec(filemoonHtml)) !== null) { + let href = match[2].trim(); + + href = href.replace('/d/', '/e/'); + + results.push({ + href: href, + number: episodeCounter + }); + + episodeCounter++; + } + return JSON.stringify(results); + + } catch (err) { + console.error('Error extracting episodes:', err); + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + let streamUrl = null; + try { + streamUrl = await filemoonExtractor(html, url); + } catch (error) { + console.log("filemoon HD extraction error:" + error); + } + + console.log("filemoon Stream URL: " + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log("No stream URL found"); + + return null; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ \ No newline at end of file diff --git a/az-animex/az-animex.json b/az-animex/az-animex.json new file mode 100644 index 0000000..d5696de --- /dev/null +++ b/az-animex/az-animex.json @@ -0,0 +1,19 @@ +{ + "sourceName": "AZ-Animex", + "iconUrl": "https://www.az-animex.com/wp-content/uploads/2023/11/Logo-icono-144x144-1.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.az-animex.com/", + "searchBaseUrl": "https://www.az-animex.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/az-animex/az-animex.js", + "type": "Anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/beatz-anime/beatz-anime.js b/beatz-anime/beatz-anime.js new file mode 100644 index 0000000..86632ab --- /dev/null +++ b/beatz-anime/beatz-anime.js @@ -0,0 +1,103 @@ +async function searchResults(keyword) { + const results = []; + const baseUrl = "https://www.beatz-anime.net"; + try { + const response = await fetchv2("https://www.beatz-anime.net/busqueda.php"); + const html = await response.text(); + + const cardRegex = /<div class="col-lg-2 mb-4">([\s\S]*?)<\/div>\s*<\/div>/gs; + let cardMatch; + while ((cardMatch = cardRegex.exec(html)) !== null) { + const cardHTML = cardMatch[1]; + + const infoRegex = /<a href="([^"]+)">.*?<span class="titulo"[^>]*>([^<]+)<\/span>.*?<img[^>]+src="([^"]+)"/s; + const infoMatch = infoRegex.exec(cardHTML); + if (infoMatch) { + const title = infoMatch[2].trim(); + if (title.toLowerCase().includes(keyword.toLowerCase())) { + results.push({ + href: baseUrl + infoMatch[1].trim(), + title: title, + image: baseUrl + infoMatch[3].trim() + }); + } + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const pMatch = html.match(/<p class="post-text"[^>]*>([\s\S]*?)<\/p>/); + let description = "N/A"; + let aliases = "N/A"; + + if (pMatch) { + const content = pMatch[1]; + + const descMatch = content.split(/<span class="mr-3"/)[0].replace(/<br\s*\/?>/gi, "\n").trim(); + if (descMatch) description = descMatch; + + const aliasMatch = content.match(/<b>Sinónimos:<\/b>\s*([^<]+)/); + if (aliasMatch) aliases = aliasMatch[1].trim(); + } + + return JSON.stringify([{ + description: description, + aliases: aliases, + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const rows = html.match(/<tbody>([\s\S]*?)<\/tbody>/)?.[1].match(/<tr>[\s\S]*?<\/tr>/g) || []; + + rows.forEach((row, index) => { + const hrefMatch = row.match(/<td class="text-center"><a href="([^"]+)"/); + const href = hrefMatch ? hrefMatch[1] : "N/A"; + + results.push({ + href: href, + number: index + 1 + }); + }); + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + return url; + } catch (err) { + return "https://error.org/"; + } +} diff --git a/beatz-anime/beatz-anime.json b/beatz-anime/beatz-anime.json new file mode 100644 index 0000000..776d8ad --- /dev/null +++ b/beatz-anime/beatz-anime.json @@ -0,0 +1,20 @@ +{ + "sourceName": "Beatz-Anime", + "iconUrl": "https://files.catbox.moe/vij8dw.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.beatz-anime.net/", + "searchBaseUrl": "https://www.beatz-anime.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/beatz-anime/beatz-anime.js", + "type": "Anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false, + "note": "Use external player!" +} diff --git a/broken/videasy/videasy.js b/broken/videasy/videasy.js new file mode 100644 index 0000000..409607a --- /dev/null +++ b/broken/videasy/videasy.js @@ -0,0 +1,178 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetchv2(`https://api.themoviedb.org/3/search/multi?api_key=9801b6b0548ad57581d111ea690c85c8&query=${encodedKeyword}`); + const data = await responseText.json(); + + const transformedResults = data.results.map(result => { + if(result.media_type === "movie" || result.title) { + return { + title: result.title || result.name || result.original_title || result.original_name, + image: `https://image.tmdb.org/t/p/w500${result.poster_path}`, + href: `movie/${result.id}` + }; + } else if(result.media_type === "tv" || result.name) { + return { + title: result.name || result.title || result.original_name || result.original_title, + image: `https://image.tmdb.org/t/p/w500${result.poster_path}`, + href: `tv/${result.id}/1/1` + }; + } else { + return { + title: result.title || result.name || result.original_name || result.original_title || "Untitled", + image: `https://image.tmdb.org/t/p/w500${result.poster_path}`, + href: `tv/${result.id}/1/1` + }; + } + }); + + console.log('Transformed Results: ' + transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Fetch error in searchResults:' + error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(url) { + try { + if(url.includes('movie')) { + const match = url.match(/movie\/([^\/]+)/); + if (!match) throw new Error("Invalid URL format"); + + const movieId = match[1]; + const responseText = await fetchv2(`https://api.themoviedb.org/3/movie/${movieId}?api_key=ad301b7cc82ffe19273e55e4d4206885`); + const data = await responseText.json(); + + const transformedResults = [{ + description: data.overview || 'No description available', + aliases: `Duration: ${data.runtime ? data.runtime + " minutes" : 'Unknown'}`, + airdate: `Released: ${data.release_date ? data.release_date : 'Unknown'}` + }]; + + return JSON.stringify(transformedResults); + } else if(url.includes('tv')) { + const match = url.match(/tv\/([^\/]+)/); + if (!match) throw new Error("Invalid URL format"); + + const showId = match[1]; + const responseText = await fetchv2(`https://api.themoviedb.org/3/tv/${showId}?api_key=ad301b7cc82ffe19273e55e4d4206885`); + const data = await responseText.json(); + + const transformedResults = [{ + description: data.overview || 'No description available', + aliases: `Duration: ${data.episode_run_time && data.episode_run_time.length ? data.episode_run_time.join(', ') + " minutes" : 'Unknown'}`, + airdate: `Aired: ${data.first_air_date ? data.first_air_date : 'Unknown'}` + }]; + + console.log(JSON.stringify(transformedResults)); + return JSON.stringify(transformedResults); + } else { + throw new Error("Invalid URL format"); + } + } catch (error) { + console.log('Details error: ' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired/Released: Unknown' + }]); + } +} + +async function extractEpisodes(url) { + try { + if(url.includes('movie')) { + const match = url.match(/movie\/([^\/]+)/); + + if (!match) throw new Error("Invalid URL format"); + + const movieId = match[1]; + + const movie = [ + { href: `movie/${movieId}`, number: 1, title: "Full Movie" } + ]; + + console.log(movie); + return JSON.stringify(movie); + } else if(url.includes('tv')) { + const match = url.match(/tv\/([^\/]+)\/([^\/]+)\/([^\/]+)/); + + if (!match) throw new Error("Invalid URL format"); + + const showId = match[1]; + + const showResponseText = await fetchv2(`https://api.themoviedb.org/3/tv/${showId}?api_key=ad301b7cc82ffe19273e55e4d4206885`); + const showData = await showResponseText.json(); + + let allEpisodes = []; + for (const season of showData.seasons) { + const seasonNumber = season.season_number; + + if(seasonNumber === 0) continue; + + const seasonResponseText = await fetchv2(`https://api.themoviedb.org/3/tv/${showId}/season/${seasonNumber}?api_key=ad301b7cc82ffe19273e55e4d4206885`); + const seasonData = await seasonResponseText.json(); + + if (seasonData.episodes && seasonData.episodes.length) { + const episodes = seasonData.episodes.map(episode => ({ + href: `tv/${showId}/${seasonNumber}/${episode.episode_number}`, + number: episode.episode_number, + title: episode.name || "" + })); + allEpisodes = allEpisodes.concat(episodes); + } + } + + console.log(allEpisodes); + return JSON.stringify(allEpisodes); + } else { + throw new Error("Invalid URL format"); + } + } catch (error) { + console.log('Fetch error in extractEpisodes: ' + error); + return JSON.stringify([]); + } +} + +async function extractStreamUrl(url) { + try { + let apiUrl; + + if (url.startsWith("tv/")) { + const [, id, season, episode] = url.split("/"); + apiUrl = `https://videasier.onrender.com/api/extract?id=${id}&type=tv&season=${season}&episode=${episode}`; + console.log('TV API URL: ' + apiUrl); + } + else if (url.startsWith("movie/")) { + const [, id] = url.split("/"); + apiUrl = `https://videasier.onrender.com/api/extract?id=${id}&type=movie`; + console.log('Movie API URL: ' + apiUrl); + } + + if (apiUrl) { + const headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', + 'Connection': 'keep-alive', + 'Keep-Alive': 'timeout=15, max=100', + 'Accept': 'application/json, text/plain, */*' + }; + + const response = await fetchv2(apiUrl, headers); + const data = await response.json(); + console.log('Stream URL data: ' + JSON.stringify(data)); + if (data.success && data.m3u8) { + return data.m3u8; + } + return "https://files.catbox.moe/elfax8.mp4"; + } + + const response = await fetchv2(url); + const html = await response.text(); + return "https://files.catbox.moe/elfax8.mp4"; + + } catch (err) { + console.error('Error in extractStreamUrl:'+ err); + return "https://files.catbox.moe/elfax8.mp4"; + } +} diff --git a/broken/videasy/videasy.json b/broken/videasy/videasy.json new file mode 100644 index 0000000..b1c687a --- /dev/null +++ b/broken/videasy/videasy.json @@ -0,0 +1,19 @@ +{ + "sourceName": "VidEasy", + "iconUrl": "https://www.videasy.net/logo.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "HLS", + "quality": "4K - 1080p - 720p", + "baseUrl": "https://player.videasy.net/", + "searchBaseUrl": "https://player.videasy.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/videasy/videasy.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/chireads/chireads.js b/chireads/chireads.js new file mode 100644 index 0000000..a1a4c65 --- /dev/null +++ b/chireads/chireads.js @@ -0,0 +1,254 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const url = `https://chireads.com/search?x=0&y=0&name=${encodedKeyword}`; + const response = await soraFetch(url); + const html = await response.text(); + + const results = []; + const liRegex = /<li>([\s\S]*?)<\/li>/g; + let liMatch; + + while ((liMatch = liRegex.exec(html)) !== null) { + const liHtml = liMatch[1]; + + const linkMatch = liHtml.match(/<div class="news-list-img">[\s\S]*?<a href="([^"]+)"\s+title="([^"]+)"/); + const imgMatch = liHtml.match(/<div class="news-list-img">[\s\S]*?<img src="([^"]+)"/); + const titleMatch = liHtml.match(/<h5 class="font-color-black3">[\s\S]*?<a [^>]+>([^<]+)<\/a>/); + + if (linkMatch && imgMatch && titleMatch) { + let image = imgMatch[1]; + if (!image.startsWith("http")) image = "https:" + image; + + results.push({ + title: decodeHtmlEntities(titleMatch[1].trim()), + href: linkMatch[1].trim(), + image: image.trim() + }); + } + } + + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + console.error("Error fetching or parsing: " + error); + return JSON.stringify([{ + title: "Error", + href: "", + image: "" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const descMatch = htmlText.match(/<div class="inform-txt-show font-color-black6">\s*<span>([\s\S]*?)<\/span>\s*<\/div>/i); + + let description = descMatch + ? descMatch[1] + .replace(/<br\s*\/?>/gi, '\n') + .replace(/\s+/g, ' ') + .trim() + : "No description available"; + + const aliases = 'N/A'; + const airdate = 'N/A'; + + const transformedResults = [{ + description, + aliases, + airdate + }]; + + console.log(JSON.stringify(transformedResults)); + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Details error:' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'N/A', + airdate: 'N/A' + }]); + } +} + +async function extractChapters(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + let contentHtml = null; + + const ulPattern = /<ul><li><a href="[^"]*chapitre-\d+[^"]*"[\s\S]*?<\/ul>/i; + const ulMatch = htmlText.match(ulPattern); + + if (ulMatch) { + contentHtml = ulMatch[0]; + console.log("Found chapters using UL pattern"); + } else { + const chapterSectionRegex = /<div[^>]*class="chapitre-table"[^>]*>([\s\S]*?)<\/div>/gi; + let bestSection = null; + let maxChapterCount = 0; + let sectionMatch; + + while ((sectionMatch = chapterSectionRegex.exec(htmlText)) !== null) { + const sectionContent = sectionMatch[1]; + const chapterCount = (sectionContent.match(/chapitre-\d+/gi) || []).length; + + if (chapterCount > maxChapterCount) { + maxChapterCount = chapterCount; + bestSection = sectionContent; + } + } + + if (bestSection && maxChapterCount > 0) { + contentHtml = bestSection; + console.log(`Found chapters using best section method (${maxChapterCount} chapters)`); + } + } + + if (!contentHtml) { + const chapterLinksPattern = /(<[^>]*>[\s\S]*?){5,}chapitre-\d+[\s\S]*?(<\/[^>]*>[\s\S]*?){5,}/i; + const fallbackMatch = htmlText.match(chapterLinksPattern); + + if (fallbackMatch) { + const startIndex = htmlText.indexOf(fallbackMatch[0]); + const endIndex = startIndex + fallbackMatch[0].length; + + const beforeText = htmlText.substring(0, startIndex); + const divStart = beforeText.lastIndexOf('<div'); + + const afterText = htmlText.substring(endIndex); + const divEnd = afterText.indexOf('</div>'); + + if (divStart !== -1 && divEnd !== -1) { + contentHtml = htmlText.substring(divStart, endIndex + divEnd + 6); + console.log("Found chapters using fallback method"); + } + } + } + + if (!contentHtml) { + throw new Error("Chapters content not found"); + } + + console.log("Content HTML length:", contentHtml.length); + console.log("Content preview:", contentHtml.substring(0, 200) + "..."); + + const linkRegex = /<a\s+href="([^"]*(?:chapitre|chapter)[^"]*)"[^>]*(?:title="([^"]*)")?[^>]*>(.*?)<\/a>/gi; + const chapters = []; + let linkMatch; + + while ((linkMatch = linkRegex.exec(contentHtml)) !== null) { + const href = linkMatch[1].trim(); + const titleAttr = linkMatch[2]?.trim(); + const linkText = linkMatch[3].trim(); + + const title = titleAttr || linkText; + + if (title && /chapitre\s*\d+/i.test(title)) { + chapters.push({ title, href }); + } + } + + console.log(`Found ${chapters.length} chapters before sorting`); + + chapters.sort((a, b) => { + const numA = parseFloat(a.title.match(/chapitre\s*(\d+)/i)?.[1]) || 0; + const numB = parseFloat(b.title.match(/chapitre\s*(\d+)/i)?.[1]) || 0; + return numA - numB; + }); + + chapters.forEach((chapter, index) => { + chapter.number = index + 1; + }); + + console.log(`Final result: ${chapters.length} chapters`); + if (chapters.length > 0) { + console.log("First chapter:", chapters[0]); + console.log("Last chapter:", chapters[chapters.length - 1]); + } + + return JSON.stringify(chapters); + + } catch (error) { + console.error('Fetch error in extractChapters:', error); + return JSON.stringify([{ + href: url, + title: "Error fetching chapters", + number: 0 + }]); + } +} + +async function extractText(url) { + try { + const response = await soraFetch(url); + let htmlText = await response.text(); + + const contentRegex = /<div[^>]+id=['"]content['"][^>]*class=["']font-color-black3 article-font["'][^>]*>([\s\S]*?)<\/div>/i; + const match = contentRegex.exec(htmlText); + + if (!match) { + throw new Error("Main content div not found"); + } + + let content = match[1]; + + content = content.replace(/<div id="pf-\d+-\d+"[^>]*>[\s\S]*?<\/div>/gi, ''); + content = content.replace(/<script[\s\S]*?<\/script>/gi, ''); + content = content.replace(/<[^p\/][^>]*>/gi, ''); + content = content.replace(/\s+/g, ' ').trim(); + + if (!content) { + throw new Error("No content extracted"); + } + + console.log(content); + return content; + + } catch (error) { + console.log("Fetch error in extractText: " + error); + return '<p>Error extracting text</p>'; + } +} + +async function soraFetch(url, options = { + headers: {}, + method: 'GET', + body: null +}) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch (e) { + try { + return await fetch(url, options); + } catch (error) { + return null; + } + } +} + +function decodeHtmlEntities(text) { + const entities = { + '—': '—', + '–': '–', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'", + '/': '/', + '`': '`', + '=': '=', + ' ': ' ' + }; + + return text.replace(/&#x[\dA-Fa-f]+;|&\w+;/g, (match) => { + return entities[match] || match; + }); +} diff --git a/chireads/chireads.json b/chireads/chireads.json new file mode 100644 index 0000000..a028704 --- /dev/null +++ b/chireads/chireads.json @@ -0,0 +1,19 @@ +{ + "sourceName": "ChiReads", + "iconUrl": "https://chireads.com/wp-content/uploads/2020/04/2020LOGO-2.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "French", + "streamType": "novels", + "quality": "N/A", + "baseUrl": "https://chireads.com/", + "searchBaseUrl": "https://chireads.com/search/%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/chireads/chireads.js", + "type": "novels", + "asyncJS": true, + "novel": true, + "downloadSupport": false +} diff --git a/cinecalidad/cinecalidad.js b/cinecalidad/cinecalidad.js new file mode 100644 index 0000000..951f455 --- /dev/null +++ b/cinecalidad/cinecalidad.js @@ -0,0 +1,247 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://www.cinecalidad.ec/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const containerMatch = html.match(/<div id="archive-content"[^>]*>([\s\S]*?)<\/div>\s*<\/div>\s*<\/div>/); + if (containerMatch) { + const container = containerMatch[1]; + + const regex = /<article[^>]*>([\s\S]*?)<\/article>/g; + + let articleMatch; + while ((articleMatch = regex.exec(container)) !== null) { + const articleContent = articleMatch[1]; + + const imageMatch = articleContent.match(/data-src="([^"]+)"/); + + const hrefMatch = articleContent.match(/<a href="([^"]+)"/); + + const titleMatch = articleContent.match(/<div class="in_title">([^<]+)<\/div>/); + + if (imageMatch && hrefMatch && titleMatch) { + results.push({ + title: titleMatch[1].trim(), + image: imageMatch[1].trim(), + href: hrefMatch[1].trim() + }); + } + } + } + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descMatch = html.match(/<p><p>([^<]+)<\/p>/); + + const description = descMatch ? descMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const seasonRegex = /<div id="jstab"[^>]*>([\s\S]*?)<\/div>\s*<\/div>/g; + let seasonMatch; + + while ((seasonMatch = seasonRegex.exec(html)) !== null) { + const seasonContent = seasonMatch[1]; + + const episodeRegex = /<a href="([^"]+)"[^>]*>Episodio \d+<\/a>/g; + let episodeMatch; + let episodeCount = 1; + + while ((episodeMatch = episodeRegex.exec(seasonContent)) !== null) { + results.push({ + href: episodeMatch[1].trim(), + number: episodeCount + }); + episodeCount++; + } + } + + if (results.length === 0) { + results.push({ + href: url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/data-option="(https:\/\/lamovie\.link\/embed-[^"]+)"/); + if (!match) return "https://error.org/"; + + const embedUrl = match[1]; + const embedResponse = await fetchv2(embedUrl); + const embedHtml = await embedResponse.text(); + + const obfuscatedScript = embedHtml.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + if (!obfuscatedScript) return "https://error.org/"; + + const unpackedScript = unpack(obfuscatedScript[1]); + + const fileMatch = unpackedScript.match(/file:\s*"([^"]+)"/); + if (!fileMatch) return "https://error.org/"; + + return fileMatch[1]; + } catch (err) { + return "https://error.org/"; + } +} + + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + diff --git a/cinecalidad/cinecalidad.json b/cinecalidad/cinecalidad.json new file mode 100644 index 0000000..65850f7 --- /dev/null +++ b/cinecalidad/cinecalidad.json @@ -0,0 +1,19 @@ +{ + "sourceName": "CineCalidad", + "iconUrl": "https://www.cinecalidad.ec/wp-content/themes/Cinecalidad/assets/img/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.cinecalidad.ec/", + "searchBaseUrl": "https://www.cinecalidad.ec/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/cinecalidad/cinecalidad.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/cksub/cksub.js b/cksub/cksub.js new file mode 100644 index 0000000..a5e3552 --- /dev/null +++ b/cksub/cksub.js @@ -0,0 +1,105 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://cksub.org/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)">\s*<div class="epl-num">([\d.]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + results.reverse(); + return JSON.stringify(results); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + +const iframeMatch = html.match(/dailymotion\.com\/player\/[a-zA-Z0-9]+\.html\?video=([a-zA-Z0-9]+)/); if (!iframeMatch) return "no iframe"; + + const videoId = iframeMatch[1]; + + const metaRes = await fetchv2(`https://www.dailymotion.com/player/metadata/video/${videoId}`); + const metaJson = await metaRes.json(); + const hlsLink = metaJson.qualities?.auto?.[0]?.url; + if (!hlsLink) return "no hls"; + + async function getBestHls(hlsUrl) { + try { + const res = await fetchv2(hlsUrl); + const text = await res.text(); + const regex = /#EXT-X-STREAM-INF:.*RESOLUTION=(\d+)x(\d+).*?\n(https?:\/\/[^\n]+)/g; + const streams = []; + let match; + while ((match = regex.exec(text)) !== null) { + streams.push({ width: parseInt(match[1]), height: parseInt(match[2]), url: match[3] }); + } + if (streams.length === 0) return hlsUrl; + streams.sort((a, b) => b.height - a.height); + return streams[0].url; + } catch { + return hlsUrl; + } + } + + const bestHls = await getBestHls(hlsLink); + + return bestHls; + } catch { + const empty = "{ streams: ["; + console.log("Extracted stream result:" + JSON.stringify(empty)); + return JSON.stringify(empty); + } +} diff --git a/cksub/cksub.json b/cksub/cksub.json new file mode 100644 index 0000000..cc06d77 --- /dev/null +++ b/cksub/cksub.json @@ -0,0 +1,19 @@ +{ + "sourceName": "CKSub", + "iconUrl": "https://cksub.org/wp-content/uploads/2024/12/cropped-i-am-the-fated-villain-gu-changge-192x192.jpg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://cksub.org/", + "searchBaseUrl": "https://cksub.org/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/cksub/cksub.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/cloudy/cloudy.js b/cloudy/cloudy.js new file mode 100644 index 0000000..c2f5ec3 --- /dev/null +++ b/cloudy/cloudy.js @@ -0,0 +1,214 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://cloudy.pk/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="image-hover-wrapper">[\s\S]*?<a href="([^"]+)"[^>]*>[\s\S]*?<img [^>]*src="([^"]+)"[^>]*>[\s\S]*?<h2 class="entry-title"><a href="[^"]+"[^>]*>([^<]+)<\/a><\/h2>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<p[^>]*><strong>([\s\S]*?)<\/strong><\/p>/); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<a [^>]*href="(https:\/\/videospk[^"]+)"[^>]*>.*?<\/a>/); + if (match) { + results.push({ + href: match[1].trim(), + number: 1 + }); + } else { + results.push({ + href: url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const obfuscatedScript = html.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + const unpackedScript = unpack(obfuscatedScript[1]); + + const streamMatch = unpackedScript.match(/["'](\/stream\/[^"']+)["']/); + const hlsLink = streamMatch ? streamMatch[1] : null; + + console.log("HLS Link:" + hlsLink); + + return "https://videospk.xyz" + hlsLink; + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} diff --git a/cloudy/cloudy.json b/cloudy/cloudy.json new file mode 100644 index 0000000..6b24495 --- /dev/null +++ b/cloudy/cloudy.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Cloudy", + "iconUrl": "https://cloudy.pk/wp-content/uploads/2018/02/cloudy.pk-icon-200x200.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Hindi (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://cloudy.pk/", + "searchBaseUrl": "https://cloudy.pk/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/cloudy/cloudy.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/coflix/coflix.js b/coflix/coflix.js new file mode 100644 index 0000000..55a2741 --- /dev/null +++ b/coflix/coflix.js @@ -0,0 +1,325 @@ +async function searchResults(keyword) { + try { + const response = await fetchv2(`https://coflix.cc/suggest.php?query=${encodeURIComponent(keyword)}`); + const data = await response.json(); + + if (!Array.isArray(data)) { + return JSON.stringify([]); + } + + const results = []; + + for (const item of data) { + let imgUrl = ''; + const imgMatch = item.image.match(/src="([^"]+)"/); + if (imgMatch && imgMatch[1]) { + const src = imgMatch[1].trim(); + imgUrl = src.startsWith('//') ? 'https:' + src : src; + } + + const href = item.url.trim(); + + results.push({ + title: item.title.trim(), + image: imgUrl, + href: href + }); + } + + return JSON.stringify(results); + } catch (err) { + console.error("Search failed:", err); + return JSON.stringify([]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div aria-label="Description"[^>]*>\s*<p>(.*?)<\/p>/s); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const seasonMatch = html.match(/<span class="fz12 ttu fwb db mb1 primary-co">(\d+) seasons?/i); + const totalSeasons = seasonMatch ? parseInt(seasonMatch[1], 10) : null; + + const postIdMatch = html.match(/<body[^>]+postid-(\d+)/i); + const postId = postIdMatch ? postIdMatch[1] : null; + + const results = []; + + if (!totalSeasons || !postId) { + results.push({ + href: url, + number: 1 + }); + } else { + for (let season = 1; season <= totalSeasons; season++) { + const apiUrl = `https://coflix.cc/wp-json/apiflix/v1/series/${postId}/${season}`; + const seasonResp = await fetchv2(apiUrl); + const seasonData = await seasonResp.json(); + + if (seasonData.episodes && Array.isArray(seasonData.episodes)) { + seasonData.episodes.forEach(ep => { + results.push({ + href: ep.links, + number: parseInt(ep.number, 10) + }); + }); + } + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const iframeMatch = html.match(/<iframe[^>]+src="([^"]+)"/i); + const iframeUrl = iframeMatch ? iframeMatch[1] : null; + if (!iframeUrl) throw new Error("Iframe not found"); + + const iframeResp = await fetchv2(iframeUrl); + const iframeHtml = await iframeResp.text(); + + const uqloadMatch = iframeHtml.match(/<li[^>]*onclick="showVideo\('([^']+)',\s*'[^']+'\)">\s*<img[^>]*src="static\/server\/uqload[^"]*"[^>]*>\s*<span>Uqload/i); + if (uqloadMatch) { + const uqload = atob(uqloadMatch[1]); + console.log("Uqload URL:" + uqload); + const uqResp = await fetchv2(uqload); + const uqHtml = await uqResp.text(); + + const mp4Match = uqHtml.match(/sources:\s*\[\s*"([^"]+\.mp4)"/); + if (mp4Match) { + const mp4Url = mp4Match[1]; + console.log("MP4 URL:" + mp4Url); + return mp4Url; + } + } + + const fileMonMatch = iframeHtml.match(/<li[^>]*onclick="showVideo\('([^']+)',\s*'[^']+'\)">\s*<img[^>]*src="static\/server\/filemoon[^"]*"[^>]*>\s*<span>FileMon/i); + if (fileMonMatch) { + const filemoon = atob(fileMonMatch[1]); + console.log("FileMon URL:" + filemoon); + const fileResp = await fetchv2(filemoon); + const fileHtml = await fileResp.text(); + return filemoonExtractor(fileHtml, filemoon); + } + + return "https://files.catbox.moe/avolvc.mp4"; + + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ \ No newline at end of file diff --git a/coflix/coflix.json b/coflix/coflix.json new file mode 100644 index 0000000..a759984 --- /dev/null +++ b/coflix/coflix.json @@ -0,0 +1,19 @@ +{ + "sourceName": "CoFlix", + "iconUrl": "https://coflix.cc/wp-content/uploads/2022/10/cropped-coflix-180x180-1.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "French", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://uqload.cx/", + "searchBaseUrl": "https://uqload.cx/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/coflix/coflix.js", + "type": "shows/movies/anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/crimsonfansubs/crimsonfansubs.js b/crimsonfansubs/crimsonfansubs.js new file mode 100644 index 0000000..3a7776b --- /dev/null +++ b/crimsonfansubs/crimsonfansubs.js @@ -0,0 +1,116 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://crimsonfansubs.com/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)">\s*<div class="epl-num">([\d.]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + results.reverse(); + return JSON.stringify(results); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + let videoId; + + const geoMatch = html.match(/https:\/\/geo\.dailymotion\.com\/player\/([a-zA-Z0-9]+)\.js"\s*data-video="([a-zA-Z0-9]+)"/); + if (geoMatch) { + videoId = geoMatch[2]; + } else { + const embedMatch = html.match(/https:\/\/www\.dailymotion\.com\/embed\/video\/([a-zA-Z0-9]+)/); + if (embedMatch) { + videoId = embedMatch[1]; + } else { + return "no dailymotion video found"; + } + } + + const metaRes = await fetchv2(`https://www.dailymotion.com/player/metadata/video/${videoId}`); + const metaJson = await metaRes.json(); + const hlsLink = metaJson.qualities?.auto?.[0]?.url; + if (!hlsLink) return "no hls"; + + async function getBestHls(hlsUrl) { + try { + const res = await fetchv2(hlsUrl); + const text = await res.text(); + const regex = /#EXT-X-STREAM-INF:.*RESOLUTION=(\d+)x(\d+).*?\n(https?:\/\/[^\n]+)/g; + const streams = []; + let match; + while ((match = regex.exec(text)) !== null) { + streams.push({ width: parseInt(match[1]), height: parseInt(match[2]), url: match[3] }); + } + if (streams.length === 0) return hlsUrl; + streams.sort((a, b) => b.height - a.height); + return streams[0].url; + } catch { + return hlsUrl; + } + } + + const bestHls = await getBestHls(hlsLink); + return bestHls; + + } catch { + const empty = "{ streams: ["; + console.log("Extracted stream result:" + JSON.stringify(empty)); + return JSON.stringify(empty); + } +} + diff --git a/crimsonfansubs/crimsonfansubs.json b/crimsonfansubs/crimsonfansubs.json new file mode 100644 index 0000000..5f3432a --- /dev/null +++ b/crimsonfansubs/crimsonfansubs.json @@ -0,0 +1,19 @@ +{ + "sourceName": "CrimsonFanSubs", + "iconUrl": "https://i3.wp.com/crimsonfansubs.com/wp-content/uploads/2021/06/cropped-favicon-image-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://crimsonfansubs.com/", + "searchBaseUrl": "https://crimsonfansubs.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/crimsonfansubs/crimsonfansubs.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/cuevana3/cuevana3.js b/cuevana3/cuevana3.js new file mode 100644 index 0000000..90a04c6 --- /dev/null +++ b/cuevana3/cuevana3.js @@ -0,0 +1,346 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2("https://www.cuevana3.eu/search?q=" + encodeURIComponent(keyword)); + const html = await response.text(); + const baseUrl = "https://www.cuevana3.eu"; + + const regex = /<a\s+href="([^"]+)">([\s\S]*?)<\/a>/gs; + let match; + + while ((match = regex.exec(html)) !== null) { + const href = match[1].trim(); + const linkContent = match[2]; + + if (linkContent.includes('<span class="TpTv BgA">Serie</span>')) { + continue; + } + + const imgMatch = linkContent.match(/<img[^>]+src="([^"]+)"[^>]*>/); + const titleMatch = linkContent.match(/<span class="Title[^"]*"[^>]*>([^<]+)<\/span>/); + + if (imgMatch && titleMatch) { + results.push({ + title: titleMatch[1].trim(), + image: baseUrl + decodeURIComponent(imgMatch[1].replace(/&/g, "&").trim()), + href: baseUrl + href + }); + } + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="Description">\s*<p>(.*?)<\/p>/s; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "N/A"; + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + console.log(url); + + const jsonMatch = html.match(/<script id="__NEXT_DATA__" type="application\/json">(.*?)<\/script>/s); + if (jsonMatch) { + try { + const data = JSON.parse(jsonMatch[1]); + const seasons = data.props?.pageProps?.thisSerie?.seasons || []; + + for (const season of seasons) { + for (const episode of season.episodes || []) { + results.push({ + href: "https://www.cuevana3.eu/" + episode.url.slug, + number: episode.number + }); + } + } + + if (results.length > 0) return JSON.stringify(results); + } catch (e) { + console.warn("Failed to parse __NEXT_DATA__ episodes", e); + } + } + + try { + const data = JSON.parse(jsonMatch[1]); + const videos = data.props?.pageProps?.thisMovie?.videos || {}; + + const getStreamwishLink = (videosArray) => { + const entry = videosArray.find(v => v.cyberlocker === 'streamwish'); + return entry ? entry.result : null; + }; + + const latino = getStreamwishLink(videos.latino || []); + const spanish = getStreamwishLink(videos.spanish || []); + const subt = getStreamwishLink(videos.english || []); + + const parts = []; + if (latino) parts.push(`Español latino:streamwish:${latino}`); + if (spanish) parts.push(`Español:streamwish:${spanish}`); + if (subt) parts.push(`Subtitulado:streamwish:${subt}`); + + if (parts.length > 0) { + results.push({ + href: parts.join(' | '), + number: 1 + }); + return JSON.stringify(results); + } + } catch (e) { + console.warn("Failed to parse videos from __NEXT_DATA__", e); + } + + const tableRowRegex = /<tr[^>]*>[\s\S]*?<td[^>]*>[\s\S]*?(?:#?\d+[\s\S]*?)?(?:<!--[^]*?-->)?\s*([^<]+)[^<]*<\/td>[\s\S]*?<td[^>]*>([^<]+)[^<]*<\/td>[\s\S]*?<td[^>]*><span>([^<]+)<\/span><\/td>[\s\S]*?<a[^>]+href="([^"]+)"[^>]*class="Button STPb">Descargar<\/a>[\s\S]*?<\/tr>/gi; + + const linksMap = { + "Español latino": null, + "Español": null, + "Subtitulado": null + }; + + let match; + while ((match = tableRowRegex.exec(html)) !== null) { + const [, providerRaw, languageRaw, , link] = match; + const provider = providerRaw.trim().toLowerCase(); + const language = languageRaw.trim(); + + if (!provider.includes("streamwish")) continue; + + if (language === 'Latino') linksMap["Español latino"] = link; + else if (language === 'Español') linksMap["Español"] = link; + else if (language === 'Subtitulado') linksMap["Subtitulado"] = link; + } + + const parts = []; + for (const [lang, link] of Object.entries(linksMap)) { + if (link) parts.push(`${lang}:streamwish:${link}`); + } + + if (parts.length > 0) { + results.push({ + href: parts.join(' | '), + number: 1 + }); + } + + return JSON.stringify(results); +} + +async function extractStreamUrl(urlData) { + const languageBlocks = urlData.split("|"); + const streamwishLinks = {}; + + for (const block of languageBlocks) { + const match = block.match(/^([^:]+):streamwish:(.+)$/); + if (!match) continue; + const lang = match[1].trim(); + const link = match[2].trim(); + if (link && link !== "null") { + if (lang === "Español latino") streamwishLinks.latino = link; + else if (lang === "Español") streamwishLinks.espanol = link; + else if (lang === "Subtitulado") streamwishLinks.subtitulado = link; + } + } + + console.log("Parsed streamwishLinks: " + JSON.stringify(streamwishLinks)); + + async function getVarUrl(link) { + try { + const res = await fetchv2(link); + const html = await res.text(); + const match = html.match(/var\s+url\s*=\s*['"]([^'"]+)['"]/); + return match ? match[1] : null; + } catch (err) { + return null; + } + } + + async function getFinalStream(link) { + try { + const res = await fetchv2(link); + const html = await res.text(); + const scriptMatch = html.match(/eval\(function\(p,a,c,k,e,d\)\{[\s\S]+?\}\('.*?'\,\d+\,\d+\,'.*?'\.split\('\|'\)\)\)/); + if (!scriptMatch) return null; + const packed = scriptMatch[0]; + console.log("Obfuscated eval function found: " + packed.substring(0, 500)); + const unpacked = unpack(packed); + console.log("Unpacked code snippet: " + unpacked.substring(0, 500)); + const hls2Match = unpacked.match(/"hls2"\s*:\s*"([^"]+)"/); + return hls2Match ? hls2Match[1] : null; + } catch (err) { + console.log("Error in getFinalStream: " + err); + return null; + } + } + + function rewriteStreamwishUrl(url) { + return url.replace(/^https?:\/\/streamwish\.to\//, "https://xenolyzb.com/"); + } + + const streams = []; + + for (const [langKey, embedUrl] of Object.entries(streamwishLinks)) { + const varUrlRaw = await getVarUrl(embedUrl); + if (!varUrlRaw) continue; + const varUrl = rewriteStreamwishUrl(varUrlRaw); + const hls2 = await getFinalStream(varUrl); + if (!hls2) continue; + + const label = + langKey === "latino" ? "LATINO" : + langKey === "espanol" ? "CASTELLANO" : + langKey === "subtitulado" ? "SUB" : + langKey.toUpperCase(); + + streams.push(label, hls2); + } + + if (streams.length === 0) { + return "deijdjiwjdiwaidjwaodjiasjdioajidofejhifophwufipheuipfhepiuwghuiphfipehifspehwuipfhewipfhewhfuihfdlshfjkshfudislvhjdkslvsdjkl"; + } + + const final = { + streams + }; + console.log(JSON.stringify(final)); + return JSON.stringify(final); +} + + + + +/* + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + */ + +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + diff --git a/cuevana3/cuevana3.json b/cuevana3/cuevana3.json new file mode 100644 index 0000000..20afc12 --- /dev/null +++ b/cuevana3/cuevana3.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Cuevana3", + "iconUrl": "https://www.cuevana3.eu/apple-touch-icon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.cuevana3.eu/", + "searchBaseUrl": "https://www.cuevana3.eu/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/cuevana3/cuevana3.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/ddys/ddys.js b/ddys/ddys.js new file mode 100644 index 0000000..d5c8f33 --- /dev/null +++ b/ddys/ddys.js @@ -0,0 +1,82 @@ +async function searchResults(keyword) { + const searchUrl = `https://ddys.pro/?s=${encodeURIComponent(keyword)}`; + try { + const response = await fetchv2(searchUrl); + const html = await response.text(); + const results = []; + + const articleRegex = /<article id="post-\d+"[^>]*>[\s\S]*?<h2 class="post-title"><a href="([^"]+)"[^>]*>([^<]+)<\/a><\/h2>/g; + let match; + + while ((match = articleRegex.exec(html)) !== null) { + const href = match[1].trim(); + const title = match[2].trim(); + const imageUrl = "https://i.ibb.co/Y4b38sTG/Search-has-no-images.png"; + + results.push({ + title, + image: imageUrl, + href + }); + } + + console.log(results); + return JSON.stringify(results); + } catch (error) { + throw error; + } +} + +async function extractDetails(url) { + const response = await fetchv2(url); + const html = await response.text(); + + const aliasMatch = html.match(/又名:\s*([^<]+)/); + const descriptionMatch = html.match(/简介:\s*([\s\S]*?)<\/div>/); + const airdateMatch = html.match(/年份:\s*(\d{4})/); + + const alias = aliasMatch ? aliasMatch[1].trim() : "N/A"; + const description = descriptionMatch ? descriptionMatch[1].trim() : "No description available."; + const airdate = airdateMatch ? airdateMatch[1].trim() : "N/A"; + + const details = [{ + alias, + description, + airdate + }]; + + console.log(JSON.stringify(details)); + return JSON.stringify(details); +} + +async function extractEpisodes(url) { + const response = await fetchv2(url); + const html = await response.text(); + const episodes = []; + + const scriptMatch = html.match(/<script class="wp-playlist-script" type="application\/json">(\{[\s\S]*?\})<\/script>/); + + if (scriptMatch) { + const jsonData = JSON.parse(scriptMatch[1]); + + jsonData.tracks.forEach(track => { + if (track.src0) { + const episodeMatch = track.src0.match(/S01E(\d+)/) || track.caption.match(/\u7b2c(\d+)\u96c6/); + const episodeNumber = episodeMatch ? parseInt(episodeMatch[1], 10) : null; // Convert to integer + + episodes.push({ + href: `https://v.ddys.pro${track.src0.trim()}`, + number: episodeNumber + }); + } + }); + } + + console.log(episodes); + return JSON.stringify(episodes); +} + + +async function extractStreamUrl(url) { + return url; +} diff --git a/ddys/ddys.json b/ddys/ddys.json new file mode 100644 index 0000000..82ceb20 --- /dev/null +++ b/ddys/ddys.json @@ -0,0 +1,17 @@ +{ + "sourceName": "DDYS", + "iconUrl": "https://ddys.pro/apple-touch-icon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://ddys.pro/", + "searchBaseUrl": "https://ddys.pro/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/ddys/ddys.js", + "asyncJS": true, + "type": "movies/shows" +} diff --git a/dev/dev.js b/dev/dev.js new file mode 100644 index 0000000..c2f1a02 --- /dev/null +++ b/dev/dev.js @@ -0,0 +1,77 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2(); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + return "https://error.org/"; + } catch (err) { + return "https://error.org/"; + } +} diff --git a/dev/dev.json b/dev/dev.json new file mode 100644 index 0000000..8494127 --- /dev/null +++ b/dev/dev.json @@ -0,0 +1,17 @@ +{ + "sourceName": "Development", + "iconUrl": "https://cdn-icons-png.flaticon.com/512/3953/3953226.png", + "author": { + "name": "Dev", + "icon": "https://cdn-icons-png.flaticon.com/512/3953/3953226.png" + }, + "version": "1.0.0", + "language": "Dev", + "streamType": "Dev", + "quality": "Dev", + "baseUrl": "https://google.com/", + "searchBaseUrl": "https://google.com/?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/dev/dev.js", + "asyncJS": true, + "type": "anime" +} diff --git a/divxfilmeonline/divxfilmeonline.js b/divxfilmeonline/divxfilmeonline.js new file mode 100644 index 0000000..8b2acfb --- /dev/null +++ b/divxfilmeonline/divxfilmeonline.js @@ -0,0 +1,246 @@ +function decodeHtmlEntities(text) { + return text + .replace(/’/g, "'") + .replace(/“/g, '"') + .replace(/”/g, '"') + .replace(/…/g, '...') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&#(\d+);/g, (_, num) => String.fromCharCode(num)); +} + +async function searchResults(keyword) { + const results = []; + const regex = /<li class="border-radius-5 box-shadow">[\s\S]*?<img[^>]+src="([^"]+)"[^>]+title="([^"]+)"[^>]*>[\s\S]*?<a[^>]+href="([^"]+)"[^>]*>/gi; + + try { + const response = await fetchv2("https://www1.divxfilmeonline.net/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + regex.lastIndex = 0; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + image: match[1].trim(), + title: decodeHtmlEntities(match[2].trim()), + href: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} +async function extractDetails(url) { + try { + return JSON.stringify([{ + description: "Description not available", + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const filemoonMatch = /<li[^>]*class="server server-active"[^>]*data-vs="([^"]*fastvid\.co[^"]*)"[^>]*>Filemoon/i.exec(html); + + if (filemoonMatch) { + return JSON.stringify([{ + href: filemoonMatch[1].trim(), + number: 1 + }]); + } else { + throw new Error("Filemoon episode not found"); + } + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error", + message: err.message + }]); + } +} + +async function extractStreamUrl(url) { + try { + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Referer": "https://www1.divxfilmeonline.net/" + }; + const response = await fetchv2(url, headers); + const html = await response.text(); + + const iframeMatch = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/i.exec(html); + if (!iframeMatch) throw new Error("Iframe not found"); + const iframeUrl = iframeMatch[1].trim(); + + const iframeResponse = await fetchv2(iframeUrl, headers); + const iframeContent = await iframeResponse.text(); + + console.log(`[Debug] Iframe content: ${iframeContent}`); + + const scriptMatch = iframeContent.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + + if (!scriptMatch) throw new Error("Obfuscated script not found"); + const evalContent = scriptMatch[1]; + + const unpackedScript = unpack(evalContent); + + const fileMatch = /sources:\s*\[\s*\{\s*file:\s*"([^"]+\.m3u8[^"]*)"/.exec(unpackedScript); + if (!fileMatch) throw new Error("Stream URL not found"); + + + const subtitleMatch = /tracks:\s*\[\s*\{\s*file:\s*"([^"]+\.vtt[^"]*)"/.exec(unpackedScript); + + return JSON.stringify({ + stream: fileMatch[1], + subtitles: subtitleMatch ? subtitleMatch[1] : null + }); + } catch (err) { + console.error("Error extracting stream URL:", err); + return JSON.stringify({ + stream: "https://files.catbox.moe/avolvc.mp4", + subtitles: null + }); + } +} + + + +/* + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + */ + +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + + diff --git a/divxfilmeonline/divxfilmeonline.json b/divxfilmeonline/divxfilmeonline.json new file mode 100644 index 0000000..5bf7a5c --- /dev/null +++ b/divxfilmeonline/divxfilmeonline.json @@ -0,0 +1,19 @@ +{ + "sourceName": "DivXFilmeOnline", + "iconUrl": "https://www1.divxfilmeonline.net/wp-content/uploads/2015/11/cropped-movies-40-180x180.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Romanian (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://divxfilmeonline.net/", + "searchBaseUrl": "https://divxfilmeonline.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/divxfilmeonline/divxfilmeonline.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": true, + "downloadSupport": true +} diff --git a/dmand5/dmand5.js b/dmand5/dmand5.js new file mode 100644 index 0000000..c6f0caf --- /dev/null +++ b/dmand5/dmand5.js @@ -0,0 +1,116 @@ +async function searchResults(keyword) { + const results = []; + try { + const workerUrl = "https://passthrough-worker.simplepostrequest.workers.dev/?url=" + + encodeURIComponent("https://www.dmand5.com/index.php?m=vod-search") + + "&type=multipart&body=" + encodeURIComponent(JSON.stringify({ + wd: keyword + })); + + const response = await fetchv2(workerUrl); + const html = await response.text(); + + const regex = /<a href="(\/detail\/\d+\.html)" title="(.*?)" target="_blank"><img .*?src="(.*?)"/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[2].trim(), + image: match[3].trim(), + href: "https://www.dmand5.com" + match[1].trim() + }); + } + + console.log("Search results:" + JSON.stringify(results)); + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descMatch = html.match(/<div class="des">(.*?)<\/div>/s); + const description = descMatch ? descMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const blockMatch = html.match(/<ul class="mn_list_li_movie"[^>]*>([\s\S]*?)<\/ul>/); + const blockHtml = blockMatch ? blockMatch[1] : ""; + + const regex = /<a href="(\/play\/\d+-\d+-(\d+)\.html)"[^>]*>第\d+集<\/a>/g; + let match; + + while ((match = regex.exec(blockHtml)) !== null) { + results.push({ + href: parseInt(match[2], 10) + " https://www.dmand5.com" + match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + console.log("Episodes:" + JSON.stringify(results)); + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} +async function extractStreamUrl(url) { + try { + const leadingNumberMatch = url.match(/^(\d+)\s+(.+)$/); + const episodeNumber = leadingNumberMatch ? parseInt(leadingNumberMatch[1], 10) : 1; + const cleanUrl = leadingNumberMatch ? leadingNumberMatch[2] : url; + + const fetchUrl = cleanUrl; + + console.log(fetchUrl); + const response = await fetchv2(fetchUrl); + const html = await response.text(); + + const macMatch = html.match(/mac_url\s*=\s*unescape\(\s*'([^']+)'\s*\)/s); + if (!macMatch) return "https://files.catbox.moe/avolvc.mp4"; + + let raw = macMatch[1]; + + raw = raw.replace(/%u([\dA-F]{4})/gi, (_, g1) => + String.fromCharCode(parseInt(g1, 16)) + ); + + const decoded = decodeURIComponent(raw); + + const episodes = decoded.split("#"); + + const epEntry = episodes[episodeNumber - 1] || episodes[0]; + const hlsUrl = epEntry.split("$")[1]; + + return hlsUrl || "https://files.catbox.moe/avolvc.mp4"; + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} diff --git a/dmand5/dmand5.json b/dmand5/dmand5.json new file mode 100644 index 0000000..64822d5 --- /dev/null +++ b/dmand5/dmand5.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Dmand5", + "iconUrl": "https://www.dmand5.com/template/dmd8pc/images/logo.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.dmand5.com/", + "searchBaseUrl": "https://www.dmand5.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/dmand5/dmand5.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/donghuastream/donghuastream.js b/donghuastream/donghuastream.js new file mode 100644 index 0000000..1ea58af --- /dev/null +++ b/donghuastream/donghuastream.js @@ -0,0 +1,117 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://donghuastream.org/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a[^>]+href="([^"]+)"[^>]*>.*?<img[^>]+src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)">.*?<div class="epl-num">(\d+)/gs; + let match; + + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results.reverse()); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + let iframeMatch = html.match(/dailymotion\.com\/embed\/video\/([a-zA-Z0-9]+)/); + + if (!iframeMatch) { + iframeMatch = html.match(/geo\.dailymotion\.com\/player\/[a-z0-9]+\.html\?video=([a-zA-Z0-9]+)/); + } + + if (!iframeMatch) return "no iframe"; + + const videoId = iframeMatch[1]; + const metaRes = await fetchv2(`https://www.dailymotion.com/player/metadata/video/${videoId}`); + const metaJson = await metaRes.json(); + const hlsLink = metaJson.qualities?.auto?.[0]?.url; + + if (!hlsLink) return "no hls"; + + async function getBestHls(hlsUrl) { + try { + const res = await fetchv2(hlsUrl); + const text = await res.text(); + const regex = /#EXT-X-STREAM-INF:.*RESOLUTION=(\d+)x(\d+).*?\n(https?:\/\/[^\n]+)/g; + const streams = []; + let match; + + while ((match = regex.exec(text)) !== null) { + streams.push({ + width: parseInt(match[1]), + height: parseInt(match[2]), + url: match[3] + }); + } + + if (streams.length === 0) return hlsUrl; + streams.sort((a, b) => b.height - a.height); + return streams[0].url; + } catch { + return hlsUrl; + } + } + + const bestHls = await getBestHls(hlsLink); + return bestHls; + } catch { + const empty = "{ streams: ["; + console.log("Extracted stream result:" + JSON.stringify(empty)); + return JSON.stringify(empty); + } +} diff --git a/donghuastream/donghuastream.json b/donghuastream/donghuastream.json new file mode 100644 index 0000000..f0cd9c2 --- /dev/null +++ b/donghuastream/donghuastream.json @@ -0,0 +1,19 @@ +{ + "sourceName": "DonghuaStream", + "iconUrl": "https://donghuastream.org/wp-content/uploads/2023/05/cropped-Donghua-Stream-scaled-1-192x192.jpeg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://donghuastream.org/", + "searchBaseUrl": "https://donghuastream.org/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/donghuastream/donghuastream.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/dora-video/dora-video.js b/dora-video/dora-video.js new file mode 100644 index 0000000..d3e700f --- /dev/null +++ b/dora-video/dora-video.js @@ -0,0 +1,90 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://www.dora-video.cn/search/${keyword}/`); + const html = await response.text(); + + const regex = /<div class="card-img-bili">.*?<a href="(.*?)">.*?data-url="(.*?)".*?<span class="title">(.*?)<\/span>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: (match[3] || "").trim().replace(/<font color="red">a<\/font>|<font color="red">|<\/font>/g, " "), + image: "https://i.ibb.co/ds7r6YJy/Search-has-no-images.png", + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="card-body">.*?<h3.*?>(.*?)<\/h3>.*?<p>(.*?)<\/p>.*?<p>(.*?)<\/p>/s; + const match = regex.exec(html); + + let description = "N/A"; + if (match) { + description = match[3] + .replace(/ /g, " ") + .replace(/\s+/g, " ") + .trim(); + } + + results.push({ + description: description, + aliases: "N/A", + airdate: "N/A" + }); + + return JSON.stringify(results); +} + + + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + console.error(html); + const regex = /<a href="([^"]+)"[ ]?class="btn btn-outline-primary btn-space">([^<]+)<\/a>/g; + let match; + let count = 1; + + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: count + }); + count++; + } + + return JSON.stringify(results); +} + + +async function extractStreamUrl(url) { + const response = await fetchv2(url); + const html = await response.text(); + const match = html.match(/<iframe[^>]+src="([^"]+)"[^>]*>/); + if (!match) return null; + + const iframeUrl = match[1]; + + const headers = { + 'Referer': 'https://www.dora-video.cn/' + }; + const responseTwo = await fetchv2(iframeUrl, headers); + const htmlTwo = await responseTwo.text(); + + const m3u8Match = htmlTwo.match(/url: ['"]([^'"]+\.m3u8)['"],/); + + + const m3u8Url = m3u8Match[1]; + console.error(m3u8Url); + + return m3u8Url; + } + diff --git a/dora-video/dora-video.json b/dora-video/dora-video.json new file mode 100644 index 0000000..a778faa --- /dev/null +++ b/dora-video/dora-video.json @@ -0,0 +1,17 @@ +{ + "sourceName": "Dora-Video", + "iconUrl": "https://www.dora-video.cn/favicon.ico", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.4", + "language": "Chinese (DUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.dora-video.cn/", + "searchBaseUrl": "https://www.dora-video.cn/search/%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/dora-video/dora-video.js", + "asyncJS": true, + "type": "anime" +} diff --git a/dorabash/dorabash.js b/dorabash/dorabash.js new file mode 100644 index 0000000..d43e06d --- /dev/null +++ b/dorabash/dorabash.js @@ -0,0 +1,1225 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://dorabash.com/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<article class="bs"[\s\S]*?<a href="([^"]+)"[^>]*>[\s\S]*?<img src="([^"]+)"[^>]*title="([^"]+)"[\s\S]*?<\/a>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: cleanHtmlSymbols(match[3].trim()) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="entry-content"[^>]*itemprop="description"[^>]*>\s*<p>([\s\S]*?)<\/p>/i; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<li[^>]*>\s*<a href="([^"]+)">[\s\S]*?<div class="epl-num">([^<]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + let numText = match[2].trim(); + let number = /^\d+$/.test(numText) ? parseInt(numText, 10) : 1; + + results.push({ + href: match[1].trim(), + number: number + }); + } + + return JSON.stringify(results.reverse()); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + console.log("Fetched HTML:", html); + + const player2Regex = /<option[^>]*value="([^"]+)"[^>]*data-index="2"[^>]*>/; + const player2Match = player2Regex.exec(html); + + if (player2Match) { + const decodedHtml = atob(player2Match[1]); + const iframeSrcMatch = /<iframe[^>]*src="([^"]*filemoon[^"]*)"/.exec(decodedHtml); + + if (!iframeSrcMatch) throw new Error("Filemoon iframe not found for Player 2"); + + const filemoonUrl = iframeSrcMatch[1]; + const providers = { [filemoonUrl]: "filemoon" }; + const streams = await multiExtractor(providers); + + const hlsLink = streams[1]; + console.log("Player 2 HLS:", hlsLink); + + return hlsLink; + } + + const player1Regex = /<option[^>]*value="([^"]+)"[^>]*data-index="1"[^>]*>/; + const player1Match = player1Regex.exec(html); + + if (player1Match) { + const decodedHtml = atob(player1Match[1]); + const iframeSrcMatch = /<iframe[^>]*src="([^"]+)"/.exec(decodedHtml); + + if (!iframeSrcMatch) throw new Error("Iframe not found for Player 1"); + + const player1Url = iframeSrcMatch[1]; + + if (!player1Url.includes("filemoon")) { + throw new Error("Player 1 is not filemoon"); + } + + const providers = { [player1Url]: "filemoon" }; + const streams = await multiExtractor(providers); + + const hlsLink = streams[1]; + + return hlsLink; + } + + throw new Error("Neither Player 2 nor Player 1 found"); + } catch (err) { + console.error("Error in extractStreamUrl:", err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + +function cleanHtmlSymbols(string) { + if (!string) return ""; + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.4} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-08-13 03:44:07 + * @version 1.1.4 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + // if its an array, get the value that starts with http + } else if (Array.isArray(streamUrl)) { + const httpStream = streamUrl.find(url => url.startsWith("http")); + if (httpStream) { + return httpStream; + } + } else if (streamUrl || typeof streamUrl !== "string") { + // check if it's a valid stream URL + return null; + } + + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + let streamUrl = await extractStreamUrlByProvider(url, provider); + + if (streamUrl && Array.isArray(streamUrl)) { + const httpStream = streamUrl.find(url => url.startsWith("http")); + if (httpStream) { + streamUrl = httpStream; + } + } + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } else if (provider == 'vk') { + headers["encoding"] = "windows-1251"; // required + } else if (provider == 'sibnet') { + headers["encoding"] = "windows-1251"; // required + } + + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "megacloud": + try { + return await megacloudExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from megacloud:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "sibnet": + try { + return await sibnetExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from sibnet:", error); + return null; + } + case "uqload": + try { + return await uqloadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from uqload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + + + + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // + + +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} + + +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} + + +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + + + +/* --- megacloud --- */ + +/** + * @name megacloudExtractor + * @author ShadeOfChaos + */ + +// Megacloud V3 specific +async function megacloudExtractor(html, embedUrl) { + const CHARSET = Array.from({ length: 95 }, (_, i) => String.fromCharCode(i + 32)); + const xraxParams = embedUrl.split('/').pop(); + const xrax = xraxParams.includes('?') ? xraxParams.split('?')[0] : xraxParams; + const nonce = await getNonce(embedUrl); + // return decrypt(secretKey, nonce, encryptedText); + try { + const response = await fetch(`https://megacloud.blog/embed-2/v3/e-1/getSources?id=${xrax}&_k=${nonce}`); + const rawSourceData = await response.json(); + const encrypted = rawSourceData?.sources; + let decryptedSources = null; + if (rawSourceData?.encrypted == false) { + decryptedSources = rawSourceData.sources; + } + if (decryptedSources == null) { + decryptedSources = await getDecryptedSourceV3(encrypted, nonce); + if (!decryptedSources) throw new Error("Failed to decrypt source"); + } + console.log("Decrypted sources:" + JSON.stringify(decryptedSources, null, 2)); + // return the first source if it's an array + if (Array.isArray(decryptedSources) && decryptedSources.length > 0) { + try { + return decryptedSources[0].file; + } catch (error) { + console.log("Error extracting MegaCloud stream URL:" + error); + return null; + } + } + // return { + // status: true, + // result: { + // sources: decryptedSources, + // tracks: rawSourceData.tracks, + // intro: rawSourceData.intro ?? null, + // outro: rawSourceData.outro ?? null, + // server: rawSourceData.server ?? null + // } + // } + } catch (error) { + console.error(`[ERROR][decryptSources] Error decrypting ${embedUrl}:`, error); + return { + status: false, + error: error?.message || 'Failed to get HLS link' + }; + } + /** + * Computes a key based on the given secret and nonce. + * The key is used to "unlock" the encrypted data. + * The computation of the key is based on the following steps: + * 1. Concatenate the secret and nonce. + * 2. Compute a hash value of the concatenated string using a simple + * hash function (similar to Java's String.hashCode()). + * 3. Compute the remainder of the hash value divided by the maximum + * value of a 64-bit signed integer. + * 4. Use the result as a XOR mask to process the characters of the + * concatenated string. + * 5. Rotate the XOR-processed string by a shift amount equal to the + * hash value modulo the length of the XOR-processed string plus 5. + * 6. Interleave the rotated string with the reversed nonce string. + * 7. Take a substring of the interleaved string of length equal to 96 + * plus the hash value modulo 33. + * 8. Convert each character of the substring to a character code + * between 32 and 126 (inclusive) by taking the remainder of the + * character code divided by 95 and adding 32. + * 9. Join the resulting array of characters into a string and return it. + * @param {string} secret - The secret string + * @param {string} nonce - The nonce string + * @returns {string} The computed key + */ + function computeKey(secret, nonce) { + const secretAndNonce = secret + nonce; + let hashValue = 0n; + for (const char of secretAndNonce) { + hashValue = BigInt(char.charCodeAt(0)) + hashValue * 31n + (hashValue << 7n) - hashValue; + } + const maximum64BitSignedIntegerValue = 0x7fffffffffffffffn; + const hashValueModuloMax = hashValue % maximum64BitSignedIntegerValue; + const xorMask = 247; + const xorProcessedString = [...secretAndNonce] + .map(char => String.fromCharCode(char.charCodeAt(0) ^ xorMask)) + .join(''); + const xorLen = xorProcessedString.length; + const shiftAmount = (Number(hashValueModuloMax) % xorLen) + 5; + const rotatedString = xorProcessedString.slice(shiftAmount) + xorProcessedString.slice(0, shiftAmount); + const reversedNonceString = nonce.split('').reverse().join(''); + let interleavedString = ''; + const maxLen = Math.max(rotatedString.length, reversedNonceString.length); + for (let i = 0; i < maxLen; i++) { + interleavedString += (rotatedString[i] || '') + (reversedNonceString[i] || ''); + } + const length = 96 + (Number(hashValueModuloMax) % 33); + const partialString = interleavedString.substring(0, length); + return [...partialString] + .map(ch => String.fromCharCode((ch.charCodeAt(0) % 95) + 32)) + .join(''); + } + /** + * Encrypts a given text using a columnar transposition cipher with a given key. + * The function arranges the text into a grid of columns and rows determined by the key length, + * fills the grid column by column based on the sorted order of the key characters, + * and returns the encrypted text by reading the grid row by row. + * + * @param {string} text - The text to be encrypted. + * @param {string} key - The key that determines the order of columns in the grid. + * @returns {string} The encrypted text. + */ + function columnarCipher(text, key) { + const columns = key.length; + const rows = Math.ceil(text.length / columns); + const grid = Array.from({ length: rows }, () => Array(columns).fill('')); + const columnOrder = [...key] + .map((char, idx) => ({ char, idx })) + .sort((a, b) => a.char.charCodeAt(0) - b.char.charCodeAt(0)); + let i = 0; + for (const { idx } of columnOrder) { + for (let row = 0; row < rows; row++) { + grid[row][idx] = text[i++] || ''; + } + } + return grid.flat().join(''); + } + /** + * Deterministically unshuffles an array of characters based on a given key phrase. + * The function simulates a pseudo-random shuffling using a numeric seed derived + * from the key phrase. This ensures that the same character array and key phrase + * will always produce the same output, allowing for deterministic "unshuffling". + * @param {Array} characters - The array of characters to unshuffle. + * @param {string} keyPhrase - The key phrase used to generate the seed for the + * pseudo-random number generator. + * @returns {Array} A new array representing the deterministically unshuffled characters. + */ + function deterministicUnshuffle(characters, keyPhrase) { + let seed = [...keyPhrase].reduce((acc, char) => (acc * 31n + BigInt(char.charCodeAt(0))) & 0xffffffffn, 0n); + const randomNumberGenerator = (upperLimit) => { + seed = (seed * 1103515245n + 12345n) & 0x7fffffffn; + return Number(seed % BigInt(upperLimit)); + }; + const shuffledCharacters = characters.slice(); + for (let i = shuffledCharacters.length - 1; i > 0; i--) { + const j = randomNumberGenerator(i + 1); + [shuffledCharacters[i], shuffledCharacters[j]] = [shuffledCharacters[j], shuffledCharacters[i]]; + } + return shuffledCharacters; + } + /** + * Decrypts an encrypted text using a secret key and a nonce through multiple rounds of decryption. + * The decryption process includes base64 decoding, character substitution using a pseudo-random + * number generator, a columnar transposition cipher, and deterministic unshuffling of the character set. + * Finally, it extracts and parses the decrypted JSON string or verifies it using a regex pattern. + * + * @param {string} secretKey - The key used to decrypt the text. + * @param {string} nonce - A nonce for additional input to the decryption key. + * @param {string} encryptedText - The text to be decrypted, encoded in base64. + * @param {number} [rounds=3] - The number of decryption rounds to perform. + * @returns {Object|null} The decrypted JSON object if successful, or null if parsing fails. + */ + function decrypt(secretKey, nonce, encryptedText, rounds = 3) { + let decryptedText = Buffer.from(encryptedText, 'base64').toString('utf-8'); + const keyPhrase = computeKey(secretKey, nonce); + for (let round = rounds; round >= 1; round--) { + const encryptionPassphrase = keyPhrase + round; + let seed = [...encryptionPassphrase].reduce((acc, char) => (acc * 31n + BigInt(char.charCodeAt(0))) & 0xffffffffn, 0n); + const randomNumberGenerator = (upperLimit) => { + seed = (seed * 1103515245n + 12345n) & 0x7fffffffn; + return Number(seed % BigInt(upperLimit)); + }; + decryptedText = [...decryptedText] + .map(char => { + const charIndex = CHARSET.indexOf(char); + if (charIndex === -1) return char; + const offset = randomNumberGenerator(95); + return CHARSET[(charIndex - offset + 95) % 95]; + }) + .join(''); + decryptedText = columnarCipher(decryptedText, encryptionPassphrase); + const shuffledCharset = deterministicUnshuffle(CHARSET, encryptionPassphrase); + const mappingArr = {}; + shuffledCharset.forEach((c, i) => (mappingArr[c] = CHARSET[i])); + decryptedText = [...decryptedText].map(char => mappingArr[char] || char).join(''); + } + const lengthString = decryptedText.slice(0, 4); + let length = parseInt(lengthString, 10); + if (isNaN(length) || length <= 0 || length > decryptedText.length - 4) { + console.error('Invalid length in decrypted string'); + return decryptedText; + } + const decryptedString = decryptedText.slice(4, 4 + length); + try { + return JSON.parse(decryptedString); + } catch (e) { + console.warn('Could not parse decrypted string, unlikely to be valid. Using regex to verify'); + const regex = /"file":"(.*?)".*?"type":"(.*?)"/; + const match = encryptedText.match(regex); + const matchedFile = match?.[1]; + const matchType = match?.[2]; + if (!matchedFile || !matchType) { + console.error('Could not match file or type in decrypted string'); + return null; + } + return decryptedString; + } + } + /** + * Tries to extract the MegaCloud nonce from the given embed URL. + * + * Fetches the HTML of the page, and tries to extract the nonce from it. + * If that fails, it sends a request with the "x-requested-with" header set to "XMLHttpRequest" + * and tries to extract the nonce from that HTML. + * + * If all else fails, it logs the HTML of both requests and returns null. + * + * @param {string} embedUrl The URL of the MegaCloud embed + * @returns {string|null} The extracted nonce, or null if it couldn't be found + */ + async function getNonce(embedUrl) { + const res = await fetch(embedUrl, { headers: { "referer": "https://anicrush.to/", "x-requested-with": "XMLHttpRequest" } }); + const html = await res.text(); + const match0 = html.match(/\<meta[\s\S]*?name="_gg_fb"[\s\S]*?content="([\s\S]*?)">/); + if (match0?.[1]) { + return match0[1]; + } + const match1 = html.match(/_is_th:(\S*?)\s/); + if (match1?.[1]) { + return match1[1]; + } + const match2 = html.match(/data-dpi="([\s\S]*?)"/); + if (match2?.[1]) { + return match2[1]; + } + const match3 = html.match(/_lk_db[\s]?=[\s\S]*?x:[\s]"([\S]*?)"[\s\S]*?y:[\s]"([\S]*?)"[\s\S]*?z:[\s]"([\S]*?)"/); + if (match3?.[1] && match3?.[2] && match3?.[3]) { + return "" + match3[1] + match3[2] + match3[3]; + } + const match4 = html.match(/nonce="([\s\S]*?)"/); + if (match4?.[1]) { + if (match4[1].length >= 32) return match4[1]; + } + const match5 = html.match(/_xy_ws = "(\S*?)"/); + if (match5?.[1]) { + return match5[1]; + } + const match6 = html.match(/[a-zA-Z0-9]{48}]/); + if (match6?.[1]) { + return match6[1]; + } + return null; + } + async function getDecryptedSourceV3(encrypted, nonce) { + let decrypted = null; + const keys = await asyncGetKeys(); + for(let key in keys) { + try { + if (!encrypted) { + console.log("Encrypted source missing in response") + return null; + } + decrypted = decrypt(keys[key], nonce, encrypted); + if(!Array.isArray(decrypted) || decrypted.length <= 0) { + // Failed to decrypt source + continue; + } + for(let source of decrypted) { + if(source != null && source?.file?.startsWith('https://')) { + // Malformed decrypted source + continue; + } + } + console.log("Functioning key:", key); + return decrypted; + } catch(error) { + console.error('Error:', error); + console.error(`[${ new Date().toLocaleString() }] Key did not work: ${ key }`); + continue; + } + } + return null; + } + async function asyncGetKeys() { + const resolution = await Promise.allSettled([ + fetchKey("ofchaos", "https://ac-api.ofchaos.com/api/key"), + fetchKey("yogesh", "https://raw.githubusercontent.com/yogesh-hacker/MegacloudKeys/refs/heads/main/keys.json"), + fetchKey("esteven", "https://raw.githubusercontent.com/carlosesteven/e1-player-deobf/refs/heads/main/output/key.json") + ]); + const keys = resolution.filter(r => r.status === 'fulfilled' && r.value != null).reduce((obj, r) => { + let rKey = Object.keys(r.value)[0]; + let rValue = Object.values(r.value)[0]; + if (typeof rValue === 'string') { + obj[rKey] = rValue.trim(); + return obj; + } + obj[rKey] = rValue?.mega ?? rValue?.decryptKey ?? rValue?.MegaCloud?.Anime?.Key ?? rValue?.megacloud?.key ?? rValue?.key ?? rValue?.megacloud?.anime?.key ?? rValue?.megacloud; + return obj; + }, {}); + if (keys.length === 0) { + throw new Error("Failed to fetch any decryption key"); + } + return keys; + } + function fetchKey(name, url, timeout = 1000) { + return new Promise(async (resolve) => { + try { + const response = await fetch(url, { method: 'get', timeout: timeout }); + const key = await response.text(); + let trueKey = null; + try { + trueKey = JSON.parse(key); + } catch (e) { + trueKey = key; + } + resolve({ [name]: trueKey }) + } catch (error) { + resolve(null); + } + }); + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} + + +/* --- sibnet --- */ + +/** + * @name sibnetExtractor + * @author scigward + */ +async function sibnetExtractor(html, embedUrl) { + try { + const videoMatch = html.match( + /player\.src\s*\(\s*\[\s*\{\s*src\s*:\s*["']([^"']+)["']/i + ); + if (!videoMatch || !videoMatch[1]) { + throw new Error("Sibnet video source not found"); + } + const videoPath = videoMatch[1]; + const videoUrl = videoPath.startsWith("http") + ? videoPath + : `https://video.sibnet.ru${videoPath}`; + return videoUrl; + } catch (error) { + console.log("SibNet extractor error: " + error.message); + return null; + } +} + + +/* --- uqload --- */ + +/** + * @name uqloadExtractor + * @author scigward + */ +async function uqloadExtractor(html, embedUrl) { + try { + const match = html.match(/sources:\s*\[\s*"([^"]+\.mp4)"\s*\]/); + const videoSrc = match ? match[1] : ""; + return videoSrc; + } catch (error) { + console.log("uqloadExtractor error:", error.message); + return null; + } +} + + +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} + + +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} + + +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + + + + + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ diff --git a/dorabash/dorabash.json b/dorabash/dorabash.json new file mode 100644 index 0000000..b422022 --- /dev/null +++ b/dorabash/dorabash.json @@ -0,0 +1,19 @@ +{ + "sourceName": "DoraBash", + "iconUrl": "https://dorabash.com/wp-content/uploads/2023/06/cropped-Untitled_design-removebg-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Hindi", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://dorabash.com/", + "searchBaseUrl": "https://dorabash.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/dorabash/dorabash.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/doramasyt/doramasyt.js b/doramasyt/doramasyt.js new file mode 100644 index 0000000..c0276d1 --- /dev/null +++ b/doramasyt/doramasyt.js @@ -0,0 +1,307 @@ +async function searchResults(keyword) { + const results = []; + const url = "https://www.doramasyt.com/buscar?q=" + encodeURIComponent(keyword); + + try { + const response = await fetchv2(url); + const html = await response.text(); + console.log(html); + + const regex = /<li class="col mb-3 ficha_efecto">\s*<article>\s*<a href="([^"]+)"[\s\S]*?<img[^>]*data-src="([^"]+)"[^>]*>[\s\S]*?<h3[^>]*>(.*?)<\/h3>[\s\S]*?<\/a>\s*<\/article>\s*<\/li>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: cleanTitle(match[3].trim().replace(/<[^>]*>/g, '')), + image: match[2].trim(), + href: match[1].trim() + }); + } + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descMatch = html.match(/<h1[^>]*>([^<]+)<\/h1>/); + const aliasMatch = html.match(/<span>([^<]+)<\/span>/); + + const description = descMatch ? descMatch[1].trim() : "N/A"; + const aliases = aliasMatch ? aliasMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: cleanTitle(description), + aliases: cleanTitle(aliases), + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await networkFetch(url, { + timeoutSeconds: 2, + returnHTML: true + }); + const html = await response.html; + + const regex = /<a class="ko chapter-link" href="([^"]+)"[^>]*data-episode="(\d+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const responseOne = await fetchv2(url); + const htmlOne = await responseOne.text(); + const matchOne = htmlOne.match(/<button[^>]*data-player="([^"]+)"[^>]*>filemoon<\/button>/i); + const filemoonData = matchOne ? matchOne[1] : null; + + const response = await fetchv2("https://www.doramasyt.com/reproductor?video=" + encodeURIComponent(filemoonData)); + const html = await response.text(); + + const matchIframe = html.match(/<iframe[^>]*src="([^"]*filemoon\.sx\/e\/[^"]+)"/i); + const filemoonUrl = matchIframe ? matchIframe[1] : null; + console.log(filemoonUrl); + + const responseTwo = await fetchv2(filemoonUrl); + const htmlTwo = await responseTwo.text(); + + let streamUrl = null; + try { + streamUrl = await filemoonExtractor(htmlTwo, filemoonUrl); + } catch (error) { + console.log("filemoon HD extraction error:" + error); + } + + console.log("filemoon Stream URL: " + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log("No stream URL found"); + + return null; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ + diff --git a/doramasyt/doramasyt.json b/doramasyt/doramasyt.json new file mode 100644 index 0000000..f25682e --- /dev/null +++ b/doramasyt/doramasyt.json @@ -0,0 +1,19 @@ +{ + "sourceName": "DoramasYT", + "iconUrl": "https://files.catbox.moe/afzsms.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.doramasyt.com/", + "searchBaseUrl": "https://www.doramasyt.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/doramasyt/doramasyt.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/egydead (Fasel reuploader)/egydead.js b/egydead (Fasel reuploader)/egydead.js new file mode 100644 index 0000000..7d230f4 --- /dev/null +++ b/egydead (Fasel reuploader)/egydead.js @@ -0,0 +1,238 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://egydead.com.co/search?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*style="background-image:\s*url\(([^)]+)\)[^"]*"[^>]*>[\s\S]*?<p class="title">(.*?)<\/p>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<span class="description">\s*([\s\S]*?)\s*<\/span>/i; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)" class="btn watch">/i; + const match = regex.exec(html); + + if (match) { + return JSON.stringify([{ + href: match[1].trim(), + number: 1 + }]); + } + + return JSON.stringify([]); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + console.log(html); + + const jsonRegex = /let servers = JSON\.parse\('(\[.*?\])'\);/; + const jsonMatch = jsonRegex.exec(html); + + if (jsonMatch) { + const serversJson = jsonMatch[1].replace(/\\/g, ''); + const servers = JSON.parse(serversJson); + + const fdewsdcServer = servers.find(server => server.name === "fdewsdc"); + if (fdewsdcServer) { + console.log("Stream URL: " + fdewsdcServer.url); + return await extractEarnVids(fdewsdcServer.url); + } + } + } catch (err) { + console.error(err); + } +} + +async function extractEarnVids(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const obfuscatedScript = html.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + const unpackedScript = unpack(obfuscatedScript[1]); + + const streamMatch = unpackedScript.match(/["'](\/stream\/[^"']+)["']/); + const hlsLink = streamMatch ? streamMatch[1] : null; + + const baseUrl = url.match(/^(https?:\/\/[^/]+)/)[1]; + + console.log("HLS Link:" + baseUrl + hlsLink); + + return baseUrl + hlsLink; + } catch (err) { + console.log(err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} diff --git a/egydead (Fasel reuploader)/egydead.json b/egydead (Fasel reuploader)/egydead.json new file mode 100644 index 0000000..10614f4 --- /dev/null +++ b/egydead (Fasel reuploader)/egydead.json @@ -0,0 +1,18 @@ +{ + "sourceName": "EgyDead (Fasel reuploader)", + "iconUrl": "https://tv3.egydead.live/wp-content/uploads/2019/01/cropped-yXYdE2f-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Arabic", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://egydead.com.co/", + "searchBaseUrl": "https://egydead.com.co/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/egydead%20(Fasel%20reuploader)/egydead.js", + "type": "shows/movies/anime", + "asyncJS": true, + "downloadSupport": true +} diff --git a/egydead/egydead.js b/egydead/egydead.js new file mode 100644 index 0000000..bfaae1d --- /dev/null +++ b/egydead/egydead.js @@ -0,0 +1,273 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://tv3.egydead.live/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<li class="movieItem">\s*<a href="([^"]+)" title="([^"]+)">\s*<img src="([^"]+)">/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + title: match[2].trim(), + image: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="extra-content">\s*<span>القصه<\/span>\s*<p>([\s\S]*?)<\/p>/); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*>\s*حلقه\s*(\d+)\s*<\/a>/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + if (results.length === 0) { + results.push({ + href: url, + number: 1 + }); + } + return JSON.stringify(results.reverse()); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const header = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/" + }; + const postData = "View=1"; + const response = await fetchv2(url, header, "POST", postData); + const html = await response.text(); + const match = html.match(/<li data-link="(https:\/\/mivalyo\.com\/v\/[^"]+)"/); + const streamUrl = match ? match[1] : "https://files.catbox.moe/avolvc.mp4"; + console.log("Stream URL:", streamUrl); + + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const obfuscatedScript = htmlTwo.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + + if (!obfuscatedScript) { + console.log("No obfuscated script found, using fallback"); + return "https://files.catbox.moe/avolvc.mp4"; + } + + const unpackedScript = unpack(obfuscatedScript[1]); + console.log("Unpacked script:", unpackedScript.substring(0, 200) + "..."); + + let hlsLink = null; + const baseUrl = url.match(/^(https?:\/\/[^/]+)/)[1]; + + const streamMatch = unpackedScript.match(/["'](\/stream\/[^"']+)["']/); + if (streamMatch) { + hlsLink = streamMatch[1]; + console.log("Found stream path:", hlsLink); + return baseUrl + hlsLink; + } + + const hlsObjectMatch = unpackedScript.match(/["']hls\d?["']\s*:\s*["'](https?:\/\/[^"']+\.m3u8[^"']*)["']/); + if (hlsObjectMatch) { + hlsLink = hlsObjectMatch[1]; + console.log("Found HLS object link:", hlsLink); + return hlsLink; + } + + const m3u8Match = unpackedScript.match(/["'](https?:\/\/[^"']+\.m3u8[^"']*)["']/); + if (m3u8Match) { + hlsLink = m3u8Match[1]; + console.log("Found m3u8 link:", hlsLink); + return hlsLink; + } + + const cdnMatch = unpackedScript.match(/["'](https?:\/\/[^"']*(?:cdn|stream)[^"']*\.m3u8[^"']*)["']/i); + if (cdnMatch) { + hlsLink = cdnMatch[1]; + console.log("Found CDN link:", hlsLink); + return hlsLink; + } + + const linksMatch = unpackedScript.match(/links\s*[=:]\s*({[^}]+}|\[[^\]]+\])/); + if (linksMatch) { + const linksStr = linksMatch[1]; + const urlInLinks = linksStr.match(/["'](https?:\/\/[^"']+\.m3u8[^"']*)["']/); + if (urlInLinks) { + hlsLink = urlInLinks[1]; + console.log("Found link in links object:", hlsLink); + return hlsLink; + } + } + + console.log("No HLS link found in unpacked script, using fallback"); + return "https://files.catbox.moe/avolvc.mp4"; + + } catch (err) { + console.error("Error in extractStreamUrl:", err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} diff --git a/egydead/egydead.json b/egydead/egydead.json new file mode 100644 index 0000000..988d7ec --- /dev/null +++ b/egydead/egydead.json @@ -0,0 +1,18 @@ +{ + "sourceName": "EgyDead", + "iconUrl": "https://tv3.egydead.live/wp-content/uploads/2019/01/cropped-yXYdE2f-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Arabic", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://tv3.egydead.live/", + "searchBaseUrl": "https://tv3.egydead.live/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/egydead/egydead.js", + "type": "shows/movies/anime", + "asyncJS": true, + "downloadSupport": false +} diff --git a/estrenosdoramas/estrenosdoramas.js b/estrenosdoramas/estrenosdoramas.js new file mode 100644 index 0000000..8468b52 --- /dev/null +++ b/estrenosdoramas/estrenosdoramas.js @@ -0,0 +1,102 @@ +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://estrenosdoramas.es/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article[^>]*class="[^"]*bs[^"]*"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<div class="ttzz">\s*(.*?)\s*<\/div>.*?<img[^>]*src="([^"]+)"[^>]*>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: cleanTitle(match[2].trim()), + image: match[3].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<li[^>]*id="epcheck"[^>]*>[\s\S]*?<a href="([^"]+)">/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push(match[1].trim()); + } + + const total = results.length; + const final = results.map((href, index) => ({ + href: href, + number: total - index + })); + + return JSON.stringify(final.reverse()); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const embedMatch = html.match(/<div class="pembed" data-embed="([^"]+)"/); + if (!embedMatch) return "error"; + const embedUrl = embedMatch[1].trim(); + console.log(embedUrl); + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Referer": url + }; + + const embedResponse = await fetchv2(embedUrl.replace("//", "https://"), headers); + const embedHtml = await embedResponse.text(); + console.log(embedHtml); + const fileMatch = embedHtml.match(/sources:\s*\[\{file:"([^"]+)"/); + if (!fileMatch) return "error"; + + return fileMatch[1]; + } catch (err) { + console.log(err); + return "error"; + } +} + diff --git a/estrenosdoramas/estrenosdoramas.json b/estrenosdoramas/estrenosdoramas.json new file mode 100644 index 0000000..7caf72c --- /dev/null +++ b/estrenosdoramas/estrenosdoramas.json @@ -0,0 +1,19 @@ +{ + "sourceName": "EstrenosDoramas", + "iconUrl": "https://i0.wp.com/estrenosdoramas.es/wp-content/uploads/2023/12/cropped-unnamed-7-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://vidmoly.to/", + "searchBaseUrl": "https://vidmoly.to/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/estrenosdoramas/estrenosdoramas.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/faselhd/faselhd.js b/faselhd/faselhd.js new file mode 100644 index 0000000..0ac1f04 --- /dev/null +++ b/faselhd/faselhd.js @@ -0,0 +1,160 @@ +function decodeHtmlEntities(text) { + return text + .replace(/’/g, "'") + .replace(/“/g, '"') + .replace(/”/g, '"') + .replace(/…/g, '...') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&#(\d+);/g, (_, num) => String.fromCharCode(num)); +} + +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://www.faselhds.xyz/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="postDiv[^"]*">[\s\S]*?<a href="([^"]+)">[\s\S]*?<img[^>]+src="([^"]+)"[\s\S]*?<div class="h1">([\s\S]*?)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = /<div class="singleDesc">\s*<p>([\s\S]*?)<\/p>/.exec(html); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: decodeHtmlEntities(description), + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const baseUrl = "https://www.faselhds.xyz"; + const allEpisodes = []; + + function extractEpisodesFromHtml(html) { + const episodes = []; + const regex = /<a href="([^"]+)"[^>]*>\s*الحلقة\s*(\d+)\s*<\/a>/g; + let match; + while ((match = regex.exec(html)) !== null) { + episodes.push({ + href: match[1].trim(), + number: parseInt(match[2], 10), + }); + } + return episodes; + } + + try { + const response = await fetchv2(url); + const html = await response.text(); + + const seasonDivRegex = /<div[^>]+class=["'][^"']*seasonDiv[^"']*["'][^>]*>/g; + const seasonMatches = html.match(seasonDivRegex); + const seasonCount = seasonMatches ? seasonMatches.length : 0; + + console.log(`Found ${seasonCount} seasons`); + + if (seasonCount > 1) { + const seasonHrefRegex = /<div[^>]+class=["'][^"']*seasonDiv[^"']*["'][^>]*onclick=["']window\.location\.href\s*=\s*['"](([^'"]+))['"][^>]*>/g; + const seasonPaths = []; + let match; + + while ((match = seasonHrefRegex.exec(html)) !== null) { + seasonPaths.push(match[1]); + } + + + for (const path of seasonPaths) { + const seasonUrl = path.startsWith("http") ? path : baseUrl + path; + + const seasonResponse = await fetchv2(seasonUrl); + const seasonPageHtml = await seasonResponse.text(); + const episodes = extractEpisodesFromHtml(seasonPageHtml); + + allEpisodes.push(...episodes); + } + + return JSON.stringify(allEpisodes); + } else { + const episodes = extractEpisodesFromHtml(html); + + if (episodes.length === 0) { + return JSON.stringify([{ href: url, number: 1 }]); + } + + return JSON.stringify(episodes); + } + + } catch (err) { + console.error("Error:", err); + return JSON.stringify([{ href: "Error", number: "Error" }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<li\s+class="active"\s+onclick="player_iframe\.location\.href\s*=\s*'([^']+)'"/i; + const match = regex.exec(html); + + if (!match || !match[1]) { + console.log("No stream URL found in page"); + return ""; + } + const streamUrl = match[1].trim(); + + console.log(streamUrl); + + const response2 = await networkFetch(streamUrl, { + timeoutSeconds: 2, + returnHTML: true + }); + const html2 = response2.html; + + const match2 = html2.match(/data-url="([^"]+\.m3u8)"/); + if (match2) { + return match2[1]; + } else { + return null; + } + } catch (err) { + console.log("Error fetching stream URL content:"+ err); + return ""; + } +} diff --git a/faselhd/faselhd.json b/faselhd/faselhd.json new file mode 100644 index 0000000..677eb3d --- /dev/null +++ b/faselhd/faselhd.json @@ -0,0 +1,18 @@ +{ + "sourceName": "FaselHD", + "iconUrl": "https://www.faselhds.xyz/wp-content/themes/faselhd_2020/images/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Arabic", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.faselhds.xyz/", + "searchBaseUrl": "https://www.faselhds.xyz/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/faselhd/faselhd.js", + "type": "shows/movies/anime", + "asyncJS": true, + "downloadSupport": true +} diff --git a/filmehd/filmehd.js b/filmehd/filmehd.js new file mode 100644 index 0000000..4dabab6 --- /dev/null +++ b/filmehd/filmehd.js @@ -0,0 +1,289 @@ +function decodeHtmlEntities(text) { + return text + .replace(/’/g, "'") + .replace(/“/g, '"') + .replace(/”/g, '"') + .replace(/…/g, '...') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&#(\d+);/g, (_, num) => String.fromCharCode(num)); +} + +async function searchResults(keyword) { + const results = []; + const regex = /<article[^>]*class="item (movies|seasons)"[^>]*>[\s\S]*?<img\s+src="([^"]+)"[^>]*title="([^"]+)"[^>]*>[\s\S]*?<a\s+href="([^"]+)"[^>]*>/gi; + + try { + const response = await fetchv2("https://filmehd.to/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + regex.lastIndex = 0; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + image: match[2].trim(), + title: decodeHtmlEntities(match[3].trim()), + href: match[4].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = /<div class="wp-content"[^>]*>\s*<p>(.*?)<\/p>/i.exec(html); + const description = match ? match[1].trim() : "No description found"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const episodes = []; + + const iframeMatch = html.match(/<iframe[^>]+src\s*=\s*"([^"]*movies\/iframe\/[^"]*?)"/i); + if (iframeMatch) { + episodes.push({ + href: iframeMatch[1].trim(), + number: 1 + }); + } else { + const allDataVs = []; + const dataVsRegex = /data-vs\s*=\s*"([^"]*?)"/g; + let match; + while ((match = dataVsRegex.exec(html)) !== null) { + allDataVs.push(match[1].trim()); + } + + const allNumbers = []; + const numberRegex = /<span[^>]*class="servers"[^>]*>(\d+)<\/span>/g; + while ((match = numberRegex.exec(html)) !== null) { + allNumbers.push(parseInt(match[1], 10)); + } + + const server1Start = html.indexOf('SERVER 1'); + let server1End = html.indexOf('SERVER 2'); + if (server1End === -1) server1End = html.length; + + if (server1Start !== -1) { + const server1Section = html.substring(server1Start, server1End); + const server1Count = (server1Section.match(/<span[^>]*class="servers"/g) || []).length; + + for (let i = 0; i < server1Count && i < allDataVs.length && i < allNumbers.length; i++) { + episodes.push({ + href: allDataVs[i], + number: allNumbers[i] + }); + } + } + } + + episodes.sort((a, b) => a.number - b.number); + + if (episodes.length === 0) { + throw new Error("No episodes found"); + } + + return JSON.stringify(episodes); + + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error", + message: err.message + }]); + } +} + +async function extractStreamUrl(url) { + try { + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Referer": "https://filmehd.to/" + }; + const response = await fetchv2(url, headers); + const html = await response.text(); + + const iframeMatch = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/i.exec(html); + if (!iframeMatch) throw new Error("Iframe not found"); + const iframeUrl = iframeMatch[1].trim(); + + const iframeResponse = await fetchv2(iframeUrl, headers); + const iframeContent = await iframeResponse.text(); + + console.log(`[Debug] Iframe content: ${iframeContent}`); + + const scriptMatch = iframeContent.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + + if (!scriptMatch) throw new Error("Obfuscated script not found"); + const evalContent = scriptMatch[1]; + + const unpackedScript = unpack(evalContent); + + const fileMatch = /sources:\s*\[\s*\{\s*file:\s*"([^"]+\.m3u8[^"]*)"/.exec(unpackedScript); + if (!fileMatch) throw new Error("Stream URL not found"); + + + const subtitleMatch = /tracks:\s*\[\s*\{\s*file:\s*"([^"]+\.vtt[^"]*)"/.exec(unpackedScript); + + return JSON.stringify({ + stream: fileMatch[1], + subtitles: subtitleMatch ? subtitleMatch[1] : null + }); + } catch (err) { + console.error("Error extracting stream URL:", err); + return JSON.stringify({ + stream: "https://files.catbox.moe/avolvc.mp4", + subtitles: null + }); + } +} + +/* + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + */ + +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + + diff --git a/filmehd/filmehd.json b/filmehd/filmehd.json new file mode 100644 index 0000000..14a7b35 --- /dev/null +++ b/filmehd/filmehd.json @@ -0,0 +1,19 @@ +{ + "sourceName": "FilmeHD", + "iconUrl": "https://filmehd.to/wp-content/uploads/2020/01/favicon.ico", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "3.0.1", + "language": "Romanian (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://filmehd.to/", + "searchBaseUrl": "https://filmehd.to/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/filmehd/filmehd.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": true, + "downloadSupport": true +} diff --git a/filmpalast/filmpalast.ico b/filmpalast/filmpalast.ico new file mode 100644 index 0000000000000000000000000000000000000000..71dfde95ec7d38eccc05a3d268843cac31406bb3 GIT binary patch literal 1150 zcmb7^%TH5L5Qi^9w6Y+)6jSMw(%!zpqYbZ6*g=!xf`$^>8eZX1q+ww~aM4&J78Ar8 z0~mssfQWR7tP2s@03{$H;Xf#bxMP7a0zc;*wPDeSo}2H^+&O2?nVCB|f{;Q_W~RW0 zFHI0`k|q+&q$E=Kn-rQ$GP1~~BbbXJ2}ZIpOuu2ehPXvsB~+p)#wC*L_#Z@3|CM~N z5Q0o5M|O5L^78T^mEMM2E{9U7!tCrU3JMB13Wbu}rBW$!b8o<GHiP-Hp;oJ5x7*R# z*$JIagvn$^Nl6KomOj8@v0`yCf@pLFMxzmhg<7z^ii?XA{(8M08yg$g+}y<0R*cv} zEEdD|_BKgIEFsw(+uvfbB>anticnWq53kpYrY0AhPA5DbFIrn$(bm?^WlKv78XKLc zueYPRx*BC=WeI<#kBmG;IQ#;Wldmu{^9FNsZ?UlOo-;rHj%qQ7>FL)PAD=)&Ljx)+ zD--@Un~iLD=={4F7#Khx@DQQU2*$?3e9zI*XBZxSf}x=Y=<oOQ*jNm|swW6c4+H`j z9315HZnqm99UbWH^`Wot9=f}GD2Fz<-5$7HE;KhcqpGTk`%5H}FhT!bg7oxsF8_RA zCfWJaJ7Jd7&dz6OwOSk=e&Kauy>NbhPPI0{;c(#W><l?MIfz6eI669_{!sGssTLuR z$3wBXq0wl9<>lo){|Y<5wzl^1+S(_irlw+le;>QMyO7CbSY2KHR#Q{+G9x2H10aR1 zO*W`@SyT(3N~M~hSii^PaTp8+OifMU`1qK5O@Y(XQy!mAr$bj)*AnGvOSacV8}+&D z;NZYlQBe`1+@jQXC#9vO*xTE~`uaMoR_n>d^_S_vU@$E|KVP%Fyxi{h`=3+Z_n8l< bijOF}zd;uWyF>&9t2puT8VUNw4?*||%NvF2 literal 0 HcmV?d00001 diff --git a/filmpalast/filmpalast.js b/filmpalast/filmpalast.js new file mode 100644 index 0000000..0319692 --- /dev/null +++ b/filmpalast/filmpalast.js @@ -0,0 +1,287 @@ +/** + * filmpalast.js + * A module for Sora that provides watch functionality for filmpalast.to. + * @module filmpalast + * @author JMcrafte26 + * @license MIT + * @version 1.1.3 + * @mirror https://api.jm26.net/sora-modules/filmpalast/filmpalast.json +*/ + +/** + * Searches for films on filmpalast.to based on a keyword. + * @param {string} keyword - The search keyword. + * @returns {Promise<string>} - A JSON string of search results. + */ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const html = await fetch( + `https://filmpalast.to/search/title/${encodedKeyword}` + ); + const filmListRegex = + /<article class="liste glowliste rb"[\s\S]*?<\/article>/g; + const items = html.match(filmListRegex) || []; + + const results = []; + + items.forEach((itemHtml, index) => { + const titleMatch = itemHtml.match( + /<a href="([^"]+)" class="rb" title="([^"]+)"[^>]*>([^<]+)<\/a>/ + ); + let title = titleMatch ? titleMatch[3] : ""; + const hrefMatch = itemHtml.match( + /<a href="\/\/filmpalast.to\/stream\/([^"]+)"[^>]*>/ + ); + const href = hrefMatch + ? `https://filmpalast.to/stream/${hrefMatch[1]}` + : ""; + const imageMatch = itemHtml.match( + /<img[^>]+src="([^"]+)"[^>]+class="cover-opacity"[^>]*>/ + ); + const image = "https://filmpalast.to" + (imageMatch ? imageMatch[1] : ""); + title = cleanTitle(title); + + if (title && href) { + results.push({ + title, + image, + href, + }); + } + }); + + return JSON.stringify(results); + } catch (error) { + console.log("Fetch error:", error); + return JSON.stringify([{ title: "Error", image: "", href: "" }]); + } +} + +/** + * Cleans the title by replacing HTML entities with their corresponding characters. + * @param {string} title - The title to clean. + * @returns {string} - The cleaned title. + */ +function cleanTitle(title) { + return title + .replace(/&/g, "&") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/</g, "<") + .replace(/>/g, ">"); +} + +/** + * Extracts details from a film's page. + * @param {string} url - The URL of the film's page. + * @returns {Promise<string>} - A JSON string of the film's details. + */ +async function extractDetails(url) { + try { + const html = await fetch(url); + const descriptionMatch = html.match( + /<span itemprop="description">([^<]+)<\/span>/ + ); + const description = descriptionMatch + ? descriptionMatch[1] + : "Error loading description"; + + const durationMatch = html.match(/<br \/>Spielzeit: <em>([^<]+)<\/em>/); + const duration = durationMatch ? durationMatch[1] : "Unknown"; + + const airedMatch = html.match(/<br \/>Veröffentlicht: (\d{4})/); + const aired = airedMatch ? airedMatch[1] : "Unknown"; + + const transformedResults = [ + { + description, + aliases: `Duration: ${duration}`, + airdate: `Aired: ${aired}`, + }, + ]; + return JSON.stringify(transformedResults); + } catch (error) { + console.log("Details error:", error); + return JSON.stringify([ + { + description: "Error loading description", + aliases: "Duration: Unknown", + airdate: "Aired: Unknown", + }, + ]); + } +} + +/** + * Extracts episodes from a film's page. + * @param {string} url - The URL of the film's page. + * @returns {Promise<string>} - A JSON string of the episodes. + */ +async function extractEpisodes(url) { + try { + const match = url.match(/https:\/\/filmpalast\.to\/stream\/(.+)$/); + if (!match) { + return JSON.stringify([{ number: "0", href: "" }]); + } + + return JSON.stringify([{ number: "1", href: url }]); + } catch (error) { + console.log("Fetch error:", error); + } +} + +/** + * Extracts the stream URL from a film's page. + * @param {string} url - The URL of the film's page. + * @returns {Promise<string|null>} - The stream URL or null if not found. + * + */ +async function extractStreamUrl(url) { + try { + const response = await fetch(url); + const html = await response.text ? response.text() : response; + + let streamUrl = null; + try { + streamUrl = await voeExtract(html); + } catch (error) { + console.log('VOE HD extraction error:', error); + } + + console.log('Voe Stream URL: ' + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + + console.log('using alternative extraction method'); + try { + streamUrl = await bigWarpExtract(html); + } catch (error) { + console.log('BigWarp HD extraction error:', error); + } + + console.log('BigWarp Stream URL: ' + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log('No stream URL found'); + + return null; + + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/** + * Extracts the stream URL from a film's page. + * @param {string} url - The URL of the film's page. + * @returns {Promise<string|null>} - The stream URL or null if not found. + * Thanks to @Hamzo for the Voe extraction code. + */ + +async function voeExtract(html) { + console.log('VOE HD extraction method'); + const voeRegex = /<ul class="currentStreamLinks"[\s\S]*?<p class="hostName">VOE HD<\/p>[\s\S]*?<a[^>]+class="button rb iconPlay"[^>]+href="([^"]+)"[^>]*>/; + const voeMatch = voeRegex.exec(html); + + if (!voeMatch || !voeMatch[1]) { + console.log('VOE HD stream URL not found'); + return false; + } + const voeUrl = voeMatch[1]; + + + console.log('VOE URL:', voeUrl); + + const videoPage = await fetch(voeUrl); + if (!videoPage) { + console.log('VOE HD video page not found'); + return false; + } + + + const scriptRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const scriptMatch = scriptRegex.exec(videoPage); + const winLocUrl = scriptMatch ? scriptMatch[1] : ''; + + if (!winLocUrl) { + console.log('VOE HD window location URL not found'); + return false; + } + + const hlsSourceUrl = await fetch(winLocUrl); + + const sourcesRegex = /var\s+sources\s*=\s*({[^}]+})/; + const sourcesMatch = sourcesRegex.exec(hlsSourceUrl); + let sourcesString = sourcesMatch ? sourcesMatch[1].replace(/'/g, '"') : null; + + sourcesString = sourcesString ? sourcesString.replace(/,\s*}/g, '}').replace(/,\s*]/g, ']') : null; + + const sources = sourcesString ? JSON.parse(sourcesString) : null; + if (sources && sources.hls) { + const hlsBase64 = sources.hls; + const hlsDecoded = base64Decode(hlsBase64); + console.log('HLS Decoded:' + hlsDecoded); + return hlsDecoded; + } + + return false; +} + +/** + * Extracts the stream URL from a film's page. + * @param {string} url - The URL of the film's page. + * @returns {Promise<string|null>} - The stream URL or null if not found. + */ + +async function bigWarpExtract(html) { + console.log('BigWarp HD extraction method'); + const bwRegex = /<ul class="currentStreamLinks"[\s\S]*?<p class="hostName">BigWarp HD<\/p>[\s\S]*?<a[^>]+class="button rb iconPlay"[^>]+href="([^"]+)"[^>]*>/; + const bwMatch = bwRegex.exec(html); + + if (!bwMatch || !bwMatch[1]) { + console.log('BigWarp HD stream URL not found'); + return false; + } + + let bwUrl = bwMatch[1]; + + console.log('BigWarp URL:', bwUrl); + + const videoPage = await fetch(bwUrl); + + const scriptRegex = /jwplayer\("vplayer"\)\.setup\(\{[\s\S]*?sources:\s*\[\{file:"([^"]+)",label:"[^"]+"\}\]/; + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log('BigWarp HD Decoded:', bwDecoded); + return bwDecoded; +} + +/** + * Decodes a base64 encoded string. + * @param {string} str - The base64 encoded string. + * @returns {string} - The decoded string. + */ +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} + +// Check out the Sora WebUI at https://api.jm26.net/sora-modules/ \ No newline at end of file diff --git a/filmpalast/filmpalast.json b/filmpalast/filmpalast.json new file mode 100644 index 0000000..6f19eb8 --- /dev/null +++ b/filmpalast/filmpalast.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Filmpalast", + "iconUrl": "https://api.jm26.net/sora-modules/filmpalast/filmpalast.ico", + "author": { + "name": "Cufiy", + "icon": "https://cdn.discordapp.com/avatars/606801871189049344/d5aba1f20de41a14540e66f357d0707b.webp", + "url": "https://github.com/JMcrafter26" + }, + "version": "1.1.3", + "language": "German (DUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://filmpalast.to", + "searchBaseUrl": "https://filmpalast.to/search/title/%s", + "scriptUrl": "https://api.jm26.net/sora-modules/filmpalast/filmpalast.js", + "asyncJS": true, + "streamAsyncJS": false, + "type": "movies/shows" + } diff --git a/fireanime/FireAnimeGer.json b/fireanime/FireAnimeGer.json new file mode 100644 index 0000000..660cca7 --- /dev/null +++ b/fireanime/FireAnimeGer.json @@ -0,0 +1,17 @@ +{ + "sourceName": "FireAnime SUB", + "iconUrl": "https://i.ibb.co/dJ1SN5ch/favicon.png", + "author": { + "name": "50/50 & Cufiy", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.1.2", + "language": "German (SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://fireani.me/", + "searchBaseUrl": "https://fireani.me/api/anime/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/fireanime/v2/FireAnimeGerSub.js", + "asyncJS": true, + "type": "anime" +} diff --git a/fireanime/FireAnimeGerDub.json b/fireanime/FireAnimeGerDub.json new file mode 100644 index 0000000..29078fe --- /dev/null +++ b/fireanime/FireAnimeGerDub.json @@ -0,0 +1,17 @@ +{ + "sourceName": "FireAnime DUB", + "iconUrl": "https://i.ibb.co/dJ1SN5ch/favicon.png", + "author": { + "name": "50/50 & Cufiy", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.1.2", + "language": "German (DUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://fireani.me/", + "searchBaseUrl": "https://fireani.me/api/anime/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/fireanime/v2/FireAnimeGerDub.js", + "asyncJS": true, + "type": "anime" +} diff --git a/fireanime/dub.png b/fireanime/dub.png new file mode 100644 index 0000000000000000000000000000000000000000..9f48eb08609bbcd947e8b83c0b30c47b5aafea56 GIT binary patch literal 30980 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 literal 0 HcmV?d00001 diff --git a/fireanime/eng.png b/fireanime/eng.png new file mode 100644 index 0000000000000000000000000000000000000000..998b6f3c82fe8d00e12419cba8e50aa9b5f28b79 GIT binary patch literal 32867 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 literal 0 HcmV?d00001 diff --git a/fireanime/fireanime.json b/fireanime/fireanime.json new file mode 100644 index 0000000..3517545 --- /dev/null +++ b/fireanime/fireanime.json @@ -0,0 +1,17 @@ +{ + "sourceName": "FireAnime English (SUB)", + "iconUrl": "https://i.ibb.co/dJ1SN5ch/favicon.png", + "author": { + "name": "50/50 & Cufiy", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.1.2", + "language": "English (SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://fireani.me/", + "searchBaseUrl": "https://fireani.me/api/anime/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/fireanime/v2/FireAnimeEngSub.js", + "asyncJS": true, + "type": "anime" +} diff --git a/fireanime/sub.png b/fireanime/sub.png new file mode 100644 index 0000000000000000000000000000000000000000..7296fc8b434a2bc99850b70988366ed57e2e1294 GIT binary patch literal 31210 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 Y#>AmdVb87X{Tj1@j_JL+I}fA&55b=?tpET3 literal 0 HcmV?d00001 diff --git a/fireanime/v1/FireAnimeGer.js b/fireanime/v1/FireAnimeGer.js new file mode 100644 index 0000000..46fd135 --- /dev/null +++ b/fireanime/v1/FireAnimeGer.js @@ -0,0 +1,130 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetch(`https://fireani.me/api/anime/search?q=${encodedKeyword}`); + const data = await JSON.parse(responseText); + + const transformedResults = data.data.map(anime => ({ + title: anime.title, + image: `https://fireani.me/img/posters/${anime.poster}`, + href: anime.slug + })); + console.log(transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + const animeInfo = data.data; + + const transformedResults = [{ + description: animeInfo.desc || 'No description available', + aliases: `Alternate Titles: ${animeInfo.alternate_titles || 'Unknown'}`, + airdate: `Aired: ${animeInfo.start ? animeInfo.start : 'Unknown'}` + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + let episodeCounter = 1; + + const episodes = data.data.anime_seasons.reduce((acc, season) => { + if (season.season.toLowerCase() === "filme") return acc; // Skip "Filme" season + + const seasonEpisodes = season.anime_episodes || []; + seasonEpisodes.forEach(episode => { + acc.push({ + href: `${encodedID}&season=${season.season}&episode=${episode.episode}`, + number: episodeCounter + }); + episodeCounter++; + }); + return acc; + }, []); + + console.log(episodes); + return JSON.stringify(episodes); + } catch (error) { + console.log('Fetch error:', error); + } +} + +async function extractStreamUrl(id) { + try { + const encodedID = `https://fireani.me/api/anime/episode?slug=${id}`; + const response = await fetch(`${encodedID}`); + const data = await JSON.parse(response); + + const voeStream = data.data.anime_episode_links.find(link => link.name === 'VOE' && link.lang === 'ger-sub'); + + if (voeStream) { + const newLink = voeStream.link.replace('https://voe.sx/e/', 'https://alejandrocenturyoil.com/e/'); + const tempHTML = await fetch(newLink); + + const htmlContent = await tempHTML; + + const scriptMatch = htmlContent.match(/var\s+sources\s*=\s*({.*?});/s); + if (scriptMatch) { + let rawSourcesData = scriptMatch[1]; + const hlsMatch = rawSourcesData.match(/['"]hls['"]\s*:\s*['"]([^'"]+)['"]/); + if (hlsMatch) { + const hlsEncodedUrl = hlsMatch[1]; + + const decodedUrl = base64Decode(hlsEncodedUrl); + console.log(decodedUrl); + return decodedUrl; + } else { + console.log('HLS URL not found in the sources data.'); + } + } else { + console.log('No sources variable found in the page.'); + } + } + return null; + } catch (error) { + console.log('Fetch error:', error); + return null; + } +} + + +//Credits to @hamzenis for decoder <3 +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} + diff --git a/fireanime/v1/FireAnimeGerDub.js b/fireanime/v1/FireAnimeGerDub.js new file mode 100644 index 0000000..b194217 --- /dev/null +++ b/fireanime/v1/FireAnimeGerDub.js @@ -0,0 +1,130 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetch(`https://fireani.me/api/anime/search?q=${encodedKeyword}`); + const data = await JSON.parse(responseText); + + const transformedResults = data.data.map(anime => ({ + title: anime.title, + image: `https://fireani.me/img/posters/${anime.poster}`, + href: anime.slug + })); + console.log(transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + const animeInfo = data.data; + + const transformedResults = [{ + description: animeInfo.desc || 'No description available', + aliases: `Alternate Titles: ${animeInfo.alternate_titles || 'Unknown'}`, + airdate: `Aired: ${animeInfo.start ? animeInfo.start : 'Unknown'}` + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + let episodeCounter = 1; + + const episodes = data.data.anime_seasons.reduce((acc, season) => { + if (season.season.toLowerCase() === "filme") return acc; // Skip "Filme" season + + const seasonEpisodes = season.anime_episodes || []; + seasonEpisodes.forEach(episode => { + acc.push({ + href: `${encodedID}&season=${season.season}&episode=${episode.episode}`, + number: episodeCounter + }); + episodeCounter++; + }); + return acc; + }, []); + + console.log(episodes); + return JSON.stringify(episodes); + } catch (error) { + console.log('Fetch error:', error); + } +} + +async function extractStreamUrl(id) { + try { + const encodedID = `https://fireani.me/api/anime/episode?slug=${id}`; + const response = await fetch(`${encodedID}`); + const data = await JSON.parse(response); + + const voeStream = data.data.anime_episode_links.find(link => link.name === 'VOE' && link.lang === 'ger-dub'); + + if (voeStream) { + const newLink = voeStream.link.replace('https://voe.sx/e/', 'https://alejandrocenturyoil.com/e/'); + const tempHTML = await fetch(newLink); + + const htmlContent = await tempHTML; + + const scriptMatch = htmlContent.match(/var\s+sources\s*=\s*({.*?});/s); + if (scriptMatch) { + let rawSourcesData = scriptMatch[1]; + const hlsMatch = rawSourcesData.match(/['"]hls['"]\s*:\s*['"]([^'"]+)['"]/); + if (hlsMatch) { + const hlsEncodedUrl = hlsMatch[1]; + + const decodedUrl = base64Decode(hlsEncodedUrl); + console.log(decodedUrl); + return decodedUrl; + } else { + console.log('HLS URL not found in the sources data.'); + } + } else { + console.log('No sources variable found in the page.'); + } + } + return null; + } catch (error) { + console.log('Fetch error:', error); + return null; + } +} + + +//Credits to @hamzenis for decoder <3 +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} + diff --git a/fireanime/v1/fireanime.js b/fireanime/v1/fireanime.js new file mode 100644 index 0000000..d63ac2d --- /dev/null +++ b/fireanime/v1/fireanime.js @@ -0,0 +1,130 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetch(`https://fireani.me/api/anime/search?q=${encodedKeyword}`); + const data = await JSON.parse(responseText); + + const transformedResults = data.data.map(anime => ({ + title: anime.title, + image: `https://fireani.me/img/posters/${anime.poster}`, + href: anime.slug + })); + console.log(transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + const animeInfo = data.data; + + const transformedResults = [{ + description: animeInfo.desc || 'No description available', + aliases: `Alternate Titles: ${animeInfo.alternate_titles || 'Unknown'}`, + airdate: `Aired: ${animeInfo.start ? animeInfo.start : 'Unknown'}` + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + let episodeCounter = 1; + + const episodes = data.data.anime_seasons.reduce((acc, season) => { + if (season.season.toLowerCase() === "filme") return acc; // Skip "Filme" season + + const seasonEpisodes = season.anime_episodes || []; + seasonEpisodes.forEach(episode => { + acc.push({ + href: `${encodedID}&season=${season.season}&episode=${episode.episode}`, + number: episodeCounter + }); + episodeCounter++; + }); + return acc; + }, []); + + console.log(episodes); + return JSON.stringify(episodes); + } catch (error) { + console.log('Fetch error:', error); + } +} + +async function extractStreamUrl(id) { + try { + const encodedID = `https://fireani.me/api/anime/episode?slug=${id}`; + const response = await fetch(`${encodedID}`); + const data = await JSON.parse(response); + + const voeStream = data.data.anime_episode_links.find(link => link.name === 'VOE' && link.lang === 'eng-sub'); + + if (voeStream) { + const newLink = voeStream.link.replace('https://voe.sx/e/', 'https://alejandrocenturyoil.com/e/'); + const tempHTML = await fetch(newLink); + + const htmlContent = await tempHTML; + + const scriptMatch = htmlContent.match(/var\s+sources\s*=\s*({.*?});/s); + if (scriptMatch) { + let rawSourcesData = scriptMatch[1]; + const hlsMatch = rawSourcesData.match(/['"]hls['"]\s*:\s*['"]([^'"]+)['"]/); + if (hlsMatch) { + const hlsEncodedUrl = hlsMatch[1]; + + const decodedUrl = base64Decode(hlsEncodedUrl); + console.log(decodedUrl); + return decodedUrl; + } else { + console.log('HLS URL not found in the sources data.'); + } + } else { + console.log('No sources variable found in the page.'); + } + } + return null; + } catch (error) { + console.log('Fetch error:', error); + return null; + } +} + + +//Credits to @hamzenis for decoder <3 +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} + diff --git a/fireanime/v2/FireAnimeEngSub.js b/fireanime/v2/FireAnimeEngSub.js new file mode 100644 index 0000000..53955b2 --- /dev/null +++ b/fireanime/v2/FireAnimeEngSub.js @@ -0,0 +1,833 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetch(`https://fireani.me/api/anime/search?q=${encodedKeyword}`); + const data = await JSON.parse(responseText); + + const transformedResults = data.data.map(anime => ({ + title: anime.title, + image: `https://fireani.me/img/posters/${anime.poster}`, + href: anime.slug + })); + sendLog(transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + sendLog('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + const animeInfo = data.data; + + const transformedResults = [{ + description: animeInfo.desc || 'No description available', + aliases: `Alternate Titles: ${animeInfo.alternate_titles || 'Unknown'}`, + airdate: `Aired: ${animeInfo.start ? animeInfo.start : 'Unknown'}` + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + let episodeCounter = 1; + + const episodes = data.data.anime_seasons.reduce((acc, season) => { + if (season.season.toLowerCase() === "filme") return acc; // Skip "Filme" season + + const seasonEpisodes = season.anime_episodes || []; + seasonEpisodes.forEach(episode => { + acc.push({ + href: `${encodedID}&season=${season.season}&episode=${episode.episode}`, + number: episodeCounter + }); + episodeCounter++; + }); + return acc; + }, []); + + sendLog(episodes); + return JSON.stringify(episodes); + } catch (error) { + sendLog('Fetch error:', error); + } +} + + + + +async function extractStreamUrl(id) { + try { + const encodedID = `https://fireani.me/api/anime/episode?slug=${id}`; + sendLog("Encoded ID: " + encodedID); + const response = await fetch(encodedID); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + const data = await JSON.parse(response); + sendLog("Data received: " + JSON.stringify(data)); + let providers = {}; + + const language = "eng-sub"; // Default language, can be changed based on user preference + const fallbackLanguage = "ger-sub"; // Fallback language if the preferred one is not available + + + const episodeLinks = data.data.anime_episode_links || []; + episodeLinks.forEach(link => { + // Check if the link is valid and starts with http or https + if (link.link && (link.link.startsWith("http://") || link.link.startsWith("https://"))) { + // Check if the language matches the preferred one + if (link.lang === language) { + providers[link.link] = link.name.toLowerCase(); + sendLog(`Added provider: ${link.name.toLowerCase()} for link: ${link.link} in language: ${link.lang}`); + } else if (link.lang === fallbackLanguage) { + // If the preferred language is not available, use the fallback + providers[link.link] = link.name.toLowerCase(); + sendLog(`Added fallback provider: ${link.name.toLowerCase()} for link: ${link.link} in language: ${link.lang}`); + } + } else { + sendLog(`Invalid link found: ${link.link}`); + } + }); + + sendLog("Providers: " + JSON.stringify(providers)); + + + // E.g. + // providers = { + // "https://vidmoly.to/embed-preghvoypr2m.html": "vidmoly", + // "https://speedfiles.net/40d98cdccf9c": "speedfiles", + // "https://speedfiles.net/82346fs": "speedfiles", + // }; + + + let streams = []; + try { + streams = await multiExtractor(providers); + let returnedStreams = { + streams: streams, + } + + sendLog("Multi extractor streams: " + JSON.stringify(returnedStreams)); + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Multi extractor error:" + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + + if (!streams) { + throw new Error("Stream URL not found"); + } + return streams; + } catch (error) { + sendLog("Fetch error:", error); + return null; + } +} + +// if is node +if (typeof module !== 'undefined' && module.exports) { + let streamlinks = extractStreamUrl("sakamoto-days&season=1&episode=1"); + sendLog("Streamlinks: " + streamlinks); +} + +//Credits to @hamzenis for decoder <3 +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} +// Local Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ diff --git a/fireanime/v2/FireAnimeGerDub.js b/fireanime/v2/FireAnimeGerDub.js new file mode 100644 index 0000000..3914bd1 --- /dev/null +++ b/fireanime/v2/FireAnimeGerDub.js @@ -0,0 +1,834 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetch(`https://fireani.me/api/anime/search?q=${encodedKeyword}`); + const data = await JSON.parse(responseText); + + const transformedResults = data.data.map(anime => ({ + title: anime.title, + image: `https://fireani.me/img/posters/${anime.poster}`, + href: anime.slug + })); + sendLog(transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + sendLog('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + const animeInfo = data.data; + + const transformedResults = [{ + description: animeInfo.desc || 'No description available', + aliases: `Alternate Titles: ${animeInfo.alternate_titles || 'Unknown'}`, + airdate: `Aired: ${animeInfo.start ? animeInfo.start : 'Unknown'}` + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + let episodeCounter = 1; + + const episodes = data.data.anime_seasons.reduce((acc, season) => { + if (season.season.toLowerCase() === "filme") return acc; // Skip "Filme" season + + const seasonEpisodes = season.anime_episodes || []; + seasonEpisodes.forEach(episode => { + acc.push({ + href: `${encodedID}&season=${season.season}&episode=${episode.episode}`, + number: episodeCounter + }); + episodeCounter++; + }); + return acc; + }, []); + + sendLog(episodes); + return JSON.stringify(episodes); + } catch (error) { + sendLog('Fetch error:', error); + } +} + + + + +async function extractStreamUrl(id) { + try { + const encodedID = `https://fireani.me/api/anime/episode?slug=${id}`; + sendLog("Encoded ID: " + encodedID); + const response = await fetch(encodedID); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + const data = await JSON.parse(response); + sendLog("Data received: " + JSON.stringify(data)); + let providers = {}; + + const language = "ger-dub"; // Default language, can be changed based on user preference + const fallbackLanguage = "ger-sub"; // Fallback language if the preferred one is not available + + + const episodeLinks = data.data.anime_episode_links || []; + episodeLinks.forEach(link => { + // Check if the link is valid and starts with http or https + if (link.link && (link.link.startsWith("http://") || link.link.startsWith("https://"))) { + // Check if the language matches the preferred one + if (link.lang === language) { + providers[link.link] = link.name.toLowerCase(); + sendLog(`Added provider: ${link.name.toLowerCase()} for link: ${link.link} in language: ${link.lang}`); + } else if (link.lang === fallbackLanguage) { + // If the preferred language is not available, use the fallback + providers[link.link] = link.name.toLowerCase(); + sendLog(`Added fallback provider: ${link.name.toLowerCase()} for link: ${link.link} in language: ${link.lang}`); + } + } else { + sendLog(`Invalid link found: ${link.link}`); + } + }); + + sendLog("Providers: " + JSON.stringify(providers)); + + + // E.g. + // providers = { + // "https://vidmoly.to/embed-preghvoypr2m.html": "vidmoly", + // "https://speedfiles.net/40d98cdccf9c": "speedfiles", + // "https://speedfiles.net/82346fs": "speedfiles", + // }; + + + let streams = []; + try { + streams = await multiExtractor(providers); + let returnedStreams = { + streams: streams, + } + + sendLog("Multi extractor streams: " + JSON.stringify(returnedStreams)); + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Multi extractor error:" + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + + if (!streams) { + throw new Error("Stream URL not found"); + } + return streams; + } catch (error) { + sendLog("Fetch error:", error); + return null; + } +} + +// if is node +if (typeof module !== 'undefined' && module.exports) { + let streamlinks = extractStreamUrl("sakamoto-days&season=1&episode=1"); + sendLog("Streamlinks: " + streamlinks); +} + +//Credits to @hamzenis for decoder <3 +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} + +// Local Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ \ No newline at end of file diff --git a/fireanime/v2/FireAnimeGerSub.js b/fireanime/v2/FireAnimeGerSub.js new file mode 100644 index 0000000..ae37264 --- /dev/null +++ b/fireanime/v2/FireAnimeGerSub.js @@ -0,0 +1,833 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetch(`https://fireani.me/api/anime/search?q=${encodedKeyword}`); + const data = await JSON.parse(responseText); + + const transformedResults = data.data.map(anime => ({ + title: anime.title, + image: `https://fireani.me/img/posters/${anime.poster}`, + href: anime.slug + })); + sendLog(transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + sendLog('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + const animeInfo = data.data; + + const transformedResults = [{ + description: animeInfo.desc || 'No description available', + aliases: `Alternate Titles: ${animeInfo.alternate_titles || 'Unknown'}`, + airdate: `Aired: ${animeInfo.start ? animeInfo.start : 'Unknown'}` + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(slug) { + try { + const encodedID = encodeURIComponent(slug); + const response = await fetch(`https://fireani.me/api/anime?slug=${encodedID}`); + const data = await JSON.parse(response); + + let episodeCounter = 1; + + const episodes = data.data.anime_seasons.reduce((acc, season) => { + if (season.season.toLowerCase() === "filme") return acc; // Skip "Filme" season + + const seasonEpisodes = season.anime_episodes || []; + seasonEpisodes.forEach(episode => { + acc.push({ + href: `${encodedID}&season=${season.season}&episode=${episode.episode}`, + number: episodeCounter + }); + episodeCounter++; + }); + return acc; + }, []); + + sendLog(episodes); + return JSON.stringify(episodes); + } catch (error) { + sendLog('Fetch error:', error); + } +} + + + + +async function extractStreamUrl(id) { + try { + const encodedID = `https://fireani.me/api/anime/episode?slug=${id}`; + sendLog("Encoded ID: " + encodedID); + const response = await fetch(encodedID); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + const data = await JSON.parse(response); + sendLog("Data received: " + JSON.stringify(data)); + let providers = {}; + + const language = "ger-sub"; // Default language, can be changed based on user preference + const fallbackLanguage = "ger-dub"; // Fallback language if the preferred one is not available + + + const episodeLinks = data.data.anime_episode_links || []; + episodeLinks.forEach(link => { + // Check if the link is valid and starts with http or https + if (link.link && (link.link.startsWith("http://") || link.link.startsWith("https://"))) { + // Check if the language matches the preferred one + if (link.lang === language) { + providers[link.link] = link.name.toLowerCase(); + sendLog(`Added provider: ${link.name.toLowerCase()} for link: ${link.link} in language: ${link.lang}`); + } else if (link.lang === fallbackLanguage) { + // If the preferred language is not available, use the fallback + providers[link.link] = link.name.toLowerCase(); + sendLog(`Added fallback provider: ${link.name.toLowerCase()} for link: ${link.link} in language: ${link.lang}`); + } + } else { + sendLog(`Invalid link found: ${link.link}`); + } + }); + + sendLog("Providers: " + JSON.stringify(providers)); + + + // E.g. + // providers = { + // "https://vidmoly.to/embed-preghvoypr2m.html": "vidmoly", + // "https://speedfiles.net/40d98cdccf9c": "speedfiles", + // "https://speedfiles.net/82346fs": "speedfiles", + // }; + + + let streams = []; + try { + streams = await multiExtractor(providers); + let returnedStreams = { + streams: streams, + } + + sendLog("Multi extractor streams: " + JSON.stringify(returnedStreams)); + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Multi extractor error:" + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + + if (!streams) { + throw new Error("Stream URL not found"); + } + return streams; + } catch (error) { + sendLog("Fetch error:", error); + return null; + } +} + +// if is node +if (typeof module !== 'undefined' && module.exports) { + let streamlinks = extractStreamUrl("sakamoto-days&season=1&episode=1"); + sendLog("Streamlinks: " + streamlinks); +} + +//Credits to @hamzenis for decoder <3 +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} +// Local Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ \ No newline at end of file diff --git a/flixlatam/flixlatam.js b/flixlatam/flixlatam.js new file mode 100644 index 0000000..39d7970 --- /dev/null +++ b/flixlatam/flixlatam.js @@ -0,0 +1,6574 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://flixlatam.com/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="result-item">[\s\S]*?<a href="([^"]+)"[^>]*>\s*<img src="([^"]+)"[^>]*alt="([^"]+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: cleanHtmlSymbols(match[3].trim()) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match = /<div class="overview"[^>]*>\s*<p>([\s\S]*?)<\/p>/i.exec(html); + + if (!match) { + match = /<div class="wp-content"[^>]*>\s*<p>([\s\S]*?)<\/p>/i.exec(html); + } + + if (!match) { + match = /<div class="wp-content"[^>]*>[\s\S]*?<h4>[\s\S]*?<\/h4>\s*<p>([\s\S]*?)<\/p>/i.exec(html); + } + + const description = match ? match[1].trim() : "fuck off you don't need a description"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + + const regex = /<div class=['"]?numerando['"]?[^>]*>\d+\s*-\s*(\d+)<\/div>[\s\S]*?<a\s+href=['"]([^'"]+)['"][^>]*>/g; + + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + const episodeNumber = parseInt(match[1], 10); + const href = match[2].trim(); + + results.push({ + href: "episode: " + href, + number: episodeNumber + }); + } + + if (results.length === 0) { + results.push({ + href: "movie: " + url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + let endpointType; + + if (url.startsWith("movie: ")) { + url = url.replace("movie: ", ""); + endpointType = "movie"; + } else if (url.startsWith("episode: ")) { + url = url.replace("episode: ", ""); + endpointType = "tv"; + } else { + return "ERROR"; + } + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Referer": "https://flixlatam.com/" + }; + const response = await fetchv2(url, headers); + const html = await response.text(); + + const idMatch = html.match(/<link rel=['"]shortlink['"] href=['"][^?]+\?p=(\d+)['"]/); + if (!idMatch) return "ID NOT FOUND"; + const id = idMatch[1]; + + const apiUrl = `https://flixlatam.com/wp-json/dooplayer/v2/${id}/${endpointType}/1`; + const apiResponse = await fetchv2(apiUrl); + const apiData = await apiResponse.json(); + console.log(JSON.stringify(apiData)); + + const anotherResponse = await fetchv2(apiData.embed_url); + const anotherHtml = await anotherResponse.text(); + + const dataLinkMatch = anotherHtml.match(/const\s+dataLink\s*=\s*(\[[\s\S]*?\]);/); + + let dataLink; + try { + let dataLinkStr = dataLinkMatch[1] + .replace(/"/g, '"') + .replace(/\\u003c/g, '<') + .replace(/\\u003e/g, '>') + .replace(/\\u0026/g, '&'); + dataLink = JSON.parse(dataLinkStr); + } catch (e) { + console.error( e); + return "PARSE ERROR"; + } + + const defaultLang = dataLink[0]; + const filemoonEmbed = defaultLang.sortedEmbeds.find(embed => embed.servername === "filemoon"); + + const SECRET_KEY = "Ak7qrvvH4WKYxV2OgaeHAEg2a5eh16vE"; + const decryptedUrl = decryptLink(filemoonEmbed.link, SECRET_KEY); + + console.log( decryptedUrl); + const filemoonResponse = await fetchv2(decryptedUrl); + const filemoonHtml = await filemoonResponse.text(); + let streamUrl = null; + try { + streamUrl = await filemoonExtractor(filemoonHtml, decryptedUrl); + } catch (error) { + console.log("filemoon HD extraction error:" + error); + } + + console.log("filemoon Stream URL: " + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log("No stream URL found"); + + return null; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ + +function cleanHtmlSymbols(string) { + if (!string) return ""; + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function decryptLink(encryptedLinkBase64, secretKey) { + try { + const encryptedData = CryptoJS.enc.Base64.parse(encryptedLinkBase64); + const iv = encryptedData.words.slice(0, 4); + const encryptedBytes = encryptedData.words.slice(4); + const ivWordArray = CryptoJS.lib.WordArray.create(iv); + const encryptedWordArray = CryptoJS.lib.WordArray.create(encryptedBytes); + + const decrypted = CryptoJS.AES.decrypt( + { ciphertext: encryptedWordArray }, + CryptoJS.enc.Utf8.parse(secretKey), + { iv: ivWordArray, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } + ); + + return decrypted.toString(CryptoJS.enc.Utf8); + } catch (error) { + console.error('Error al descifrar:', error); + return null; + } +} + +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof global !== 'undefined' && global.crypto) { + crypto = global.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && typeof require === 'function') { + try { + crypto = require('crypto'); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64url encoding strategy. + */ + var Base64url = C_enc.Base64url = { + /** + * Converts a word array to a Base64url string. + * + * @param {WordArray} wordArray The word array. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {string} The Base64url string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64url.stringify(wordArray); + */ + stringify: function (wordArray, urlSafe=true) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = urlSafe ? this._safe_map : this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64url string to a word array. + * + * @param {string} base64Str The Base64url string. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64url.parse(base64String); + */ + parse: function (base64Str, urlSafe=true) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = urlSafe ? this._safe_map : this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + var Wil; + var Wih; + + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + Wih = Wi.high = M[offset + i * 2] | 0; + Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + Wil = gamma0l + Wi7l; + Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + Wil = Wil + gamma1l; + Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + Wil = Wil + Wi16l; + Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + var tMsw; + var tLsw; + + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<<n) | (x>>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + var block; + + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + var block; + + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + var modeCreator; + + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + var finalProcessedBlocks; + + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + var wordArray; + + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + var salt; + + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + var keystream; + + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + for (var i = data.sigBytes - 1; i >= 0; i--) { + if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + data.sigBytes = i + 1; + break; + } + } + } + }; + + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + var t; + + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + // Make sure the key length is valid (64, 128 or >= 192 bit) + if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) { + throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.'); + } + + // Extend the key according to the keying options defined in 3DES standard + var key1 = keyWords.slice(0, 2); + var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4); + var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6); + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(key1)); + this._des2 = DES.createEncryptor(WordArray.create(key2)); + this._des3 = DES.createEncryptor(WordArray.create(key3)); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + return CryptoJS; + +})); diff --git a/flixlatam/flixlatam.json b/flixlatam/flixlatam.json new file mode 100644 index 0000000..2ee1f84 --- /dev/null +++ b/flixlatam/flixlatam.json @@ -0,0 +1,19 @@ +{ + "sourceName": "FlixLatam", + "iconUrl": "https://flixlatam.com/wp-content/uploads/2022/04/cropped-Series-Latinoamerica-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://flixlatam.com/", + "searchBaseUrl": "https://flixlatam.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/flixlatam/flixlatam.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/franime/franime.js b/franime/franime.js new file mode 100644 index 0000000..a66e70f --- /dev/null +++ b/franime/franime.js @@ -0,0 +1,139 @@ +async function searchResults(keyword) { + try { + const response = await fetchv2("https://api.franime.fr/api/animes"); + const data = await response.json(); + + const results = data + .filter(anime => anime.title.toLowerCase().includes(keyword.toLowerCase())) + .map(anime => ({ + href: anime.id.toString(), + title: anime.title, + image: anime.affiche + })); + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(id) { + try { + const response = await fetchv2("https://api.franime.fr/api/animes"); + const data = await response.json(); + + const anime = data.find(item => item.id === Number(id)); + if (!anime) { + return JSON.stringify([{ + description: "Not found", + aliases: "N/A", + airdate: "N/A" + }]); + } + + return JSON.stringify([{ + description: anime.description || "N/A", + aliases: anime.titles ? Object.values(anime.titles).join(", ") : "N/A", + airdate: anime.startDate || "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(id) { + const results = []; + try { + const response = await fetchv2("https://api.franime.fr/api/animes"); + const data = await response.json(); + + const anime = data.find(item => item.id === Number(id)); + if (!anime || !anime.saisons) { + return JSON.stringify([{ + href: "N/A", + number: "N/A" + }]); + } + + anime.saisons.forEach((season, seasonIndex) => { + season.episodes.forEach((episode, episodeIndex) => { + results.push({ + href: `${id}/${seasonIndex}/${episodeIndex}`, + number: episodeIndex + 1 + }); + }); + }); + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(id) { + try { + const headers = { + "Host": "api.franime.fr", + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0", + "Referer": "https://franime.fr/", + "Content-Type": "application/json", + "Origin": "https://franime.fr", + "Connection": "keep-alive", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-site", + "Priority": "u=0", + "TE": "trailers" + }; + + async function fetchUntilMp4(type) { + let i = 0; + while (i < 10) { + const url = `https://api.franime.fr/api/anime/${id}/${type}/${i}`; + const res = await fetchv2(url, headers); + const text = await res.text(); + console.log(type.toUpperCase(), i, text); + + if (text.includes("Aucun lecteur disponible")) return null; + + if (text.endsWith(".mp4")) return text; + + i++; + } + } + + const vf = await fetchUntilMp4("vf"); + const vo = await fetchUntilMp4("vo"); + + const streams = []; + + if (vf) streams.push("VOSTFR", vf); + if (vo) streams.push("VF", vo); + + const final = { + streams, + subtitles: "" + }; + + console.log("RETURN: " + JSON.stringify(final)); + return JSON.stringify(final); + + } catch (error) { + console.log("Error in extractStreamUrl:", error); + return JSON.stringify({ + streams: [], + subtitles: "" + }); + } +} diff --git a/franime/franime.json b/franime/franime.json new file mode 100644 index 0000000..09e37c9 --- /dev/null +++ b/franime/franime.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Franime", + "iconUrl": "https://franime.fr/logos/apple-touch-icon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "French (DUB/SUB)", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://franime.fr/", + "searchBaseUrl": "https://franime.fr/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/franime/franime.js", + "type": "anime", + "asyncJS": true, + "softsub": true, + "downloadSupport": true +} diff --git a/funmovieslix/funmovieslix.js b/funmovieslix/funmovieslix.js new file mode 100644 index 0000000..fcc1096 --- /dev/null +++ b/funmovieslix/funmovieslix.js @@ -0,0 +1,281 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://funmovieslix.com/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<a href="([^"]+)" class="poster-wrap">[\s\S]*?<img[^>]+src="([^"]+)"[^>]*>[\s\S]*?<h3 class="title">([^<]+)<\/h3>/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descMatch = html.match(/<div class="entry-content entry-content-single"[^>]*>[\s\S]*?<p>([\s\S]*?)<\/p>/); + const description = descMatch ? descMatch[1].trim() : "N/A"; + + const dateMatch = html.match(/<time itemprop="dateCreated"[^>]*>([^<]+)<\/time>/); + const airdate = dateMatch ? dateMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: airdate + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a class="button button-shadow" href="([^"]+)"[^>]*>S\d+\sEps?(\d+)<\/a>/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + if (results.length === 0) { + results.push({ + href: url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<iframe src="(https:\/\/filemoon\.(?:to|sx)\/e\/[^"]+)"/); + const filemoonUrl = match ? match[1] : "https://files.catbox.moe/avolvc.mp4"; + + console.log("Filemoon URL:"+ filemoonUrl); + const filemoonResponse = await fetchv2(filemoonUrl); + const filemoonHtml = await filemoonResponse.text(); + return filemoonExtractor(filemoonHtml, filemoonUrl) || filemoonUrl; + } catch (err) { + const fallback = "https://files.catbox.moe/avolvc.mp4"; + console.log("Filemoon URL:"+ fallback); + return fallback; + } +} + + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ \ No newline at end of file diff --git a/funmovieslix/funmovieslix.json b/funmovieslix/funmovieslix.json new file mode 100644 index 0000000..d314034 --- /dev/null +++ b/funmovieslix/funmovieslix.json @@ -0,0 +1,19 @@ +{ + "sourceName": "FunMoviesLix", + "iconUrl": "https://funmovieslix.com/wp-content/uploads/2023/12/cropped-download.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Hindi", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://funmovieslix.com/", + "searchBaseUrl": "https://funmovieslix.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/funmovieslix/funmovieslix.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/gnulahd/gnulahd.js b/gnulahd/gnulahd.js new file mode 100644 index 0000000..025efc9 --- /dev/null +++ b/gnulahd/gnulahd.js @@ -0,0 +1,358 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://ww3.gnulahd.nu/?s=" + keyword); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*itemprop="url"[\s\S]*?<img src="(https:\/\/i[0-9]+\.wp\.com\/[^"]+)"[^>]*>[\s\S]*?<h2[^>]*itemprop="headline">([^<]+)<\/h2>/gi; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="mindesc">\s*<p>([\s\S]*?)<\/p>\s*<\/div>/); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<li[^>]*>\s*<a href="([^"]+)">/g; + let match; + let count = 1; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: count + }); + count++; + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + const dummyLink = "https://files.catbox.moe/avolvc.mp4"; + + try { + const response = await fetchv2(url); + const html = await response.text(); + const iframeMatch = html.match(/<iframe[^>]+src="([^"]+embed\.php[^"]*)"[^>]*>/i); + + if (!iframeMatch) { + return dummyLink; + } + + const fjireo = await fetchv2(iframeMatch[1]); + const kitri = await fjireo.text(); + + const videoArrayMatches = kitri.match(/var videos(\w+) = (\[.*?\]);/g); + + if (!videoArrayMatches) { + console.log("Could not find video arrays"); + return dummyLink; + } + + const providers = {}; + + function processVideoArray(videoArrayString, language) { + try { + const videoArray = JSON.parse(videoArrayString); + + videoArray.forEach(([providerName, url]) => { + const idMatch = url.match(/id=([A-Za-z0-9+/=]+)/); + if (idMatch) { + const base64Id = idMatch[1]; + const decodedUrl = atob(base64Id); + + if (decodedUrl.includes('filemoon.to')) { + let key = decodedUrl; + let counter = 1; + while (providers[key]) { + key = `${decodedUrl}#${counter}`; + counter++; + } + providers[key] = language; + } + } + }); + } catch (error) { + console.error(`Error processing ${language} video array:`, error); + } + } + + videoArrayMatches.forEach(match => { + const arrayMatch = match.match(/var videos(\w+) = (\[.*?\]);/); + if (arrayMatch) { + const language = arrayMatch[1].toLowerCase(); + const arrayString = arrayMatch[2]; + processVideoArray(arrayString, language); + } + }); + + const streams = []; + + for (const [filemoonUrl, language] of Object.entries(providers)) { + try { + console.log(`Processing ${filemoonUrl} for language: ${language}`); + + const filemoonResponse = await fetchv2(filemoonUrl); + const filemoonHtml = await filemoonResponse.text(); + + const m3u8Url = await filemoonExtractor(filemoonHtml, filemoonUrl); + + if (m3u8Url) { + const cleanLanguage = language.replace(/#\d+$/, '').toUpperCase(); + streams.push(cleanLanguage, m3u8Url); + console.log(`Successfully extracted: ${m3u8Url} for ${cleanLanguage}`); + } else { + console.log(`Failed to extract m3u8 URL from ${filemoonUrl}`); + } + } catch (error) { + console.error(`Error processing ${filemoonUrl}:`, error); + } + } + + const final = { + streams, + subtitles: "" + }; + + console.log("RETURN: " + JSON.stringify(final)); + + if (streams.length > 0) { + return JSON.stringify(final); + } else { + return JSON.stringify({ + streams: [], + subtitles: "" + }); + } + + } catch (err) { + console.error("Error in extractStreamUrl:", err); + return dummyLink; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ diff --git a/gnulahd/gnulahd.json b/gnulahd/gnulahd.json new file mode 100644 index 0000000..c582d7c --- /dev/null +++ b/gnulahd/gnulahd.json @@ -0,0 +1,19 @@ +{ + "sourceName": "GnulaHD", + "iconUrl": "https://i3.wp.com/ww3.gnulahd.nu/wp-content/uploads/2025/07/cropped-faviconhd3-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://ww3.gnulahd.nu/", + "searchBaseUrl": "https://ww3.gnulahd.nu/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/gnulahd/gnulahd.js", + "type": "anime/shows/movies", + "asyncJS": true, + "softsub": true, + "downloadSupport": false +} diff --git a/gojowtf/gojowtf.js b/gojowtf/gojowtf.js new file mode 100644 index 0000000..db0b704 --- /dev/null +++ b/gojowtf/gojowtf.js @@ -0,0 +1,136 @@ +async function searchResults(keyword) { + const results = []; + const headers = { + 'Referer': 'https://animetsu.to/', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' + }; + + const encodedKeyword = encodeURIComponent(keyword); + const response = await fetchv2(`https://backend.animetsu.to/api/anime/search?query=${encodedKeyword}&page=1&perPage=1000`, headers); + const json = await response.json(); + + json.results.forEach(anime => { + const title = anime.title.english || anime.title.romaji || anime.title.native || "Unknown Title"; + const image = anime.coverImage.large; + const href = `${anime.id}`; + + if (title && href && image) { + results.push({ + title: title, + image: image, + href: href + }); + } else { + console.error("Missing or invalid data in search result item:", { + title, + href, + image + }); + } + }); + + return JSON.stringify(results); +} + +async function extractDetails(id) { + const results = []; + const headers = { + 'Referer': 'https://animetsu.to/', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' + }; + + const response = await fetchv2(`https://backend.animetsu.to/api/anime/info/${id}`, headers); + const json = await response.json(); + + const description = cleanHtmlSymbols(json.description) || "No description available"; + + results.push({ + description: description.replace(/<br>/g, ''), + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(id) { + const results = []; + const headers = { + 'Referer': 'https://animetsu.to/', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' + }; + + const response = await fetchv2(`https://backend.animetsu.to/api/anime/eps/${id}`, headers); + const json = await response.json(); + + for (const ep of json) { + results.push({ + number: ep.number, + href: `&id=${id}&num=${ep.number}` + }); + } + + return JSON.stringify(results); +} + +async function extractStreamUrl(slug) { + const headers = { + 'Referer': 'https://animetsu.to/', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' + }; + + const fixedSlug = slug.replace('&', '?'); + const streams = []; + + const serverListRes = await fetchv2(`https://backend.animetsu.to/api/anime/servers${fixedSlug}`, headers); + const serverList = await serverListRes.json(); + console.log("Fetched server list: " + JSON.stringify(serverList)); + const unfixedSlug = fixedSlug.replace('?', '&'); + + for (const server of serverList) { + if (server.name?.toLowerCase().includes('zoro') || server.id?.toLowerCase().includes('zoro')) { + console.log(`Skipping Zoro server: ${server.name || server.id}`); + continue; + } + + for (const subType of ['sub', ...(server.hasDub ? ['dub'] : [])]) { + const url = `https://backend.animetsu.to/api/anime/tiddies?server=${server.id}${unfixedSlug}&subType=${subType}`; + console.log("Fetching stream URL:" + url); + const res = await fetchv2(url, headers); + const data = await res.json(); + + if (data?.sources?.length) { + for (const { quality, url: streamUrl } of data.sources) { + const language = subType === 'sub' ? 'HARDSUB' : subType.toUpperCase(); + streams.push(`${server.id} - ${quality} - ${language}`, streamUrl); + } + } + } + } + + const final = { + streams, + subtitles: "" + }; + + console.log("RETURN: " + JSON.stringify(final)); + return JSON.stringify(final); +} + + + + +function cleanHtmlSymbols(string) { + if (!string) return ""; + + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .replace(/<i[^>]*>(.*?)<\/i>/g, "$1") + .replace(/<b[^>]*>(.*?)<\/b>/g, "$1") + .replace(/<[^>]+>/g, "") + .trim(); +} diff --git a/gojowtf/gojowtf.json b/gojowtf/gojowtf.json new file mode 100644 index 0000000..73cafaf --- /dev/null +++ b/gojowtf/gojowtf.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Animetsu", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/gojowtf/gojowtf.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "2.0.0", + "language": "English (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://animetsu.to/", + "searchBaseUrl": "https://animetsu.to/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/gojowtf/gojowtf.js", + "asyncJS": true, + "type": "anime", + "softsub": true, + "note": "" +} diff --git a/gojowtf/gojowtf.png b/gojowtf/gojowtf.png new file mode 100644 index 0000000000000000000000000000000000000000..a5259e84c5f12c206c017405fdb6de337d637f41 GIT binary patch literal 80882 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 A;s5{u literal 0 HcmV?d00001 diff --git a/hdhub4u/hdhub4u.js b/hdhub4u/hdhub4u.js new file mode 100644 index 0000000..ca1d138 --- /dev/null +++ b/hdhub4u/hdhub4u.js @@ -0,0 +1,158 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://hdhub4u.navy/?s=" + keyword); + const html = await response.text(); + + const regex = /<li class="thumb[^>]*>[\s\S]*?<img src="([^"]+)"[^>]*alt="([^"]+)"[\s\S]*?<a href="([^"]+)"/g; + let match; + + while ((match = regex.exec(html)) !== null) { + const title = cleanTitle(match[2].trim()); + if (!/episode/i.test(title)) { + results.push({ + title: title, + image: match[1].trim(), + href: match[3].trim() + }); + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regexTitle = /<h1 class="page-title">[\s\S]*?<span class="material-text">([\s\S]*?)<\/span>/i; + const matchTitle = regexTitle.exec(html); + const titleText = matchTitle ? matchTitle[1].replace(/<[^>]+>/g, "").trim() : ""; + + let description; + if (/episodes/i.test(titleText)) { + description = "SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED - SHOWS NOT SUPPORTED "; + } else { + const regexDesc = /<div class="kno-rdesc">([\s\S]*?)<\/div>/i; + const matchDesc = regexDesc.exec(html); + description = matchDesc ? matchDesc[1].replace(/<[^>]+>/g, "").trim() : "N/A"; + } + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a\s+[^>]*href="([^"]+)"[^>]*>([^<]*(?:\d+p|\d+\.\d*(?:GB|MB)|480p|720p|1080p|4K|2160p)[^<]*)<\/a>/gi; + + let matches = []; + let match; + + while ((match = regex.exec(html)) !== null) { + const href = match[1].trim(); + const text = match[2].trim(); + + if (!href.includes('join-our-group') && + !href.includes('telegram') && + !href.includes('whatsapp') && + !text.toLowerCase().includes('join') && + !text.toLowerCase().includes('group')) { + matches.push({ + href: href, + text: text + }); + } + } + + const lastMatch = matches.length > 0 ? matches[matches.length - 1] : null; + + return JSON.stringify([{ + href: lastMatch ? lastMatch.href : "N/A", + number: 1, + text: lastMatch ? lastMatch.text : "N/A" + }]); + + } catch (err) { + console.error('Error extracting episodes:', err); + return JSON.stringify([{ + href: "Error", + number: "Error", + text: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<title>HubDrive \| (.*?)<\/title>/i; + const match = regex.exec(html); + const filename = match ? match[1].trim() : "default.mp4"; + + const baseUrls = ["https://fsl.fastcloud.lol/", "https://fsl.fastcloud.buzz/"]; + let fullUrl = null; + + for (const base of baseUrls) { + const testUrl = base + filename; + try { + const passthroughUrl = "https://passthrough-worker.simplepostrequest.workers.dev/?head=" + encodeURIComponent(testUrl); + const resText = await fetchv2(passthroughUrl).then(r => r.text()); + if (!/Status:404/i.test(resText)) { + fullUrl = testUrl; + break; + } + } catch {} + } + + if (!fullUrl) fullUrl = "https://files.catbox.moe/avolvc.mp4"; + + console.log("Full URL:"+ fullUrl); + return fullUrl; + } catch (err) { + console.log("Full URL:"+ "https://files.catbox.moe/avolvc.mp4"); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + +function cleanTitle(title) { + return title + .replace(/’|’/g, "'") + .replace(/‘|‘/g, "'") + .replace(/“|“/g, '"') + .replace(/”|”/g, '"') + .replace(/–|–/g, "-") + .replace(/—|—/g, "--") + .replace(/…|…/g, "...") + .replace(/&/g, "&") + .replace(/"/g, '"') + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/ /g, " ") + .replace(/&#[0-9]+;/g, "") + .replace(/\s+/g, " ") + .trim(); +} + diff --git a/hdhub4u/hdhub4u.json b/hdhub4u/hdhub4u.json new file mode 100644 index 0000000..30643da --- /dev/null +++ b/hdhub4u/hdhub4u.json @@ -0,0 +1,19 @@ +{ + "sourceName": "hdhub4u", + "iconUrl": "https://hdhub4u.navy/wp-content/uploads/2021/05/cropped-cropped-1-1-1-2-1-180x180.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Hindi", + "streamType": "MKV", + "quality": "4K - 1080p", + "baseUrl": "https://hdhub4u.co/", + "searchBaseUrl": "https://hdhub4u.co/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/hdhub4u/hdhub4u.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/helioscans/helioscans.js b/helioscans/helioscans.js new file mode 100644 index 0000000..3caf914 --- /dev/null +++ b/helioscans/helioscans.js @@ -0,0 +1,232 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const url = `https://helioscans.com/series/?q=${encodedKeyword}`; + const response = await soraFetch(url); + const html = await response.text(); + + const results = []; + const regex = /<button[^>]+?title="([^"]+?)"[^>]*?>[\s\S]*?<a href="([^"]+?)"[\s\S]*?background-image:url\(([^)]+)\)/g; + let match; + + while ((match = regex.exec(html)) !== null) { + const title = match[1]; + const href = `https://helioscans.com${match[2]}`; + const rawImage = match[3].replace(/&/g, "&"); + const image = rawImage.startsWith("http") ? rawImage : `https:${rawImage}`; + + results.push({ title, href, image }); + } + + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + console.error("Error fetching or parsing: " + error); + return JSON.stringify([{ + title: "Error", + href: "", + image: "" + }]); + } +} +extractChapters('https://helioscans.com/series/63a6054296b/'); + +async function extractDetails(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const metaMatch = htmlText.match(/<meta name="description" content="([\s\S]*?)">/i); + const description = metaMatch + ? metaMatch[1].replace(/\s+/g, ' ').trim() + : "No description available"; + + const aliases = 'N/A'; + const airdate = 'N/A'; + + const transformedResults = [{ + description, + aliases, + airdate + }]; + + console.log(JSON.stringify(transformedResults)); + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Details error:' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'N/A', + airdate: 'N/A' + }]); + } +} + +async function extractChapters(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + console.log(htmlText); + + const chapters = []; + const chapterLinkRegex = /<a\s+[^>]*href="([^"]*\/chapter\/[^"]*)"[^>]*>([\s\S]*?)<\/a>/gi; + let linkMatch; + + while ((linkMatch = chapterLinkRegex.exec(htmlText)) !== null) { + const fullLinkHtml = linkMatch[0]; + const href = `https://helioscans.com${linkMatch[1]}`; + + const titleRegex = /<span[^>]*class="[^"]*\btext-sm\b[^"]*\btruncate\b[^"]*"[^>]*>([^<]+)<\/span>/i; + const titleMatch = titleRegex.exec(fullLinkHtml); + const rawTitle = titleMatch ? titleMatch[1].trim() : ""; + + if (!rawTitle) continue; + + const isLocked = /Coin\.svg/i.test(fullLinkHtml); + const title = isLocked ? `${rawTitle} (Locked – 100 credits)` : rawTitle; + + chapters.push({ title, href }); + } + + chapters.sort((a, b) => { + const numA = parseFloat(a.title.match(/Chapter\s+(\d+)/i)?.[1]) || 0; + const numB = parseFloat(b.title.match(/Chapter\s+(\d+)/i)?.[1]) || 0; + return numA - numB; + }); + + chapters.forEach((chapter, index) => { + chapter.number = index + 1; + }); + + console.log(JSON.stringify(chapters)); + return JSON.stringify(chapters); + } catch (error) { + console.error('Fetch error in extractChapters:', error); + return JSON.stringify([{ + href: url, + title: "Error fetching chapters", + number: 0 + }]); + } +} + +async function extractText(url) { + try { + const headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.5', + 'Connection': 'keep-alive', + 'Upgrade-Insecure-Requests': '1' + }; + + const response = await soraFetch(url, headers); + const htmlText = await response.text(); + + const startMarker = '<div id="pages"'; + const startIndex = htmlText.indexOf(startMarker); + if (startIndex === -1) { + throw new Error("Pages content div start (<div id=\"pages\") not found"); + } + + const startTagEndIndex = htmlText.indexOf('>', startIndex); + if (startTagEndIndex === -1) { + throw new Error("Could not find the end of the opening <div id=\"pages\"> tag"); + } + + const contentStartIndex = startTagEndIndex + 1; + let depth = 1; + let pos = contentStartIndex; + let endIndex = -1; + + while (depth > 0 && pos < htmlText.length) { + const nextOpenDiv = htmlText.indexOf('<div', pos); + const nextCloseDiv = htmlText.indexOf('</div', pos); + + if (nextCloseDiv === -1) { + break; + } + + if (nextOpenDiv !== -1 && nextOpenDiv < nextCloseDiv) { + depth++; + pos = nextOpenDiv + 4; + } else { + depth--; + if (depth === 0) { + endIndex = nextCloseDiv; + } else { + pos = nextCloseDiv + 5; + } + } + } + + if (endIndex === -1) { + throw new Error("Matching closing </div> for pages content div not found"); + } + + let innerContent = htmlText.substring(contentStartIndex, endIndex); + + innerContent = innerContent.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, ''); + innerContent = innerContent.replace(/<div[^>]*class="[^"]*fixed[^"]*z-\[60\][^"]*top-0[^"]*left-0[^"]*w-full[^"]*h-full[^"]*bg-black\/90[^"]*flex[^"]*justify-center[^"]*items-center[\s\S]*?<\/div>/gi, ''); + + const paragraphRegex = /<p[^>]*>(.*?)<\/p>/gi; + let textContent = ''; + let match; + + while ((match = paragraphRegex.exec(innerContent)) !== null) { + const paragraphText = match[1].replace(/<[^>]*>/g, '').trim(); + if (paragraphText) { + textContent += paragraphText + '\n'; + } + } + + innerContent = innerContent.trim(); + + if (!innerContent && !textContent) { + throw new Error("Chapter text not found or empty after cleaning"); + } + console.log(innerContent || textContent); + return innerContent; + + } catch (error) { + console.error("Fetch error in extractText: " + error.message); + return '<p>Error: This is chapter is locked as early access by the website, you will have to pay on the website or wait for the chapter to be released globally</p>'; + } +} + +async function soraFetch(url, options = { + headers: {}, + method: 'GET', + body: null +}) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch (e) { + try { + return await fetch(url, options); + } catch (error) { + return null; + } + } +} + +function decodeHtmlEntities(text) { + const entities = { + '—': '—', + '–': '–', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'", + '/': '/', + '`': '`', + '=': '=', + ' ': ' ' + }; + + return text.replace(/&#x[\dA-Fa-f]+;|&\w+;/g, (match) => { + return entities[match] || match; + }); +} diff --git a/helioscans/helioscans.json b/helioscans/helioscans.json new file mode 100644 index 0000000..817c001 --- /dev/null +++ b/helioscans/helioscans.json @@ -0,0 +1,19 @@ +{ + "sourceName": "HelioScan", + "iconUrl": "https://wsrv.nl/?url=image.meowing.org/uploads/_9FxZ8P7Tik&w=44", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "English", + "streamType": "novels", + "quality": "N/A", + "baseUrl": "https://helioscans.com/", + "searchBaseUrl": "https://helioscans.com/%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/helioscans/helioscans.js", + "type": "novels", + "asyncJS": true, + "novel": true, + "downloadSupport": false +} diff --git a/hianime/hianime.js b/hianime/hianime.js new file mode 100644 index 0000000..7a22871 --- /dev/null +++ b/hianime/hianime.js @@ -0,0 +1,115 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetchv2(`https://bshar1865-hianime2.vercel.app/api/v2/hianime/search?q=${encodedKeyword}`); + const data = await responseText.json(); + + console.log("Search results:", data); + + const transformedResults = data.data.animes.map(anime => ({ + title: anime.name, + image: anime.poster, + href: `https://hianime.to/watch/${anime.id}` + })); + + console.log("Transformed results:", transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(url) { + try { + const match = url.match(/https:\/\/hianime\.to\/watch\/(.+)$/); + const encodedID = match[1]; + const response = await fetchv2(`https://bshar1865-hianime2.vercel.app/api/v2/hianime/anime/${encodedID}`); + const data = await response.json(); + + const animeInfo = data.data.anime.info; + const moreInfo = data.data.anime.moreInfo; + + const transformedResults = [{ + description: animeInfo.description || 'No description available', + aliases: `Duration: ${animeInfo.stats?.duration || 'Unknown'}`, + airdate: `Aired: ${moreInfo?.aired || 'Unknown'}` + }]; + + console.log("Transformed results:", transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(url) { + try { + const match = url.match(/https:\/\/hianime\.to\/watch\/(.+)$/); + const encodedID = match[1]; + const response = await fetchv2(`https://bshar1865-hianime2.vercel.app/api/v2/hianime/anime/${encodedID}/episodes`); + const data = await response.json(); + + const transformedResults = data.data.episodes.map(episode => ({ + href: episode.episodeId, + number: episode.number + })); + + console.log("Transformed results:" + transformedResults); + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Fetch error:', error); + } +} + +async function extractStreamUrl(id) { + try { + const subRes = await fetchv2(`https://animeapiiiii.vercel.app/api/stream?id=${id}&server=hd-1&type=sub`); + const subJson = await subRes.json(); + + const streamSub = subJson.results.streamingLink.link.file; + const englishSubtitles = (subJson.results.streamingLink.tracks || []).find( + track => track.kind === "captions" && track.label.toLowerCase().includes("english") + )?.file || ""; + + let streamDub = null; + try { + const dubRes = await fetchv2(`https://animeapiiiii.vercel.app/api/stream?id=${id}&server=hd-1&type=dub`); + const dubJson = await dubRes.json(); + streamDub = dubJson.results?.streamingLink?.link?.file || null; + } catch (e) { + streamDub = null; + } + + const streams = []; + + if (streamDub) { + streams.push("DUB", streamDub); + } + + if (streamSub) { + streams.push("SUB", streamSub); + } + + const final = { + streams, + subtitles: englishSubtitles + }; + + console.log("RETURN: " + JSON.stringify(final)); + return JSON.stringify(final); + + } catch (error) { + console.log("Error in extractStreamUrl:", error); + return JSON.stringify({ + streams: [], + subtitles: "" + }); + } +} + diff --git a/hianime/hianime.json b/hianime/hianime.json new file mode 100644 index 0000000..eaa6ae6 --- /dev/null +++ b/hianime/hianime.json @@ -0,0 +1,18 @@ +{ + "sourceName": "HiAnime", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/hianime/iconapp.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "3.0.2", + "language": "English (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://megacloud.blog/", + "searchBaseUrl": "https://bshar1865-hianime.vercel.app/api/v2/hianime/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/hianime/hianime.js", + "type": "anime", + "asyncJS": true, + "softsub": true +} diff --git a/hianime/hianimetemp.js b/hianime/hianimetemp.js new file mode 100644 index 0000000..f18ecd4 --- /dev/null +++ b/hianime/hianimetemp.js @@ -0,0 +1,98 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const responseText = await fetch(`https://bshar1865-hianime.vercel.app/api/v2/hianime/search?q=${encodedKeyword}&language=dub`); + const data = JSON.parse(responseText); + + const filteredAnimes = data.data.animes.filter(anime => anime.episodes.dub !== null); + + + const transformedResults = data.data.animes.map(anime => ({ + title: anime.name, + image: anime.poster, + href: `https://hianime.to/watch/${anime.id}` + })); + + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Fetch error:', error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(url) { + try { + const match = url.match(/https:\/\/hianime\.to\/watch\/(.+)$/); + const encodedID = match[1]; + const response = await fetch(`https://bshar1865-hianime.vercel.app/api/v2/hianime/anime/${encodedID}`); + const data = JSON.parse(response); + + const animeInfo = data.data.anime.info; + const moreInfo = data.data.anime.moreInfo; + + const transformedResults = [{ + description: animeInfo.description || 'No description available', + aliases: `Duration: ${animeInfo.stats?.duration || 'Unknown'}`, + airdate: `Aired: ${moreInfo?.aired || 'Unknown'}` + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(url) { + try { + const match = url.match(/https:\/\/hianime\.to\/watch\/(.+)$/); + const encodedID = match[1]; + const response = await fetch(`https://bshar1865-hianime.vercel.app/api/v2/hianime/anime/${encodedID}/episodes`); + const data = JSON.parse(response); + + const transformedResults = data.data.episodes.map(episode => ({ + href: `https://hianime.to/watch/${encodedID}?ep=${episode.episodeId.split('?ep=')[1]}`, + number: episode.number + })); + + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Fetch error:', error); + } +} + +async function extractStreamUrl(url) { + try { + const match = url.match(/https:\/\/hianime\.to\/watch\/(.+)$/); + if (!match) throw new Error("Invalid URL format"); + const encodedID = match[1]; + + const response = await fetch(`https://bshar1865-hianime.vercel.app/api/v2/hianime/episode/sources?animeEpisodeId=${encodedID}&category=dub`); + const responseTwo = await fetch(`https://bshar1865-hianime.vercel.app/api/v2/hianime/episode/sources?animeEpisodeId=${encodedID}&category=sub`); + + const data = JSON.parse(response); + const dataTwo = JSON.parse(responseTwo); + + const hlsSource = data.data.sources.find(source => source.type === 'hls'); + const subtitleTrack = dataTwo.data.tracks?.find(track => track.label === 'English'); + + const result = { + stream: hlsSource ? hlsSource.url : null, + subtitles: subtitleTrack ? subtitleTrack.file : null + }; + + return JSON.stringify(result); + } catch (error) { + console.error('Fetch error:', error); + return null; + } +} + + + diff --git a/hianime/hianimetemp.json b/hianime/hianimetemp.json new file mode 100644 index 0000000..044f8c0 --- /dev/null +++ b/hianime/hianimetemp.json @@ -0,0 +1,18 @@ +{ + "sourceName": "HiAnimeTemp", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/hianime/iconapp.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.4", + "language": "English (DUB + SUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://megacloud.blog/", + "searchBaseUrl": "https://bshar1865-hianime.vercel.app/api/v2/hianime/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/hianime/hianimetemp.js", + "asyncJS": true, + "softsub": true, + "type": "anime" +} diff --git a/hianime/icon.png b/hianime/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bdbe538ed6347b41c6108343b0c2558633299106 GIT binary patch literal 62544 zcmb@tcUY5OvnYxR(m@a@BE5GAy@cMYNbk~nF_ZwIs0b*%Hz^`bsVX3Z5Rl$MKzaa? z&>@i;=_mO6_P6&w&$;)WbMO5lPqNlKGiyy*v!=Xx^H^Vll;|N54h{~fmZs_x9GqK6 zHy?uA*csIZ%|+}Np`WIOKMoFA_s!>4CLb9+4i0X<yRmtIxt^|!qp!E1y_2tlvtY2d z9~K%1M@}Kw&)(6~Ie^*0+11?#$c2Wrb1}O+0lCb?^@R2ORGi)1HA6wpMxpw~j-j58 z(oS3o@<ejMGFSrM&H?t!!QNgz{xZQpuD^6;u)lAng}AUlASV}@C#vfI0>O@eTy6mY zelkKrU@%w^EGp;=aupJhmX;P01_%KF0$2zE{}7)5`(Obde>N-yBIds|RGs}DLGFG5 z?!G?EH#F@Xd;<f3TwFxV|01mv5CC#__&0SQe?j}dGl4fKf>@@7?4A6DL<EIzw#CdW z_Yb^`l9T_<@SjDDoS*$2{4?@$|GSc(J;>kLIK<Bx$o0h8-!~BC==_($4bs1esDPa9 z1Du`Y0m1-r0bziEh=iQb|Mci)jsHYY3l7k7k{1(mbdV61wij@6l5i9d6O$AXka7}n z5s<KVv6qr?b`cYH7XCM(e^CBA8FdFN6>)$#KtfzvL`+0dT3qTs5&k~>@9@UHfsSrB ztjGiYP4_?N{=&)$-ALEV{U4$H9sElw|Hk-7Wd8vE7q$HFtIEmo-)iy;1bO{60VhWx zXD?@OXP<x@C5ik?NluP30qy}_&i|<*C9i=0t|F}M$#~iOxB|I?1)Q8+>;t_5xa3t$ zl$iyXMgAAe{0m=B=)aKu|G<jhe=+DAllyzFZj2540LzEyzxcq8WRwB}+<Zau_HMo* zayO6vV*+d7f5rU&N|e|W_-|SMxAlYV{r-!wW5Hzp8mTYH*w@!fUd7%g$e!8B*Ab|y zq~T&{CL9#%Z^9ht?+gN(D5*Ynf94YS%-w|90c7vv1XNa12R(K-cNcIqWDaol_VdEp zI#5pNf2R4r<l`UKunqw03WWacFtCGvyBufi3S1zpL(!?<kj24a#?ew$G7iq)g~vwT z*I4*4qHtW`zl72H#NnNeR7dyN*ktj+qqf)^?rAC$u^_dSnOW|IHgPO8+#}$4{?=>q zS=0R4+guZifiy&E=Dns!8s)6AsbSP^V?CyU@LFpqvA-MfM&(pWa?kOC`{Hc8`+IWO zqZ1>n7kvIo7YBL=2d9*g8H^oKvF9V+e8Icz%b}0C1H#9_(RAq?0uEa#p|G%M@_%5Q zUd|5Pe&IIUXUKv+4R-h$^)v{J%Fe=!NshUawl-nF!fHk+-k|XGzuFwnVTR)4JKZc+ z>a3h&7PX*1$tqTM<GQto`?0{xcy#Ru8Z!HQ_qe@jheG9kUoRtqQwCR}bPu%Frw(=l zTgo*vcFZONlSqgy=Q<vj^NZK1T--vm&w7<5q&kO57A;Gul3b%i<}8OLX`cYnSlXX0 zzR=29e)VV>ms98o5e>=QPuf@aINDdohrVA3(i%nhv-t|I_knj$N&CZ_zY(7)wh^Qz zO;Y31s+}CfEL+ace$8UCobQEo{DdoH)sX5HqmOAf!1novvIprbPa<fNJ~klR>P{IP z57hIQ8xRc*t@dxig1Tkf*~ShCjwsXbv)?^sXtyox7wQjh=mQL_F`_SCA~bUCQe^vq zN~Z<)+GbWi1WnJPJ3D>6y_%#A<I%yAv{kU(Ph5A9V7XI<(CmVgi*>bhn}kF9hgo!W zh}FX7R4;$zX=2C=I+X}V(93RM`~4VC0O_gj>~3P*C;EiF>E8N|SswvyqQ2G+a^7~P z`F#eRh!PK=f<O&Us`hDk5phE4&C+`TIjuc%;sf>dX&1=k5TbOs8(2LMR72bL;L$R> zkZ{@>&2?aBj=c2x4^0cH-jq&qfp#e6I@l{#CC~r(aumI}R>*#u_@#qgq0Lc#k$p($ zYUdS;nmsq3%Drpx(2lgHQ7TQ;hos68=@RYZjw6nmww>UgIfwLzU8y9edRMp8U-gW^ zMhKZI)=vAcrD||QL@r=#6ddBIZNXkvL-d!^xDGk3IUADN2fbO#Ia~&Vq?{oKKmR0g zwQHrx@g)0t;Yn@R=>6daj%i$JY~j65z7MTeMDau(L?IN0FF3Uh<h`JgR7Xk5OomVH zZxyn7dA#=(K4Z|HO-_)G#_neLkUl)h@axG7B)9=@U1iAEI-O>LR2^hgxh}bTHx?M_ znA>W<W}A^^s>@j7B*gw~+=$KVQ}B^hJiDyDC!4Nqhu;8Sl6wU4YS!|5^9}GTD|-6~ zjphzjhGh!IB<#kWqE;2!*c28WtP1;5mNk8}4=$2U1BhWA@0-^ohx?RJEMcEO2K@u% zAf}CdJZPV6JGveb>-m`Bq}IvJ;~-p%ZoylBwnlBxs)IY-Oc*ixPz%AfyObOf(N%ci zD8=g7UV{~_Bg{Lp{lMzp&IK9dpu#pH7H*j!5HbM0)0eqScz^OBoJ#jmpjj?AVO#)z zUu$EIuP~<-B>CWNzN~OWEF0%S!s!y<^9xQRqSfr>?xObl4%r;oQ^{=ck4s>_&r1H3 zlw-vm4?C$&@Xt}b_19Z4|Kka8kz_bHDKDQRZsFiOxtD_VWQs(9Cr~cAVl2kD{ufHR z*l(WyUCi5m9gfmJjsuJIntUsI>&yGicNlj00;aoLUslNb+@9Z|c|k#SKEAhc^qK1} zlB^p)1p>GQ$|gvWO*wmxNGD8zsXj-%_<@fs)P0WNxQ!$$m1o8{-9`#hFoT(oZ$Y{4 zGlSn~0-!Xv6?f?jd4$*_@PFy+Ca$&%-%)uDNAwlu5Q->lWB0At`Txl4|GeWHU-o~E zltKsy5y28parkcn`#&UNzgD}S`lsQ>eX=>3Lp=%qsscm!kMvm!AAFH|^pMH^T82^V zeU5?ZuisN|&TMfAbUNdhsLp?Is-hn9>@QNQvSqf>;B=;a_=Vpi-*^ieg?NFBb@;zJ za1F&H`imwhEQOx^@xjt8#Xk8X%ral}84-vp5W%>Ez6-shD08D7!!<@%tg=$buy|3L zsI7;F$8w-*&LAvz%nUc0`HblKeEiGrlFjjA5xYxGeCVBhdvj>tXCYFoF-<6;6vJ|U zCiY^ND9*U^<`xzuim>fUxXo5%N#Qx-ex%oPa@-Wzd*q5Jtm-<jS`EIZhU&pmO2N6A z<}4j*=y-kosIL~Vg`H%+0T8xlFUMYII7>qRHlzQ0rToik|Id{0|0mMx*VeTrxNON? zP23LJo#2N!39nMA)}IynV0mT*MJEw)u7jA)9;~vj$dclycWM&VJA|##A<0y44&O7Z zeX~=hKn7C;Ctqs?hhpWDqKS2cDpXLu*Q&U`#>;QN!uuBpR(47fS^+W&j}%eQl*n-J zKht=DFp4e)VVExOLAhGRBCry4Om=XB9Y?V~p}P&O;Qh6zZxpIPC=~acHsyR12O7(x z!uI$%PCrl_2ii{a9HD{V57ec5_~JIMBI={kF!-;oO70*T%SjT=Z!u#qRG&`I3HrkW zo+G+4iYe%CA+HK=gCd!3L6gZ+AUOar2e#*kWg|rtnr$@`(h0-WN?;ww=O?64uS+Ox zGA#x7Hmb~i&<wt%qfcqu`&>kLbkbY7QxvOTobE^e82oLJff}-dT@HwiIYvK$B=7Y~ zv?wV|lP4WQ*f`W@U8*Id=CQ$nZvt)&Ie)->EE1Hw7ct$}!cOa8Lvr+4@WXT5?pA9K zYax3asLoeR2|DppB*SShUX5p~0n#!RQR2(Ko}Eu_gc3nK{au`T{`eKgx}D4!l{$X5 zqHi=?t`Dmc>IIs1VJ5*2^?CmM%)Dr-MDP(2wD6r#FwD^-YJ1+zXlZhm*};h(Q>c)K zV~(=zSMP>09>7Hee=%bWDX%1ktSD)7X=FY;eXadEOp{7*^v{zj4XwBoUX`DD?30E7 zfvb!JCt(*DaBk4#$)Jr~J+2;I%u{ySm&?@D7ZG+Zk2+vNt!r$NTOZma!?anw{JkIw zUNzlsVfK@3t;>Ai=)$8X6Sz=Xh^bVrUIs#UK&QWiupN+wToEM=v0hbUxec!s{!YY} zIQb^1IjdZZwIR4E;Zo+Ib5nxbSi<hNL@2xJT%O2u&r_;3UhY&kp@HLk-8$_VKIc%= zT34ziw)e~~W@U6g?k5sBx1=idCo~LiO3Et<eH#pT#>G&)@%YK)5x4!I*qv;jr<0`I z_6__v(Ts-UnOp7|l>zYIJgU`5Mp&9~3qaw^d-3<|iPl1^(#f2-?M?~bK2>COfJbRr z@2jC4ua?~25Dw)G8fEAvasx^BE`wr3((jZPe_)N{?dFc-Rug&FzzlW@A`THd)h=w$ zVo*ax;0~R8qGTL`*i7Y~NZaU6s@?juoND)7UL?^3wTcjBQI+#>%!GKwD;-@VY3ULH z*=DMcp^dtA8IU!7!@JUD*@osxn(yfDQ>Z&Xl#o3rS59IiZJ>cO@gN274*`FI^M#=) z!b1GsF7Eer=u7~(p>GSd`tVH5DOIu26wh79W?l_GGsiSYhO+p&Hl;pEzYP&I9nJBb z)4FY~M-_!ft9EN&_D#{d$vZQ1JySuE?7;VPJj<kjTQkZ1b12#C2X~i!e%z~|`NLiM z(cwt}lfeiBQr-v3cT}xB#zR5^9WeSHN>@|VzbRiH2*9i5XA^ah9`v)ZEf+2|`eT?h zem~&$M6|P$OpJM9516F+2hZb5%}%N%2pNdm{k{sFbih_84WqzW#>-NpyC4I3sD=Wp zbHL_xTcR0CM4_thUT@r2Osrn<ZwaWiqEPk@(iXa5WGtw(3%+C6`r?&ceE4ywo>ay8 z_U_BUJ0O~2K?K`<=&DU3?^gfrsaS!IDDDMf2lM%Bk|sZ9JnK~sO_cqCtOV4kdz@(g zd48e#7U!3<Wb?&H^F@sWQ+0P*s5;LiXzPz6o9KH<<_VsH;rOiQMLLp4c?f0z;8jzB zqB<p~5eb~~=Yj?`jbV*)(*0ch$B$RF6+uJcs$~Jl&{RcKSGjyOVt-`*4^sYXi`7wm zD9MAVO%RhrNa?!ZE-9k*V^3QzXsl%OlnRccuzzNw67sh4yQ4@Acj<%EQV+XFDBMHV zSJrS#a<QP(LcRbJ5U$Cl=y@0uvAc}HZ`lW7UwAslzKI4@sAVs1zE9~I0Mf;E2%j=& zJ&-?Q*J!jE6gDh2a7|<qjk&fDxbE7zs-pyYa01kbDqpA5e4LCo-s-6)ksM=QtiUR$ z_+E)gir^E+u9@HR6OwE-CEb2o5B1BH4BVvkqaM-NT<~$-zJ4$@XIMLqN8(<f1ZJlV zpeuPlpzi=pZlLY{ZdQ_dPCLq$0?PoIy<V&BV5}hGk;#6)@#IME7smQYs*oxpmy&<S zZb-x9Ml-6rlHY#aA6R}l*e~2>H;y0g)<6;cyOh9Wmag)72cw;4zI?XJ#=Z54;oC?s z<(Uw*M#L*R0Y%hAzfBTSe@kIK;d<!d6?xUUg7)5Z#l#i4S-w6E;NW&(sFLZ!_m2x~ zKV&@k@<rJ)iAmZb^|ga;=x5N;PlEvhwyW2?HBxLfQt9vXRqB3<eL7$*tL7H1;r4XE zIl9ZilS@*QK533(S~;iW2jlevlQs+$QTAt)B-xv<6MH%aC~uGaTBK1;Xp^+8c>N(( zR5vYVhl0WeMe%Jfmy=Sx4`f!AAe}xuC*8aI$i`G($y7hWG)T!bNJJ^UploDdV(nd@ zm!5u*p}xLhkc4u2LCx6UwCnl6gsW@lz`&0+Cl89vdV&TD5$U<k^0@JG5QqrGxwfG@ zS|nD619WlTaCM>n?8O2N#`PhiB7*DI#!ryCu)~~HAuin-0;lmE1WnXw%Ejx2F&Cq` zSJ|Q$cKX)}yw=_Zj`5-y^K`sj*3-g8(_<9@hi;43mXdGxONvHl!)Wo=g?pha-zk_Q z3s%pc&W?=|Yy312>lDkDc+(_YBr#ecOx(XJHz<`ZqQ9bRkxy}IqwcBT638UFNm$t* z+wVh_@P(winzsAXyQE6%L@3gL)<XHkvv<N2!<!T)aWsO~(6Am?&uNsM9XxU|2JR`j zYXOTG3ss;$@%px_Zd^w$r%_i|wFHakS|Y_gSYNcA-dp<QL*sCHX0tPmwuE(zp#uLz zZC(~poDf-6Ej5Ez*T<%PXW<@G6*7yJJn4q>L}7_low+V41JB9;`!LiU9Fyl%L?!tm zk;4xa)=2=FslSelK>X_$jXT3dULt6O{l(G!OR{dV%cQ*+hK1W<FK0b20;+hvNiZ!? z^csLwaW38IL$0Y`{;8MMl?A^O65qS%ZaAEL`khZ!7j|z!Pqv9A0d~(y&-N=F*ax%! z#(smWYt%c&W~$eQPi%p>LSV?{@rXKGNrQU;Ei}1Yog{%O1#+>U$6%i^5KkkpbiA<@ z^Kd7MzUd17?0i3QA=zgsB7pet_w*iq6B@VKe`Ccv0W)KTyIgmTXi0=7Hm^msf(}m< zB!$U+5D~%mBQFdIz~5K*G)PIwYwfNf%dXc`RCVvQx)n50fTNtv%M%twnMx4gew8p^ z$|fCK*F%7Gi3@5F?%5`Lxpq3QA}&cbg*Zc<?V)RzWdbfaSML6T2$9BmK8zq(>s`rv z`^sur<EL;0d8jLp<#z{@htK8Xoi)F`y~ou}5#JCO9rMqnyoi6_32j)C@`7tM9|Ld0 zpSS|8ulrm#vetd_SR|cF-OVSyRK8R00<e({-YUUCGDfzFgK^VbI%2l#8090b4ot3L zqc3V1b(^vyR1Jh2aK?8^`ZSt0r9<ChE?@gFAv0@n?%1#tZFjswZ|^<~KL6TYQ*-`< zX?iejk7Ub-9Auz6Ckz0k%Pc1R{JqHzOfMfW+!Q#RxoX~<Id8wdyl|L=4GGv}TeS#D zf^B@ZTV8IpP8^{slRfo(>%`+jz%@{#pC0~ZPBH_s%eGuaEsSS#wVr=~i^UBAHlBOz ztuPmwaZb6d*0`%56K|G+%F1?lBgS^}Ho(b?cImK?QH_=XCigEB4f(nnvFKZAn~tfV z=ZMwhNZM3oKAo|}hOMFUb;&zPO4*R_dmX{8zX=MNkofo^7vyXg+Y~F8#0syMb}nC& zuS8<*$^99@Jy6@EFF+|(c>W%-n&}~KqA}Tf8uJ73pqboLlls+;(R;8<T(R&MfWM2S zmT8_vrjNs90HUwQi0Ulv)H8YSPtE?A23(xMXGe$eFuy7A_t&6T6}5|dT_#L%FvfNi z%WsO`ujO~xapi4iIDdZhT=iB;F$iR~4ji)y6tX_PEd>7o_nQG?B80SgLtQW9+s-60 z$qMGuu+XdP?TYKVpozYg1Th9aCjWS1VIoD;lj83paSl+gtKRLgBJs8WXjmtQ`Z}IT z`n9TU-@8ag3frc`*0If7zuP-la8HY7m%E5(G9`TrG*Kp*3tF*5*f5-f5y@Eb#NJ_T zJwZ$~74|}J2ISsj<Q~4(D&E(`<STRh0Ua7!akBPwB)(%lNy&5J-H5!K=bCp7BNM9S zv0UJvz@@&Q_kx$HUtwSbOUdzHhpklhnZ1H;HI49vDlmotKgGAtIC`RM!y|SoVDS~T zxrf&clh-9(AOj7M!I96kFgDJ{%YqbJOMq8<!^a-lF~fi5Nu|l|*VT>gDJMroDg9nL zgVUhnmn89Dl<v`yu>4tievcg!-&9%o)iAEr9-Ags8RyVKEjU!(ac#zEsSFWuiL@Mq zR7EbHc&>hog^Ta`>=3t|oIdqFfA`>HJ>JSkPcn^o4PoqlsVP=S%~8i~I?4qGJE`&x z*!rW9E0;3Or}R3{lNS?jBo<CiS{8#!i@hekxL-H<4feGRV;e3rDi4$%Dx&sPS?&(N zH3i=`eLOqt?alVduJe%RHZCWO(tl|-687O^S63{Aiz#@Kfh1Kn<Yc{Ib)w8Fp4!{d z&o}flqL?eHl;c%r&ByY9`4n}}wYc}X>P7%?kAYQWNa%J^VV*>GW0#}1O5^(T>76c? zG>BVxnA?=?(P*(yC~H`X*Q7kv!3=d9nKb;__h~UrWRlNq>*KvKAqAM<?=%(|XyTf$ zzcVlh{u1!G;SJdf0LPVi=_6)L@OxpvElqRI@RjxLOT9!Ppdh7PhXSMBBH{rnX65%; z9u1H}foA)U3KGRhbKg2PawqfLG-k9cHuc<1_VhN}%l8RHgE{)SoPhFVsjj|iQ*|0w z;htV;ok+yRGFJr(JTqVLHHe0?tY*%e*fprs*luLe3ff!AF<(P7xvf?WdM1vrq9d;y zKmVkm_TikZn5~8w#5EOU^|rpPWbLA48FNuPCOCFx(578m#;qdbU7AD5Nt-9ZbzzPz zN@Id4*}=e)@7xoI5@t+pp(h?v(0H5Ox*2i~?j=?aF^+vk-2f=LbxS~cfA|UklFa1K zEL*>gI{hT=sz!ALYbu1($SV(y?C)hWxN4p;as<!KBR-5K4f}Zhg0IjR>z&vit|k{T z>ouJ&sD;no$qZOtP@dNbpA`vI{?Wq(aVJ-weYe<dF?J6M^V-uyjp;96KRZm0(Rx6~ zwDyt8GEQXB{BOl+Rf`t7;Q*C9Lykh$Mq>worD|f2ROa<hpT4>hr&t>$2DOW5LseAe zvmVR054o#6EJ+vn;A54q=czkMbNT7yysv$659$MUTp?Q7<&2b){r<$mdw+bpYt*WX zcfs}go9x0}Gy(F!Zn#^Y10o#NlFW2l$ryRGQ)YsT)5m)uML+(`NZEO)hv>d3?o zly;_LdhmftCQcnBd5ZKoiDDDI!f|;|u04nYO6KZ{aej@!hf_SDQSgD1-+j9nx%N{D zr4=u^>yxrVXx_kYB9}W&%V`$Ye(*L{!}r)$gV&df(U-14{J!OF8@rU(o>r|tn7`NE z4s!4ivGqJ(QvBdf|B}J?)wh|r&#})HP;ljjpX?TI?}mdg=5KAjn#R`D)D^E5tx76X zA<S~z2lCBJySuW#d&g;_8nkfw5SLv_lo6^=@KPXhgqe_3Yie86D>o21YJ^q~r9w*? zh7aX>&}M%xnAKW)h$oKAsOL;;ZCOy^&(BT0Is}~TcmVkLn2{CSfu0>_X#_!1rakeZ zG%_J0ejp4hLK1ffUK{wX4PLi$T2tgLt6Q|rI}%JOg2?ko8(${?(WpO*LO9;-2NrU7 zN09S@<yBGLXrGkx*xNkx&C5-l&$(>N1FDtZs<?|uKfupsXpKBlM+X|KWSgQ`d=Dv| zJ?+<g(7tZymVHDhaz1oq9h$(xSI}=`pJs%uHR3?~a^KaaM1$roMy84+#oO);EH0NZ zz>(}7bOuie(!s4ynu|JwN$wJ4!W87AViiJu!(^AG1#MalO&X)isZ;1;2AY4b(BNwx z3F>kDKDwhm$_H+3VU!{Ah!&Kr-~BdGcXhR<K6Y%nG_T&hn1Cl^jGFcn>{ZGsZXi2- z7fxV5!g#``YEP$IKZe$8ZS1j`k?<>7H7U5fz|d3?O(S*rhjk~pC-*HK0n6;6os7Q+ z770W!Id?$WM0JP_@7krAAAb-tR@l;^;6b;j)Dn}t_5(&cp?=}nTJWe24gCd(3qy@% zR43XFrH+>hdpY4xw0JT6C0wWdVrL@;wNt~ma1R=<k#EWN0U`0oUO}7}iccEm%}8~e zwf}<++8%7{t8jU#rqfY5oJ<Vh^f1N-R3+Ao*!p1gEvU|&LUR`<5au~Tfms!lotk-q zY$!C@TzARXvpMJ~DB6*&Yq|$*O43Jl<pJL>$NoT-+%rWrUoCacfJqRlAYT=b5RZ8x zvX&E6v44B{uR?U93acF~nbSuW8=l!YuKLr^6>ryn3T}ImGi3AV16?x0{+`hzf=pT4 z9KwO{q`@!s4$C7<-soBhXsW;A$Yto{)0%gqE|ifp@qyhE$#g0e)r4uVh3WO?(+S&! zu!|vuL@1x=B#{Xd3zVLY&h}zaQj0=RpCs`G=mEBvIiZNu-xxyrOZXtpt3NNUt-~F2 zls%{SQy{--5)Dy=%dsCdQxGDmsI$4sG=o8m*rSi(kTMZwOkQutd}+3<&!Tsr#a=k6 zP@zre0k$vH=%4L67-!;c35e7utl?&v3W|DMi@mMxAO%V7ktl!fr(z$GASPzeG6~3l zHg&D7#LM84T>KVvrj<q<!>NSw@wD=_>5H1gw9j4nuT=L~WJp8-xRp>7w?Wx4Poa{H zvT7h2Qo+P3#Hk;suC8)k)#%VoEy5Vu1*KtP?GMkIXdU@dk2?4C6;$wFnAaTZae3lR zP7`Dx16>HQ(x|IhMc<EP_#oflXX#8`HRd#2jZhuZ;l}G!eSugd@3(n)8&tQ{fN?j1 zb**MY-l+>z_VgXbVg&C_OwC1ZJ+Ya3?~#{B&yRV9t|gBl02K}7O45UWL_khQGF^Wy z0fNtN0hG)S`WXxq9>=<!1a<X+eCewpOJ>)<P`==x+CL5`<OKidI~QGkvPMVf5KsCe zY+#JlgYXmRxySyCvmomu{jW=NbKw278jtb2d3T{)uUC*)C)y=_(<pkrR~6b^^)ZcP zMC_(0cG6Zbt5&|mBLFK~p>^Zl;&jqN`_k-Jr{yEv`x@^32yITMAiRDX-W&2n(EGp4 zAQ(a9tF^0IbZ1ZAVC6B1D7G^}ixt{k*Cn^vXP0kvn%8Y-^ksOy{{H&y{i9aJUr2eU z#bjpeoz^!L@Z;LL{UZqDlv$|F_s+>O4?s~Lb<@-kB<<>7G%LzdL^(-_6d}g!6hU^e z$kE5q37y}*-BWt=h8eS!?_S_D)FU)1-~M~nxt^;S5qsnGt@{6zlNoeXNzUwMx5K~8 zw}w+zluR7(K*@#*?m~6&vD!#8Lcupi?W#Ul4}I~cdx$I~U>ztBubJ|aZ@&)cgK7xc zKYlVXw74)4?^?3^`$v0NVB=cn42{{tuX+xo#-S8YHe9F<5tdL)|007K^swW#9ZA+X zv??>xQ#!~t1rc>Y=9v9U3m0nOsOK3ciS<Lq=g?R|tBIikT}h@Ch<9w){P?r|x!gOh z**jm6!l9O?x<lchiYO%6;^$vCJ5;q{k&F(ACg~3s{>}x;C#^JuDU%6-)BDkPr7*uV zv6P(?_=qI(=MOdLE1@%u6h*((v<D_a1q#nh+u8y@EiISlX+q;$l!?;wR`SlDH<s*m zrl+6lo2=E1y>B4Nf+ZE}QhBGcDWcMFut$J9D(59qu!p()b3cQn#i|OHzI}oYXr^E` z1d-%{(nJNCqoM)@!orD{e~LmVhZgN2OQEP`M_7dDm`y5+kb~1hesHg@2(?-;ROMDY zkQwZ*X$iGE9Doxb3vpP7!uLBH+atFbLiX-sn-zcG1xSbKr9ciLEa0V>wWXttD5j<h zGfBrcmZsf<;tk5=plsR{n3!t1?AZBw(8ek|=I5KP{tT2VDtu$qh6`ke12Q0?So8T{ z`RU{jSD)pWd_WqW&Ojx$%)*GouxH6y*fw?<VlD;-Aj>t^ZEm14OWR={Z1r>t>u*&u z-gI4@C8i@(I5`h%XF43A7)PjC^~P*8iHUAj{DF}3mVq?(u2fAqcj`6&{B&=8uU(=j zT<WPO1{WON9hH-2jzYC0wY4PSw_gYPjWiL9>ihsD#!ZN1+(HV9+%PW)h4k+N3JNY= z$EJeU^l2uE?vRRu-w^WG)9{1m%|#+d#=SM(j<vdiFthX4feee&Ut#S_7Y=J3cpgSE z$`#5k6$z>+4x)K}t~p$2A3atU?D2>Yw07m6w@Z{zGh<fh1|T4{sju@-=+I*}w((dt z9)evWyoi@;`YXpd=F(}f;xN>9QPTw?;7lnPia(;5VhsXM2ewwZ!;k$JmwL`O_~0N{ z_f|pto}33HX)x^0Z{5G}{GmPEpH90_ljs-qxmR&giv_&Az3>u&Kbl{~Q-}EWDMYLi z8Y>y>#)WayxK#jWV>2uhTzQRQk2XO?8@ue^SGRvWcx=QS<-C5tG=2R&c$=xBCaS41 zH8VM7+3FP|N=u|kmmN9-ZmnuumU39Mp95wSr^2*4a$X};Tp9KL6l(#ojwQtyv=N;f zy&OQ6FK=dKYBJ&%B4)&I>EoUNNp{htl4Yed*{0P0fN=K}i@|mBdr+83{{z5}NuwJg zuLB~259HI%nbRQO{k|iyS6tM`wpH(%#h_-F_?7gzY7ukn9UfKd6q*9VeU2zo;>U~? ziU+YPqYCdq+c`l(HI?OX&`cuouJpVi4z|qlPCXr_>|5AIGH^+kD(mY>&PbM53eu3I z7PPX84DTEA)SGF8w<^^;Q+pF+!IYGy-!QO(RXWM_wy{myyGkfLz$qe;9s~3YLxIR+ zQX$r7Q2dp|f#3F?sMIyVye#JbSSIz{3A!ZgJkV4{29$p0`%N2}<eIae3(Q^jC(ne~ zSlNX`&NE$U+T_}0+CyWMi&(fo71)d!8^zo`f?MYCW(;iL4HRT6qLiX?l#%)lsHwIb zNC5P0wAxMy176Cx8<7VU)F5puP&&TN@@lVSH4-!R6;jO*jC7?f<19cF9Gjy~h79!g zq@e*zd2~c7G1hg;r|<nvqSgw3*8_U6Cnw9!#u!R0lG|KYEYq-_w3g(FQey^d#dZ7! znGGCC1K^yH@$8|tkl+i!EExB0;V=k80P=P7g&(2o7LrXztwo}gL6RS+I8$Ip*xvP! z&=c2GU5QA?;|*+@{JIm++P^E3A*-N@3VV%M4mu%*JDUq;V<V4diz#H6?&~~_4zz88 z;nPjSmq`!Lwkguyu>xaWYL7P;B_wn(kF!DjK_!;8V_93o^_67&z&}4{?XWfR>Y3Cd zP+b=Y?d|5<c7#sdW-HIH+|oo5!8Ng#;FvP0xnI0@LZ~42QKJ)iRlJgZ-kCUcj;%hB zU`>d*B&R=|cK>`W=^Sd75`ogCP=RpGoG6V-_6`ek+;Tg7UGMdpL(0wbA)%Ha<{c|b z0I8E6Xq4S`-#;T*{{_;gKZ~9Sz$b5aF{RLlI+|{P)$CoIGlRi4@g>DI6~*waU#q?| z5oY~)6@!87{Hy7(YgD4v#g##bB8rm20#*2Ga8dG7(Ht6^!+>O5U{!LWu|)w?BGh|a z<J(%V`LbX`Crka|&-*X8PGjwA<eDGXzRj=2z63yoP1^23Y4DLK?N-F{8|3IqM41p} z1higdt#-^Ld#@G|iJn=2H==V9F#36>g0}X^trybw<3ST~N~kwCZxeKq-~udAz1w%N zy5V?&YNgrlwns-H5_x#ASxDSdsO!MdVRPDE7BKP>RF6LdkD|%&I8F@%aa}T7ozu_5 z9?oB1U7n!g##}BcnDY?Nwhlz%KzP`iB}|n)69JTmCO5A8JbICO%o<Sgk~FHYCxXV2 zr0N`Fh`NQ{uY9byuL!#3awyTq6IPWptoWO;e{pH~`+jX3d}X6$k3+WNvO<`Pv=cyx z4Ff5P?Q_}P9*5K9JOF^Pv9wuTOeW;hcRGPCH&rU~)5cj0YeeTngqVB-ZqcU5%H>tz zKmj2aIGV+%wkUC}?QnWbQl`c`sfCQZkPDdG1rT_NIDaU!G~H-(eYLHA`Sl|+<`p(p zyj#*#B#R<~Dp;Fo%3nq0#B34K*`kUuL%n`ehd(PNSDT>In9`gzVG<)v(NiKBv)cZ$ zoUklDr{>#vBPA9`t%_y*znX8y3^?Y7B?<iePQQ6Oi}&e+O|9azsSi>$X;VbC8*ae9 zpGtcy5s~dk{qr3(NrZ9>=%MsPxF5A+<+OJbLv1(&{$OCS;OIussfYzTYhU^69%x|C zTh~%|<+UW)&WE^^ZP!MO*gJ#vHk)x3M`46wE2UBM7XEMMa%*d6Ms-v#i$0e@D=!9O zt-`j+nkQJgbvuve>8!G;MK>>TYWIVqusk*X6eEA0pf&)TL8iq!<z%{$+&Q&$P+Wa| z+>c7ROn_O<sEWZ4>%zDZBN6QWEiFoa#hJ_4u?&?^;q@QznvR8ZiK{E1QxSL<Ao5+; z!FTVEM9nAjehFZ`<=L6X5KbygLk^=jF(NRzUF)g#_jI<;2Rn?tc@Q!sIvFVK-eJQM z?o#pUHnr-nWVN^(XS$C76j4B9-%9bL{D)qR5}j^9=K<($`#i%z25B3i%2HyAOjbGC zI3A~*+hvuSWrD^oR8CIRdU@}Q#1{a*N?R{mzp(B(M7c+QbjmFA@?LwN7@zHJ(GoT^ z@xaQgdg-&vNClr6%KS^f;d`~W)B^M7CKfifElUoz*!G#ow%OW-P@ZTXz`N3Z(5b8R zkz-JnQkkkGk!8%pXJcm8<XBm_Svdh4c>bL#XhXM3+^Q}DvNkof{-PxaZ1c84Fqez$ za0p(qr@d;h5Md$adrXomFKbhgwFCVPB4^p}W9`9K4psUy+9_P36Y3CM`lp@(Rr8wu zrzPpK6EamQpB^b!y^BM}-8MFH%~96380Luw)Hl|<WD5@0@bX(a2wK1b=1%mi$aXJx zze_GNULOCMyB}#S=l^y6AoFh3p1w`jvaJsS_U!Nqdm(M_py$0JEj-abrV-H4wRNcI zw1R={`SIqdZ=3wd+)~%V*9d6PNMT%@fSMYg%UETOOb>tu#?IF@EE1|+Ywr&1duTCz z#Arh3zW)fr&d=5#{?OCXuo>HM-LSLvdGzTNX`9_(bVYQNp!&A_MmOz{Wsh3QtGqZ5 zsH6(@?Iv-h_GG{Y`Zw{?#3^DdzmBg8G3*yT%)K@W3N=lEJ;~-AD$2>y7+0gqJ<F}< z6>ABM&qg6yj(5fsuF=IRTvvZqx7YZZd=^75ekx6-SDcuh>!|h}g3&VPq33r)&mRGS zNhlu;v*ePBnemy8&Aq^*Ao2h(>Cw-=t0v#jLU4eDBs}!!(=p1<V0-5Z3R*j1inLY; z`!hC%x%}e3I%D#nh>E&87w|EoOq@gw)bWn$A>DL8F6#2WEe`9i<knTYaL@+#rSWt# zyKmPPJTk~SI1Y*WG6(#M%z}-es(sNP(SI;UQQ`4z!nzg!J^TK&*uk4D1e-uTOfy9t zuVq@%eSP{Gfya_1+z>5yCV<YCotCLk-Zb&(I@-##^gfQu#1BGCpG}U<j25-~ulAPU zljpt7vuz6=Kdh~9uUi)X>Bp9@fAqRYc2Vj`h`m4gJLk`!bH9CpKAh!cGzuMf93Z;{ z--|r1Y^td_oU1p(pclNSHC*+Vr4G7I4T3Hnn?OsLeVx@gwQFvfELn{19>SEILh8AN za*%nms_YndO%!y;U{8K7;%fPpCw(d;{##1c6f*6+#0b-r8$|7Fiq!q_!CB@rf-VL2 z3L8;%F!^KiQ{5u~Bm!Cl|Nb1QFM7%z5?buACMpYf%A=B<szE$tE;X$Sc(3B?GV73O znVwlwBvSvw&9XgYXhtI`zuj*IwYN~CCr}_{dmIQRKRT98?Y0qIT2*4)uwh(^j!t^k z0^BrfiWS>CJ6k0FX@@uD*nZfJwjE-#)?eB}GLVgZdk$-wnVORRy)GVf35N)5j7~9K zY|nmihQ-BA59b)>W;(0SFoMP>Qhek(;ji1RD)4}uUDYN_WT^>}zeFjsib*FkU5xz| z-XJ4TB3ZC0)K^Xzf`OD_@tA?!U~%EyTwWdT$e$07Gi&kwUbbTI05xT~x1kQGay`h~ zJk8;Pe(P^Dr-;=<$S@K`$Xv^MXbZLT;;x$K)F3Po2U&9I&S+RWmb($_Wr`T%>19qD ze@x>s@u#NFwK41$iB9L*A|}q_w{3OasP&Chc(!%2*C!xQXV<zJem*)kv++#obF(4! zqC9xjllUr=MgeoZJthk6O^v_Rfr(0ww`Te_vxVP2l9+(rLi@wR7vgL4W;{_Bm<k0+ z?<<7$7mp=59aB?^z6XE+3YD!-k`Fl54LcuGX9=i8R8ZZGwl?6SbfNCp1yHNVKvyGB z{LYU>V(2`G)6SV-`pi(-YHvnQK3@*c50q(-QH)l6SrC;zxWbiXW|RF_<)X}57MGd& z7lg8;4df}1R&3-Lbqlled+<_}9V}T}&1s9;5L{FQWsBee>Ja-R4W)-Mny5H{wokd! z-3bQ^v2c$!O6@LPG2zRR*XKR)ffy7p<m#86@AC7>H6<x)#(+iTV9zy*(7jhZZv(~+ zm=)fKuidf33ma>lxs^S%I5)L0e{wNh5E*g3il|+*%QQC~eQPD-{6(v0ix#i*8~5-m zT58%@IsFsK6S>R}Z{E4f?JGW{!Frq**esr>%ed^LL&yBGy!2Ag2}Ksfo6jzuhUY=5 z7pO^gdtupPPcm78->%swMmL*dvhp*6RQcNYNk}r_x4;UQdnNXwieb+@KaG!o(vYXh zg6yysKVkev&L&&_^Wz@(L;q|OUnxIie^Fy&q(aF2)h}mP1B3RVy`T^|TLf(r{#3=Y z5eNwga}MNIC<bl7L0nA7Lk!_%lY1zz6fE>?&s)fMspb0ojX&fh%u}MS2r!_@7x#Ku zuK`h-LdOGr<E)cm{pKg;6|O7mfQ{A`=XmJQZl*>Pqc`yKyWviztZxs=KIBP%K~tmj z_Pm{qcO@{)d+TN6WGZ4!9-2P<62Wm7>y-&JVAncw9Rk@=zOwkEg}&T%2z8NYs+ux4 zpxWvhTYnzC)2~~mZs|XGrALOh%5<`KrH&Q}tB!3QSBJppyV!GiN55$@(ODkX*Qtj_ zpXm|d_(50f&rGN$ig5+s=4rkUuJ+riDp-5X>hYdza>N-rx6xC<N;vXakjtAi@h5-+ z<?;$Db#`!LWrmX37pFAYFDx2c{@n0qXA@mJWReA~8`X`6IayBG5S7@=ixOhH{F<D` zuuAK<JTo97;C(}s@N1qntUF@)45EqH$7R!1c*<8d`*LQsYos(ZFNc9EN2ESqs|MiW zw8^D6O+zKP^mQ*@C)-y{0v>i=+aCE%pxZV@#l~m%i2;t2S<}pJ>tk>-YH$A{m_9Cg z6CR5YZVm^NtL_&@#8zRimx+Ue&gd8*B#HKjzT7~d;(?5IF^yyyXQhP+KR8R`BNeCk zN2nuI^lsNt*>a8ikKkXv?BFkyMzcA(6aDbo5yR#2qm4@=n1Ok@P%iJJOMfGOG_sZk z5dYSsxKfbipNfjr5U+%Ymk6U<988($B^!`{&PKi52X%4a%=eW+{@{GCov}T5F4|*9 zs!-ojTkBEp+JO{;F_!E3WEU(r!Acpr>Psak&{-2jysA2&lFf8<{_XijPkbQ+V@b{= z5BFHx@OKq5<w+!2wbAf%yVe}IH&jrPI`<ioiS1%UP&)oFusa*cLl+h{?<j&WwZ(be zpt?R#B<R=ZxPU@#g<v7;j0<-PBJfYrW7<f1OMinu7P-G}bU=q3jm?CF^z<q!fbIW~ zJ33jY1bx*iu{znRtrN7a44<E!Ufl6(_5-WiZKxGWQ4K88@q!I>k&Hk~Hd}UT8@K+( zyXOVC(ZLhZlocat{K;a;cH4W$Vv_AG!7C@D2FY%5Gp-vMJks|WN4E<u0JkD&))_Uq z_(VPvS^Lv;0<?RDExe~ktk0$@eG4zHW^ii1Hjz$$ea(y3;sP5mkPXSnMI4@sFK=;~ zFk?M{oHTBhY&^}(aRI@v7gUOmZXDPV2!nlnr+qnu71LI~;lamSndv1zM7=U7TWG8} z28#J;#K&Luw(V+N!|F2eBq=-m@<S*JeTS{VEmV`ig5X87st6qoDxX`}7OHXTrKu6| z3k=d&p=hJ$>e<Vd)#5-0kjfNX#Am~se1PZMKM8f_PAonU)dA|OEyOB5m)<aR&vg6g z=Q%z8mfUYqpGeY;%ip`lp9q})T0u9ZTcEDCd=P;_t}1;|c01(8dwh>`Ifoi}qcu_0 zDb566{uVyjvmifRH7hdiLG9|QXTLpz@|!8TtWEi8?<M4#@R^219L=u9Cetqm21?rq zHr*TJ{L@ku+<8U7@B<&d_yZ`%^yHjTYsdX{TbD#z4EkBuxqqxU+Ms^<pmj)m6GYy& z6R>z%wbia*XWbewlkw5nL;Pd=B<J|6<B63bsbL{-oW%D8`SdBFeB(C%@wUha*i=zI zh|7ricObT7NrAk=M0$eh!2ItT(w!f&gY%{b=-~OHgb@{YOoEwF{}gM&_4I@g-IlkY z@vT&@&_h-zrcfHvSV=SxE<YsblzEz8`E*chvU2KN|I)(O7ro2m2f5@1IlmKf5Q9P> zTz5Ugj73Y-#Db|*Wyg!2O4fc^y}}S2b^d&wjz(|5AlAuO-U<h+TZ3v=uA_oxuC%oJ zMJbAY=1`*s{g2;=NBB=m9qO3Dj03>jhsGhxs*>{cO)Wdm%-2s=@&uykHwMJh_X#)= z+Cr`*!FYaTSz9R&Z}PDIM^H78M@P9{5&l5IM!3BffM`+{t#g4ynaQO=#<oPws0D1t zcs8EI&GDKny~KM!Uqx=+>^JFy-ezLvAtKuP{X(gvHInM%%(^{6O?jUUN@bolcmh4S z#Tf83m`j`Q%?LS}l$;H)wjz;%%fQYG>N1m%%OPf@Swj2?8IjBmPMR1V74zj^Je5p? z*wFht*7JeFwiiM@t!nUvy!sb}4a(I(8!3p?Ig1izu$|N06oM3()4Mo(Dky}K1%ncG ztur>QF|BlQc3xZGF!Ncu=z;nNdVAYkUPh5|ZIKrdfizsuY)8b$;OxFtKiIgp7W(;) zyHVd8qwK6YghY7xo3)0vxyjOa0*w@yt(K>&OHP%JJoJ1av8_d-O>k}v)zBDZ>)96c zb2#tR({-p}4!}_H-AEo9HCKj@6r_uQqBTH$d?JJ*L3NMt>S3iB=djU2Vw$?lEFqIh zS1Rhv$b+p8Vj6nOg{9-;!#iY!!{qlVhY62t$=NU~v0PfL;6n1=y_Hl1gz(bmC_f-O zAk><yiTD&=UxD7QpDyXs7qVz`J{x|LG>LZ#yxNgbOOw^`bp4>WqqlG^GyUBao5heX zXmEre<)3<o_@8c-jp^6sG&%&eV4H&c;K&a^;Q^9+U~EOMgVy}3x&DUFd~^F}LZKAB z?VYd`1ilSh(6VM^=XsV`K-<o)Oyt$UubwKGk-_CJ&gjOfrrjFf{RX@K-C!SEN;^!% zEAj#^PB)3?1TM*0`68TQ=Bi-oE1eYL)5R|Gcf4|2)o&oWEpqx53tN8D`1wgq1we8} zATa1+cfwh=T(AC9LKa7at2+<%9x)#nuf~yQ#JJ49@!8IvBPmc5b*zFc{C<k)8ocZ| z)z}ES{v6PIV6i2`3ciCa#g66-<hY8i+HFu@-1Ly1bg)7_xn+D;doRZxvJEUU_(Nl9 zxN@Oo_XjQ!WsRPdX8cy*vmZSh3<cqE#y%Vg*)3)^-A6yoyh|ZC5mLoEXI-&ZfB5zV z(an5lMbqptG^*{EtE(9ro352;j0spacyCjQTEtjwSTzW>;jyJ5+|~A-^qaKX*VgNf zfq~v(DzK*}&kQo1(qN1BjSFKJ{vLgwdnU6-bZ49gj@;1p_5R#o4zVq-Gx=J_t1E1k zCXPK_76dXg!({TAVNj<R8%0UL)25Jj%Wp=OgmM-Y%2tKp<WU|dt>5=8P@RgV#c#=T z%b0~JNXua}A=gFgDzW-GBRilkr2HlJ1N^`FJzeI~{v4+z{CGFWEtYP+NVHc@ud&lo zUBhVXUsq3lHuF?l9!fsDtH*`DvJ5Zv*q)#>N8L?<IAE_0Jlh2$9YakNexZ092zmkP zyCi`hX6Uej+fPD6Lw%Reb|%V(FldEc)OL?3p_HGA>E_w%ZD^Ze`3s(wmyLpA*Dc}o zAt91Qvoc}EP#89Q{FXlV<IiaA)dKkHa=XedjwsvZLkc3^U0a7NU--M0R0ex1^S$_& zEV^6zqMg<Dn)^#RvO4Y{+P#TiiGd1JZB_2iW;luvgb`4T)!sE@`(;<9%369Vf;1QK z=tn20FIy0xp1=vBp&lxK%58+W;UVZ%(t9EaQ}Rrh=VN9v5sc<p*M065Yk`rIto7+p zu#I3v<S;p%&mcK-@RBqu^!$?X!z#I~zhZ0ct<*Kf9J(A#-~!E10g3(Ea_d%A4ICD< zS7=es|Hz6x`@v5ZShd!N_WJ5*XB{>3{&>~PKitV`CNB}G_yg7Un-tRHiXzQQ;%}!- z*Xr7XHn(@G^nB<EhhB+5Zfkt_6(P$ANQc2{YsNg<ul>7bbjY%tgmO7WE7x4|zVzo( zN_&>~H>Q;7w9*JKzcgaTG-J(!=uy_VVSs$<`B3-ZqO5G~(A3o2;=&|fw|zeWN7L9Y zoUzT93Pk=hvWvi#?Dgm6K4!2zr4u_iVDe><y5r=KT~c99H6lN~WaIY-8{iO~+RYmk zlQ|kwv6-?Xv>6HVZ>LSxYT83L2dnrJefYMv8GCo%q`{huIMJC9h=JaYox*guVW47> zg}8-_@qo^21VwNhUfLWb%TYJBD2{E!JTOPivxtC`g-eQ$uo=J#VN=(NUpnC|knuC( zTrNyOi=N34Rcx6oh|&BEd9#L6lPi9?K%do-ntLm@qJC%}1Fx`)JghQ>$%z_ueH6=| zKx00EH0tR0^F3ETK#318T~eT3--FzyKRA&}H?;ABFEf1w;jKqvxk$krc*yr@Y@9H2 zoJAj7hZa~ctF9f+DoM!rnQ7}rJdzW3sG0q#!Gg*UAKI5q*r~^H&-MGMkl2THAH<*2 z`d%7r?Oqwl=%AP!S@Wb0VN=?PIuch<PlW_1R|7kndgSZug?QU+&t7Qxg&kv*D&iy0 zYccCJ__AQeeDQ@+V;Z7}4XOKm7E-kttAkRt`Eu{=Mm7WAN4zl1CXErF+$3}~om?k* zsPKM+#MSh3uU11bHdFJ*AB8vn?soKMY9J+qajBxFr<JOno~V}w7a?S2>KcE9g@?eL z(VfGU{FSO&*<S*rHL^h;I<cP4<gxh`#|qbKY$vXL#hqt&@evkZbKcW<A)3(^tA|c0 z=ih0f2O*lcY-AuXc}NAW_a~(Y^1@3gW-yC<)HZsL!B@Yit;KD>H-F&60k*>!_{f!A z0{b_Ceug(~uZ$j2bQHfe{Pu}MEVMJ@!&Vwei|R-U4V3bMYhHIA?|L1u9zA?`sKt#@ zSH4dOYl3deEMafJqqS&{!`eBz2i!D|j79+uc;{aVn(_APHrOirOVyLGj8`~q-!y%c zP-;}73R+0Ulb(JBN59aFkVlIY^7PBP$>yk>CHajKjS>8|3lYioCm#jZjb(y@p~>^R z)nftH=1|ezFQ=Z@2yn|PqTPod^VKN>*4X3i>5uIXwoC;0T+fNOFid8a@n#S!p%T<a za=zOTbme}UyJWx0&<)4-=YFO`CVn8g+GshRG6+^;|Bk>0=Q0G53#+1>w1Yn{+g!YD zf^P`^5U{x#Kz`)Rv_z*vr29<$yoQlU_SzXF5)jU4DqnjG;w}s0>JUnA{<pC8AB9HV zu8c5`-PWl>RZx?JgV)WQJkH)bO<%#*VKHef@BN0vGJ;vbNgp3imU+yVI_Q!RgR*a; zt9SH4K*Aw@-Mi4_-B|MJeYZ7v<4x47LEt8rlOb<{Z;L2D_!p*4enx@Zs_o*;TxmRR znE(C|ohGpd-H_=gO_WyxQh&IX(`D>Ef37i4Uxouzbp6qwQ!aeHyMoKo02pA)Re$9G z=L~&SX@=5MMF|wno4R^qkFwQJZeKe}s?BZXuCc#aJvE0_u?w&0CLmz^$qF|qwM@T_ zHnzi#{o_?T4G43#2;BTOBoSBy`~E556tyMFD^(_J*_h!x=r`OU1RfRBhgNkC*bL;< z^VGYqSK2i(_(~stbKawE2xL!0SbaiheOt6)>xW-%4d5%7UK`7U6PdvetZH3&QxKwB z)r2<Rur2cjtOt3?Z(v#dE(L*+j6n;mc9Zl5oA!%bzP__&C?l($2AO3(*OXv&COZ`d zVJ=bRqen+l=tbY9$e%MWJExje*vaZLUqe(vWrw*9;SnS?AE|FWc=OfOupga8LS!SS z?cQL~o3HlvSk&~QdB4In65&4uWK#XJRybRm(g6ZfKozbom%yHFl4IubHtsCq7=XA@ zp;G3G`TdVj{Gmm;uP3fgk-E$y3oF9^@h(7_e=uu!#4BGNQuQ{g80D-Y!7L-F)8KM; z+bJSsoSBmqV{ULNt9~5456aLEoh4Tnf&5yNKZ?Z&BygO-CI=KEmo7JW7Jl^<xoqTU zb-nosw*OGs!v(&LqNXcPQ7un!9Ln(e7$>Oq;DjGfeJ@>>(vH)6TF>rkalR`#dHLB~ z3PMdB<FvWq!%_256J`1+3){g&b*wGBahd4ZC-C;ZLMa#r(4|4t6;WmHKf!W$wTyK2 zyY};Qc!ry?EyKOZ{lNl8UQ7o@8P!?+KWO?2wkW&rYZVZY2I*8vx+R8^?oR10fgy+P z?oI)b4gtx5p}SEKsTo2_YG?)+;+^OBzus?f&b{}&W39FK;h@WeM#Xon4k9i^pYCei z*X<>_r%WeUTWu)Zd)MVW5cxsBJq&ma|Aj-F)1ZzGPzq8|z@n=8<MGM~9Svk_h&Rv2 zO_8xb!TV+>*};2p$@EV$Jijd@xZBg>EC=JDiK9b({Htl?PCecjjED_{w@qs<1uwM- z^bq1{k*^<vwVX-m%-3$`08YF`)oF`}Xz*P<;wsl)FYYkcHAVRyJVd4ifQzoQHN;8f z;nMf8B({^nN{v+%-;tK(vLTGiP}7^RE%B*2CI=GFW-IH#UDS58aUg@A43qcR%TR}- z$g#pddxeXu@W()Fx7!|*dPbQFO9}>Uk<rX*r3kh$@wceS$$s!oeHQ!q2bcSA)%)J* zlQ4i?21`b)AGK>22Tk<-!8vC>P0iNE+eg=ufVU}8@Jm81xaFUfZ2hyxZA@;VsQuwA zL?uAt*5?}9l&EUs!?`bFeLdbCsk>^e={Y;#!Cjiir<@9~=K9j<_0-gGLf5_1h@!Jy z0-MGPZ)hfA@M=fTKN2CJ>EJEQLzZ0_c2+iyNKZ$J(j<S}l;Q6djBPG))OaERpo1k~ z8paM1o4pNPoj>tlcxmGL+3(3pp0*exrml-6lx&pVcY4O!L}Ck5wDM+~Rt%<s%5W>~ z=DvLYy!`Tw%^nez^DpNQ>OR}lTg@SqQUj`IPnfo{0DiI`%JQ@sK{ir?&NIbLH_c4u zYsj75&{kNXiH93gJE2QaKAwWhXhH3Dr;OlgV)1T`7MGWRbD5zRHc={sXq!s}bwD21 z4rkyLO^j`N_eZ@{$ZAB(hYc?TaU;~!tOF%mL)6zDVE^^CH@<XUS*3|}F#Y|B;$Pf9 zNNTK|<7F_9mIvZyQG;+qNW}EMb`iGd<k|phv|qttm?UXl^9#l3$hmtX`DtLxR4L~j zCtGHDOOxz$-bDq+8e}^G(kpPeumaNuaQiqnjdcfot=PI+&_66WG)^k!(lq{^nQW!@ zy8aC;{C$um1z#N&r7jc3w#4g^H1p<$kKUHRh?<zXxHJ=#l!E|+^!wz#k8tCBp^d31 zW_1@}oO0f<*H!4m<4nDBbo2BQAQprMFEZO(omn$zfUJ36`=DU|Yf;RXPzUyZgIxE# zM7?`xX)f)caQQAcO^03VpafPL1i1P((Z(a4S&x<pQakGY^l{!E8Df}gP_6BJ53`fa zh)o(l0Z)EyXJ_2UblfEW?9)+`shwSAcya$_!ZfRR{npKNww2Vt#W~eDLk12%bU|B0 z@u^Nd_Y38?`7WNq#Fam_z8EFfYt$LQDc-!a)e-2PT7pQU7F{SN?nrnL6<zT1B%9=t ze;VbH^BBHYE0Az=^549EC9S01f$tx|N4xEjgXUN`$_xTizxo`Q6VSJLaO~dYH@~{} zNNQS3`?MPT^zot)qCw><R#km_c%DVISij!342OZwHrCdYQs~+w0<NL1As6R*8usmI zFbw)%$Sv+35`Jh=pGz2fi3dv(ZUo+oYk+e6;COpm_u~n7NWRLV-HwA%IYHiAkI`mA z-Ne@O<ojd@R!!{lg*P>8pHiW=PM5Je5-iPu0sBP-3Ux3;_`7yy52gwpLB#dN>?1VD z>2~0Xp8~D&C$>jrDwM(tU^Sy}!RK(o;kflhkYoIckCr`|g+WFV+k<Y=lIqMp35-pn z^WI<z*5bI1d<Viz2Sh6_9v^t)TwY#*d=Oo}w-wbL4{Pfh4W``>NVgn(TCtw3c^US_ zBhwZeg`ICMBw5DFlOM9PUF+(Wx@^X;NhW<<p^YK4aE6#3NxyU5@82JbF;k55jm^7) zS7ER{^1g3-SUqxI(^cSjCQ&Rj(PrKI5+T3Z{Euf?=Px-7WZ&^K+0^7IOD`{JpuYnN zJ{LEr;!uQV*2oU$+1IKF<@tQL*Id=HMsST}+IZ}_a8tMCTsO}qyGfb}+ApZiWQJMu zF`>8#&b&-s<1n7v9j-9(j0qytz;~$OSkM~kj%EDR&SamoU`0jG_a@s-lctZ`PsD_S zb`L=7G|0;gH~j{v-lryB$&lf?Wj&*esT$R8QJEOc>J}&Uf|5B~d&(w$937Uty_tG8 z4ii279`B$lGRXDA&AR!FS*QQj<KS*G*@-{WWWX?_a$YSP7ptY(-&jzNy=8=VvBU%P za$6#n?DF3cyw?x8SqbUQ6B(WIh+^ckX3m(>B^-GR`cr46+SAu!4ku+qP)wwIueh|G zG+ccX^&rBvdOa4@2rqAjdtc;*gg|d}_NR85b+c8oF!WY!Cp_ZW6+C9YCK<g(AEVhW z8cJj!`_?#R=VlnKVb`(sQZu+u&i`Ylm>cAdR??;0s}(+`!Qyj#XLt5(`qnR@Qlr(z zKA$gBK5MQ{+ekPoN-w+d3xSFtD@8^;Z*61S7=!)p&jhxMZATJMQjYokMNab{o+mwY z8ehO3h!cBmGaryQgjyXMdN}mUuXxKZWpouO*6*Q^lh^ZnuaxEcI`y4kFECBnbgJ=F zF_esO1eO2D@JXyMCki>!JhQz>(g4myBl-Fyt~IyU9w`g(YG)SQn(+nWm*X(Kr_Qs> zt&>00A5dJZspGhmw~uXys?kSQ_RP;-9mcXlb45zFSgFW>K4Fiy0#&5rZ?HeOt)*-y z?`12!>qxMVIGbi2yucG$Up;XOc&ym`BPscKzc<2(R90T($~719OV|4To0XzF{R68z znH_b$MV20i!8l*+>&Wza%{a}uoy2dM-%=kqYZB*_GA8Y3>Zc~n+p3&adxD-GE@oFk z9vzR5sL6r8ieE?6@(p3G5<eT5;Sl;nD29o2J4MXAi(AM8a(r?pYe6LA5~p(5fKSZX zkHpTzLr6XysXGFG*L$}jl+)>C3{!-UFOm=~LQ$<I;NfOt;v~L_t<s%|;xlVaGkYdU zivfJM%7cvCkeok&Ig1Iko#6S_coa{2qUsOe<SyFu^qQb9Djt?x1Y&LJq|N#J!=^di zW=uaXweB@8H(6do&&M;8@+kb7Dy=CZ(mAy}cbw{#hq<)B)v&jd>sc7JDW?{u*K1=8 z&MhHvjMbY-qj_y@v+V41wrvV_XN_CD##tmEeRpRH?HkOl-o>Q<1niqLqz7~{@b`Nl zW{@fbbD>l(&3cbJJRWxQy&;uq3f?|Rd_Ep~z#Y?6h+KcxL>B2M$B(PU1LQe7F5vU4 z;TcpxZd$-{=HW)e22yx94ABt3x4IR&Jve7=p)f6Xu%)Q!npgH(XivrBPBMD)e~zsJ zuM4wumqdIw?s0Gp-toeod6h@P_g3feyvNa%_eNwEU|LkqHCn3BkWACeY2FjkA5Nmf zoMT&+#5Pl<n;-crm#s~AJe$4aHJ6k~9-MmcR&%o+8fG5FpJzFx%*ajRFJNm!Ua9)S zq4iK=*?oIrCt$W1bai=+*pd*$>pyvMR+LBYRpnxFh3Do5!Y{J7+t@u0X>)n<xUSP? zs?_teW74TFBW2x}v$;+FRfOUDleqqIYr#lO*mwAoa9if)go7=s%(g_HAlLLN@OEPu zB*=+pTmWf{YH-;-lUC$>7cIZJ72hcOK?%)K^SCzX5%Fs^ptfgBFH5atilVA-YYb;X zj$#61G~0%U$w(kr)_^aXxR|UIZ<4XsY)!HQZA)Cyx35!Pea{7U$CM3G`5Em?p!03l zb5G8hVAB<*UWweP1+|~tBL@*=IUJ%q)^~h@6q+&>cY`z;?kAtSbP3V}DE9vzv#5fk zNKiD?&Qb|7GI38go4%JlE4uD;bA`hoyikGLtm~rX*BWf~*el}{LQs6x@Rw7LjMB`D zcnkM#OEGD6e(}Wj^mKWz_^A=N`L0zt27zT-|BbY|YS=mx!pBou_S%$f>|m9nQ~q6M zxgk8!T?u}tVqO^H+3nY7hZ5<R9wxPxUerA7rd$<g2TK&Q7pP(pahJzIf9b{Va8T4S zW%Q@i5f#3QlcbO&Knd?YZr3w;Jk@mEwhqRTS*h1She;NsPWuOY{Z>uaPZ43<!F&`S zGzywz<6Hr6<g-7pQt*$yYUSK6oYNW;Kf>!@z~z^rq8O3V@sIwsV`FsgxmafmdAf14 zFA@~I!o^9wiS1oieX)}akr6fd4-WNI8AZf|uydIeWjV%XKt<A^EW9If*o%cv=SPRm zNoarc-yyPPC%cU}KniNBwJK_DC(iA;h$&lT7R!#(x=kd${C+oTF%JtmN?ezkC*b8# zV{!N=VtU#wT^8OGXA$}2USMf}=vzk=1tMWTv{kNtkK2w3<Jb;)R03O3gFJ?117waA z>Tp8PE3>|#DIWR!Kh_=d{>k$w{JYscr@;(zeA$tZ#CcuR^E_wN+57Bw+SwZKqtC0g z_DoDsMfLX4O|NeM2l)2*B-5_9h|$YdBG@#22RCgoRE@k#sy2`69S8-MqSV@#k0^F1 z=#Lw!;nFX<DO6oqAmV!DYK0cI9&>YvK>|<DUmmk~l4EBBlIriO2FynOHlpO}`JB@h z%KWDZC;>N0BPA;ZU+r;q^;g+0+Gxc2&{;rcM@a8&(-YEndqRwy?fp_;vm)k~o@U+3 zVJl^a&yC<oREL9iXDHpB(TjW)W<6dNYU_zPCkJ1&!N|CckB=KLsa@My9B{>|Uw*(C zHwD*&p+)uZ9+jL!c6K3+30}MRYHSr8q#mQSjnP?vnht{*b5E!B@nm)lq)RxIw~RM~ zzI9n<2j1i()_Zz1g@U(t-SX5JI*e1H?(Epf+?%<8v;d=*5hySfYs~cB3(GtgOk$dB z!T~%KGXM)T??uT4X6Ehd8%#Q^uRmkUkp0YzmS2&(a;CJjqTr{}f|t?+y4gilmkOsr z&l>4D2T5x9&R@r~A%cUe9!DhI)~^B715uhBAc+B|w?AMi1Joxy!)WgK@9;Yx7Z%n{ zfBem;)={NkV{qlFAgj#<qoy77ISf6|FBr1`DNgXV<YesGWEWKJ1A?h`+7RjGf6S?N zCl;-*jDQlqLLE2|x2D6mJ<b|F$DKNzu#?;hKL?xoJ~p(U+)+`&PnOOWpdIB#d7m;r zMKAFCE?~S3wz2}s0c7FjrNyLL4hn+U-Lfw{?7KYnz<(1trnjr_(&xMtg2ir+mM?lF z+9zooPOmUF#!vO!eEx!)hYr=##<C6@dTCLZ;&S4?U6yvG6{k~$@^GR{<U#DVnMBBy zTR^Z|_YD|-6dE%Y)D`STF%Y{wWBo}CMQ+Tla)~{-9$U`0?95lCA6azF(<6rdlMnJI zi!=^<_;3Dk0k<a(j<YDj!yb=(trYl{OXvGRAONkTBjEl4E6FZT*+^E$*H_#Kv8=k) zGj8{MWRZ871(CKbF8eSrM+!Ee?w1vfvpW6ENqwhXs9kQmG{CBpRBLe3<9~czAk?i0 zH&Z084e{6*bCw?7W${{;BJvBl1UsIro$O9=ZIOQ`(!kcK{<g)07_Y1TyjElGb3f;` zTP#sa)3B)Jtbp@LF3|u!-H*eKTK0lpF`Tr$cG`4%v?ZQZOtzz|R<6?YPus@FOJ*<~ zudwW6t1ha;ygyS-$4PvF0>fT8vy+YQ`x&=yeN>f&7Y&WWj<WzoTWKIX-xa`Gk(js3 z&V+`&Dz_GEt3dh3cFHfWkvVt+1L=lrRPyjN{a7ws|H`JJ-uE=@bxRw=Qm(E)yI(}> z9q{qBVqmEBKHlAAu+Tg_&{jGVe7x(15Ho|IE+ZFpzk>h${4p?4&W1N$=#^VC`oVok z(Fx8x30;sp5ne%=EMZ52eB$QiyCgIC(vkNxmuf<7{rBFUt?^=fAH(Zy+iZ;z6+Tov zUb6u6DI3XG1B)rrpbt!#+q5V~?Z0^dGE%`|^JFwW_293w52qh5u8%SIW^2bL1geBf zPU7=)vYNKrL>1x6Q0xIv_8q?=pJ)ehWMd+kn0P0J(2u`kJxWQVLXQ0W-jg}UUBSoj z!^I$*6f9JCOzP!*OX`)S3;%viHkw>0NU>=1zLjl6cH6A~hjrsZqX+j#5AM9?gUVxt z;=<d?_CN6Yt3@bkA|=+6f>w*==aIZ!gF=h&;i~^<7kmvU?DM@>*c@NphX`l}CdwWt zRr_jh>IV*fuVE(xDLDLNOhm|S7xIXrw!Fn(yY1t5feqJvaIFW*=jwH{-6#6|#_o3N zscWGz{Qz>)YT2CU8OpYXV2k~FQ%Pty^7keXnXNGJ{bx_Bp-hf-lFO^$D(J7_vaR7m z&pl^0wi<q2N)l^b-f}iEi2COpv#|U6ZI0zSB}va)5LL36g!e2vf)cU;k}PcxyzKP5 zNr~NFL+Nk57p%Wr9gDXm_Xc-#m^Hg_8KleP@efRPzl%VvB`ZfqDXbZHQ*k^%n3IJk zhu-4BHc!_DTi9eAGn!OJl;hp1!&$YNBxW78$|B{GWbRo3j;90iOv*FDwjPdpJ1q9I zzq<n#PiX9SjyW@UI(mcW{cfEeP#RnQg<-Z40)>v|?9U^01wW1ot|Z0ow@!*EA+;6L zI`i?VW^i)8xGqJwk3!Jss`K|N$t8U<m%PEO-JiQSFSm<0P;lovdW6e3J&47ThT02q zQx8&io?c%#L}=vMXz_s!Ao;bL?pblE5R2>A=doT!6*ek-y1VyKJ#)JI<ME8^=P{#& z4jrZ4e->c&wMggXITs@*wJ$qn`NO$_^Vu{e0XLg*5Z~_Pm224r=&<jBW+9CwU6or% z@cw?QTSFbkl0Zx|YAYW~Zg2CI*iePnZ?%o)v!frw6z3qe2SUHx`aOb2`@C9{2NL1% z8WU>X^H1b#wUubA0w*g@|DRE(?6B_FX00d|3<m9Mh4H~yV^yU{q0E<{{L5ZLi86ks zG=N!aeL9DULA`#qU5&EcY*o$LshrF4`pFtD*hFTBR{!kBkHDn|;SJzJ(8;=>vyYvv zgI?Xo=})@8jjoB?$wGQ?7@DxI3s-*6(PZoT`qQ!c;uWb7oO6D}__(W8FmzhN{}aPT zh)hB3&lJ=wWDB0a5|T=Eg-c8%WCNOxacJMH2xrQ}fm1~^XiV^Z(u<F!_N0@M{ABS4 z_3_aP2Swvqm)af<v$NY#^0AMqhG5rf6paL9M}$2GZ8hh_^oZvPg)pVRVGwH8t&XqP z<X42-Du4O>>z+lq#8qM?F(%QM?JBQ(U=Kt%;9urzS*m=wh@)pzu_9*MWUIB1%wPGP z+x%MCbYP4-#i3V;6BIM~aH_R+ha1quC&;Fra$S(0WI7FV_OZmzv~6UHn$HRPvHKHd z-Hw`@1%Gy-H7;2F!?tlou}n<0@<QWa1r6Pdtk04{AtLB&Nq0j@=?)Y%b)lg@WeUjP z%p1zId7IL_!}bw=pe>8uk>W`}%_Bw+8h^!(=pUNsu3YuoyUr*C^c3^jYE?984`<Gw z6EP*tjGX&UbWcgj0UOuZ1I;eRO^vck1ng^)^8e~7B;PMX@16SIPDN~WZxJenLg|F` z-Jk^--}OfI;Gg|oI<tOh3w%0|388^J)K?7aEyC-aJ(rKvjoAm740~p18CG5mWcU!e z^t(BG|8Bo7bwVaR6?Y?mZhsFDK^MJWJZG0@Jx^GXMcuQ@h%epi4?S4f0%}dT<ks}5 zk)(~^xjKGIzj|8|olfgSANEtGnRmmLWHr|*(OoA;4Xb2HzuWmcYd(ci+vnPT_M#L1 zu{lNlW`VmYQ1D@UF!n(A$=n0~>a3%(L>@~51_C@Ij*0kPQ}tC86SaBwK2e1bivJOe zoO=lhJ{p)!FAPJ{&B`0+yM}Z=76fX`SiO|4nMD@7{u&?Zy(EYO&9e}#tfsv|2QD`2 z7a}vZ@}J9CQoPVfzd2w^VDCY~Wi?VB7Mw$#Eo_HnF#TFiO+DF<4sbj9nPVPooZHK$ z2h1V2C3*!?t}zk?9WNf@uZzv!wk$~4c_+z;j2MQEZXN$rnAL3ry$NgrWSg8Wj7=o} z@OcJWbcosWMgnJV1A1K_zX!rs{Iq6F!w2|6cd4PaBH&6nxm&%4nNAO&MgalzBAWsH zl!gUH`nADQoTQ_R#De{Hv=f>xJ+&)jRToQ{&_L9rM|zu8l$<la%L+xHty(}K`r?`X zLeirdrclq(Fi-A6NppzxX#e#!=4^2a#{FAe402rC*SDeCSO`rX<!A7eyCVSTUI64{ z#J4fi%O2lHlO^yogKs*<^UqPu&A11YZ%*uT;;*mEkKU#wvwRneTS~{@R&=d1n#o$V z#N&ca-uz9C_!}AOEqLJ0(DE&B$b}w&5m|dZ3bQ|fH%N3zYw;R<<4CO%0Z$S@nZ&@v zL_ltG?%kq@fH~O=@xXm0Jh&tAF*K)Ke3y0u!{!|jvjFc-CMCw4`e|oEAz?9{&tj=H z@Yf7Y#BHpy`Zy5&3rHpcst_W<Y`@5T8Et#I;JL>p<O*F~`i&~$oN1v!nyfJan(v<> zEX;eiYE3cYcQXeqpR<NRo@2f+Fv_#j3f|ePajSpOeLDS1V|*;Ga7+_0?NSEV;N{#~ zpg5?%I1snz{265LB2<g12%D)zY}Nv4z<kiK6-Zk?vW;ClB8RSx`tw@(ogG#Q_m}ca zmEVj~9jY<fj;-2KKBVx_qexwJMB)?Ux-_p%?~O1f!s|6Os6pP6LaR+xegm)a!#PrV zuqa0|7}Qy%8MA?R=!&-4LjOnWmQ0o6m%t`hdUjIV=o{h$OnNDxL7K1Q$B)%N{wCz- zXOE_s4}}K2?*Q%{bi_mgE1h%t&-otEP`YB8F9v1rel$_^7bg2#-lvjf@I|Uzk(ZUV z#qv4je7<#km}O}%mS}!xZw9D;fd$`BwQX6%dHsdred;YNPE#*h500;#*952!jsn!f z@$FkONPTxNJ80}@;KGQl&cQp3;+YJ#9Y19v0SroHbmT_z4`9w5aCRYEsl;&hF;^cC zzMmF<toZ;$CO`NfiC@Am(U%>gASo36Z(b#(L><Y596cNezcrPcn84}-2{;qs;X?AO zVXq=DBGu5~zv7K_`Q){6mxy11>cq^oYJPo2sggPuk<b(TLFM819D{oFiZzyG(?g8m z0R(+P7C*ZK5SxB-7Kn*oB<}t|`&nFf4ev6+XSl4YI<osY)8@VYzee=1|9pSRW(4t< zD4k39w#EKBK~|@uZp<Wgn8if(w>q%@&Z7nEYg4*+Ig<s%S(!|?fz9Y*liHfFK3!!( zu{s`|1)nqwf@8gr%#R3fOpq`j;gbuuktBN?Fw;?~ru^IS`ix^7a}{)N(?0K670vew z5h^KmCwlpBb8P0jg6+w7#xmPT)wr8_B0nE2yy5=B`W4ZwmG8XA1;VcqHt@=(a&oeA zf;`T*N!pRDk$`+-Y7#u`GIDs=vTez|h0<WqY!Smnyv6TVeslW^*(D^nppVWLUbC1L z@s}ZrSzvT^N9^n}S*5q*OsICGEMLkaF5XH=woff*GhHv&rd+pE`!%iNW|=N}#mg6} zqZ>;?v`}8(tZ<tgC%^fl>Tj86bo*2svOe}V=hn1P&lz#G@aG_kHmhtD=uIPOM+pxD zz8ZMAn%saHCv!^x7=v;m0B>OK$^ky1S7L-vUcu7e?Npc`486OviB`#{z?n_oqnK*A z05oDh3P2CR=XeW^p@;6xMm%)0MnHUNa879!2_mDPsd%Med}%VNC@D{MJlA2yfRNC? zcKsx0u_LS>y;(linn?_f?^_@zun|QA;pj8Xoz7eP7Fq1Fwu$gsjRiZR_XkCOyx*aQ z&NEWN*_#JD(7-Xzq2^);W3?0sBP7j-!>zc@q8vx?<oF!EWZlhX46%%iSuwszzA!k! z?pSdGO2a$ICjd3tD>4CVxSHx!&EcI6Q&LyNgacl_k540240F67&ctCoyZRL~`Ah%3 z@VOLP?;8`0$Sq|YgXa}nr@VpmgKwekdC5|y%&3U{sm@+OwU_$;yrM?&Hf(AX`W71T zcuJ@7FpZ1&qkB|tQ_iSzeH022=8#FNCF7hsM&9j(Jx_5HqlAxh-WEtriRS?|bRGT} zy?;~nafZg4Lo8EQjrm<1<%}Mu(r4Qui{2lJ+!kwku}7)<P_$<ti&ZRi5YcshY^Szw zZ!9&`o<s5aLSR|Jut^~sbt1JLBTNL#<DE08CMf`0sXScMUJx3$kU)BHeGFJxKZyn^ zMCd*hZK_WZz;zgrkw8qF#qEuv;I~ZxUmH3?O$kiIB^G<mX04r)gml#426au?Gn(v8 zwN#q(9}N2$u`I5+J=||-75?^j!#{)uNZ@VM6Aqe=lu0V5E`3%c!35Ro+B6Nnp&Yyc zj;a`e1HNt0DnEzHWDEvzV}f!yBh>7fE2`u0L7nbE377IXr59x%kzY=Yh0oHf|4EqP zkY>r)zX+6)d}&VoCON&Z5zLS!%TVk|Q=>zya=m#<BI{{)n|rdp{?P#TnM6J%G=x2p zl{e74$crKrApY?~C;*Kx`AD-m0_lqm=P_lzzt8L49D%WInMrFaD`rtMFX<}2*WEJs z`a2kwCM)VsKwS8`n(;Z5>>p~jgX!Gx;s0v^{;Xqe(poviFu62p-}@x;#$xruTJ29Z zZ!ZKG&D8fgw)mDpg!g%w5%IBcH?*9u+>ayYR4=a${R4v2-Rj7j%s<-nzS{<9pe&;D z3XWQVGe{8;Krqlv*iSP%i3i^L1zc<davR5PtmT*j4I*eJ`^780UZ+2R2$!wT#rL4| z%&!o0IDO(nYC;DI(E)>30KI7O$g)JL{>*OF+Y3jq3zfD3@wZJZG;qET!o&u^#veY? zj?A}_@4Lk%$AvUwk9>wM9pa_~P{En#D2OdXF~@B^c+4&!enTCNaRIm|e+RS#NkHA^ zfh^6~@H<1G&<n8rI}Qd?Y=q3kUjN*yNL`G3w~7re8FT%>F!R(8%A#x5(~)i|B~wqC zk7mQ^Fsk~G0`}SOo@P33zIbXBkb@gSfpq@a@?g)u;rtxX;yc&hu$sA(in3?$gQMtx z+ky1>?ttJV43JiOKz!vgb_^l3FyNZ@i+LSm+(H$ZXa=xYlee~Q$LYAo&uYvpV$6(T zJ7A~-`!D~0A948whz=7WS(I$v05K|micind%4Mr*!_oZ{X`6|y!iIp0tgY|u^cPBE z>f~?2$57w11uOj_Joe~a&uDC~y*M;awzgf$F&bdJ$nyfkC5&1jW}ju5L(M)-3FZ$R z{kh?t$r(Xp2V59PXL}3PdhIBjfAZfC`T|_3m+#PD?T#^Pb6=S@FU!XE%%=TqMF2+N z-hIH-O+Xs}(XPB73BcDV`Kl=fmZXB1Eo#{=v5xBN<npnj5=daBk<w2F7zU8eZgZyC zQ0zND?=(6*j||pDv7YpWXufN}N!CXLOqy0`G;($_aD%d$qs}#|7Q2rE(#ZkW-;V0r z5<=Z6QP8gqa4+7Zf)4(9iYA13vuHnPjFp$yra{i8f#lqD`>*xz`nqM$k<zdW-<e>> zw-%T8I};zkF@}418;|bcKun>yxL}6yn?Hu&T7FCfdb4edYEeLb2n{%ziz$2G6Tr(9 z#e-G<VF6zi<C%RM%nxIsfh&HD>o1b=3<1(~e^45NG0z9^kLN2%y#4F)e%}5d^U9}B z9Ntccfe@}$EC0209zzI5lmj?2Zs?g!r6rjH<s}IycLGa9hWLYBS-=-qK(vH_UD+@P zD;qUG2o@U8uVZx&dSX|QSwCg=5$*GJktZ|a(cX(oJZ=%o7jYZ3py}Uz;+#~<9cz?e z4WDS$`(d>xSKf_BMRdfo1`R<HRAdN8ZY!Uj+WtV-R3Gp-AWYNz^zH@ycbr!#?1`qF zVaMm|xtSM|*SGYKBK(ai=(5Bi7B=&FD{ypY^)A#Eoe7s=o3*h=2IBK)CxQ$*k$~)H z&<qdEc&?2WqNo5T*MJNLup0r~4^{9(IB|g~Gub5ywaKLpBaFaN>pq&98is^`p7Yt% zp&qbOFE_^r=&05v&l<G3Iusxj<HUmpg?YJ9ytc1cR(S)*$|Xu}yhNXeqDfb1DVA(& zyRPAIvd*WGzj?UjqZfO}%DzjX$`WN&S)WXla&$jif-q9Uwx?yJf*;-TQ`m?MFrJ2C zowEt97NW!5+W-v&sX^}pNzxwJ6ns*C4hOKDojBai*f=(Zi*Q;`dsiprpX3^eSP@q+ z&`^$l8~xT6UP9q3cQ~4#%HL+!W}v0)3rWo~T&@!nmR@juLd`|deye?aT_erhvE7h* zbV*;4`(JwK!y-)u`k*s>?Z_nD4#y!5qWQ)z%Pxj{vnPM#=@{OI!6ME^h0Q*i4i<fZ z;H89{6a`G_BJvo!STspIP}SOOn$;^1(`R0RJnwhC3}TOG9_mK%vXZHdFH%10yishq zCHgM?Elb7QBTpZ1Y-XS^wAoSPC1_Uz5AIYH8E9{(WA!VVt!;~(;{rSK;G_B&V#(Yg zkoomYeB>!nWmKs_!6h1tA?Ge;1rQ>~LphjM=mY-}f>2-RWx+$l$!UCQ*n3LkU6wW9 zvw2}7L=V0Q;h)-5Xehp^pZVNiRg{VKn%oi{K@;;9y6+DsfQM!N@k|kv7W@EJT6sA^ zuG&Z%u@z4Hnpg|4miINmpPBZE*~u(Cnr!Ju+(yymM^!BKRNRgFav+HlugsS}ikH5; zZPmBJFIBMEf1X>&+!C3F$yPo~KX@OPo#_C4FPQm8Z#jv0o9Sm(daM}QA6=PEWqE?- zQwo1J-4_^vhK@hCs|XGqR4Hn<B`Ba7cYye?obf-Ze=sZDAYx4r>x-cD8;J0exbvoK zY&ZnY8HT(TdINv?o)=nbEOEy%+b>?SHO%}bIsXN@4~B+Ebv9lP8d-|;Dcfts*Et@H zQJKMCXL928=(R|dC$P(GrEZ(%0vj{4Wt2iQZ;41gsg<VI>}U(#NS$ul;K5l}xfqd5 zQa%P?ytM8aewrt)sgMu_-%6e^SqM3&Yo+(+dmCox_Qp&w^OvKMXE~?VS8mi$E$=^k z<8?cLHaedrO+#iiAVOhCHwqnyfA*61SSlj-cU-?I-EHS`gN$#qY$4VZ8QFzwz6dmf zJSmS28p2gnSql8=>Mw2grttpk%@&XCWnyWXWSnrg+H(i41x=GBn)&xUr-pJfYz*t{ zS$kQ#ds(b&#@~HGSJX<kCUG9{x~5z0E24=;fnF!0j|-!of9mrg!QO;FJDdJ`PyF?+ zwKE8obtEO8kTbju@0z=9)+d{NG1=sIk~QPk-f{|S3P()5X`XnmM8U)!<4tde4hj;J z!)Rq5RS9GQ+j$ri{K6z9sSEOU<S~gEQ$MUxBpzDd+U@Nfbp31<moJgl{x9P>2yG<D z0v!$&Ib-gpS%5_Y*YoVa3HDZ$Tm3;_gro)C!Jg}{F1%mO5)|I3rj8hU?gBNm^u~rZ z>lJ`Pjlg0P-c9vJV2TvAhl#=&`lC(0^vL$qSc#HBdb9EwNOI({Q~D8JBa)69QoVhl z+8X(@eoQEPx_*xP#s(H+{@JYCx&0C1R)cpBhM$Hd^-?bf{@t5Rp?kPrEG<Z(fdWq< zH7B6MYghKwv)h{Q#T*Y^9-A+ZztreuUZW}9hWCCiLN4lIoYa3i*Uy;KPTv8<ch#~S z;HTh%WW+3aU9TR^7#RV_Q2X8W<uO$;@F<T_T)+5vy-lR8EDBNq3Uvtr@uT~m_QQ~1 za=5BXp5vftF%Q(bUW5?3@AcwEY4bzmGM~|#?2<wNO?Dh2A@@i<%Goo~{Y>~B<O_+K zkMxAPs&XZMzi?c7W~O$tKFRj?A_n##N%QtVS2-j1R`>DB0{xREgR`wowbA-O<5ghQ zvIo?E4_b(s(@AG~eB66i_2hIS<uYq=9Pzk<3^IUUoAt~Gl^o72U(aOh?hfMa`4mZ< zkCz1HcN=Gi7>R_yoT4^^q)kJ!($W_gIdH!-?i1kNX#bN{Z9`!_mL3m3K2a#cHm@cQ zP}ViIs%5%yj0@SgYy;e4esjQ4^T|m)dH2NiEl~RQ<V4nm@A~+{Mo6vmpMI`;3>&C- zWF0-o4LK5N3m#bJ-Jq443hfHLGF!@PnnxAFz+C1{yanI<8)$5hnVev?1&`v9?ilX} z628G@zL@1)$Olp=v6$IN4e|Y|2`T)wtj`PESS4FZR^@tncU+|^UZW1(7cej0dXt); zStNQ5rq{y;S?e?~pTBeXt(?7WFo}>oOSSd~`QG;N$Cl{_=n+aM7rgLz<Bc3+Pe8OT z^E<hx7{RQM;Xm*Y4l&5`g)8V0xho}kmq!CadJ#5%yvvY81}a2W`#<fK0~Qh_Zlx^W zr&rm{YLo6(zh*jkQ7vlzO-r%mlJ@Vboh~uz4?0C^fq$Q>{NgbY<7a%!`NR#RDJzaJ zR4}oXLbaTf?~sCsHxEe0+ml~Fjm&hdm^2gcXc^1J?XOx}7AS9jCaM-iI)Y=!!Obcm z?{|Q73ONLna0zro!?vN(3t%O2xtzKGUsU!nkh396nk^!L2b<}Q{od&qr5F<Ux6-{w zpc=)P$&+WpH%N>0_3QVNCimGJq`7AuZXr@FjIrZn!6K2XVocX-UNh#U;^yWyYqq_r zkDy91d2Ac;8t{5L?=HD}-2AY2k(@?W$iTfCV{R0qP$EB4#~^{7x@doWGYx;1$!_8P za;5Omr*igyy1i5Wd;KEmB74GN)bdr!vR&<Qhi6Uq4sfdjMiy)W+MdsX=#$l%ax7$R zJMQf`?(I5aU!W47IMc!)Y2W4hZUqLyvMJA2mMyu>(#;|QGiGDYiLUrkT^F*nAo@Vu zv_k!s5VFyAah-{f6imcFw%H8QXmu=k>$!{RZ~(xl{2BZ?-Is5ouYRD@(}e+4QYl`N z5#`H}^grz4Y!smnhXRP(qv94!;HIC!{H?Zu6z?T@{z1F<EZliFK2u;3W0t!0by&Z- z&qQa?zajK#Ti$ng>8tu<oQFJ`XpL8|s0=3~b9ZY(1l$y>TmRnZBF`W3gInDMxqtV) zS?CxSjlpHco^-aDX0QQ3m$Dwn_vhBPF31;pP>#_E$K-=Ngznqfr)CcmwurtUr5^*) z8GeFp=?k4+HK@XK>}EYP0>I;c3@#cUWRc|!4Z-cZd){=e#vk>%xqoF%&5=&e%@mch zk6Cj|gSk?EZWB6TrRJXVhap!hzJ)u{E<5f?xIEDcJ)%&>?13OVxVSqQw6h_>2?n56 zR%n{kmBnf=^}kAyBg2FrRQJ=^-^}Q}8?-E_wVC64=jQ!br+4wA37^Di@UO<To9N2D zvvG)NL;Lb|*}@t0D0mqj1d|Z^!z;GNdvthux6&Ov=GDIb7f<SAF<vMw4<Ou5Ar^J9 zCeiR$@H*%Qr$n<ebemGJLt(mzj2Ut90Wtp}rMZ92`|digkgP4R%UG}RnxWctljB&d z4<VK$rjev1NQ9Fvo}&A<$NB5Kz}fyn!jvQRAD(1L5JL70F@C=83Dls1K7XOFa-I!` z29H?=j6~TsJ%a~q=cZeAatXd4OJxEYG-r4ZVNI4*0}bnHQk5bB1^6;T001y9PXkQ= zgG)!n{&`c*Oj>3yw@yt$ZCh>cUC``p4B1Jt0Pgei<UH{$yA=Gfzh_2obAo;rKpgVt zrDE`C;w(Ft@oY;lim~Lo#5##`O@oPVs81cu-eZH&eDCMP#O98ut57QPva7zk(gkcu z<LE=u$(CUvwcw)HUpBQ>3l*w-f%YSR=B{vjORjs(!7@$e&uu`F4Gc}@pz@jCy^SJu za1II{08yg@D=~R(DdCTY25xd2>g>iFMJQy1CTh^iL?9gx)bR=)iI+wFtc}cUa|62L zXY1*{bG{s1Gh7^K{tz_yC>k&wp+zo=Kv%0zUB<<r%{BBXa9E~@EpT~zLGYc&oRsQ~ z$@8wsxS`<uWs=C0FfqloueRj$k6Ft|g@Vxqp5J~oTbK10tC<0luWLz_Gl#VoJ{$VT zv-W5CMW&-Ljhp9-L3apjknHv2skf}prx#BW<u}Of+Y?l4iU|+RWg}wGP|C*Iq@56e zx}mNW1)ODQ^+T_F2)AbI&^3Cm$5p7)QT-X&U>xEo`RniZ6RH>iP>k`HO;QE$G{pyz zK^Hvz5Bf5e#Gzo^l0eP(q;R`{rK3<c%wpzLcBuR$E=CbAB;w~-sZ`SN1$g@QpVRCD zT?3pyxPjZOUA7`WCTkL_Jn?-7!LzgXD0Cg5A>A}TBi{Nbj*5%9By8y;L%n3Yj+38s zn`D%%YHicYQPo-FYSA+=G9vWoqtx|LIADrvu_<fx*4sP}2#lw48PFZ;X1Tkw&>Pbv z7*WaH3KvQH=Ab%fH&OHk&Zwo_7ypTv<W1yXwk9l%6z~j<6`?*6hWYeoqucZsFuQ5^ zdT+1q$()*-%DQti!>dM>jBb+WG;_=S6UjE#Hu6n47~ktS+P-3l-Zd^`rP4%sGe#e& z%Wu30eIo$4w~LuQpgcSkb7_|B^k~@ZOQNgAci7YA9?85lq`;$2tW#x+cuSc{tYlqS zd_&Gag5ub3IZ<7-AjdL|)gIUN$=Tl%otY4g#%(wCd9q2?X9zvMeTCKbC!1z*T13=+ zSY1?rjR&1s*vVyIp|b!d9sEuGr<Sk&bZDU5Z{#8^<Uoy;UZqX-)bd8{C!0Sphr&$X ziuZ=0yovj2S^e7P`GM8`^)2^<fiUKs85K+?|9TkJj}>z-;nAsUi&}AL_)tGgb+SKx zq_gmm-^TqW>b2A$9IM@L(1kY4vXUeW(5c%u`=cNEY+iE=oeSTmco?sqcXpL}aJuc< zTy6cJSBFGzc5w2|+(KE|n;bT+ZU_JO^Rk0EkF*<j<7Q}MuK4RxHocpwKSB_yM^I1Y zd<QVviPB~*@ABL+fE<h@2Ul`(Yy}K%Br`oj{4Br)1v626VNtH(Om&Da&)>NnQLAk) zM(!eF79k2NG_wF|?$u*!JLAR$Qr91E!K;K&8tJBlP4xoTrOJszfSdq={%lO$oKdyT zJ|!HW`BPv+2>))iuvC9>(x(9u{PW!N5Z@U;GpmkuWb%TkybOJYJppb+{1&;21ByO+ zcKGGn15$PC<j2K-fviIqoZ-ug210J}hB%15KuGa?vl%qi6rK`N0}oE&evso1n)BGf zd~ecSg+9<tr}n46j|NwJha}H$aD%q_lHqOC&I<O0zy(u&*7<}+jtc;>aEoaGmuM9= z_gXSHj4?Bg8JU*pZ!6*101$+7Z#T#&`d|+HD8xtb<UEdD7S8ok=SbPb5WqjDDm+8< z6Qug_*kC-uc<sDX+EQ?YRtrL0p+;xZHGWxgbLZh=<tFi>ZuH<JbRybc>)24ECWcvc z?)klS6k>j5HNXeXXPmHEn)?n2rYzf}E&IVp4lBARtl?FDJl`-Q%i?5+1PHNe`%@(; z<uc@I8-03)K&aI8t_}8!Gm5p8E#hshxToumQ4G-FE~n^zX0iDs!U*ZS5noWA0^gPv zvPeo^Y(Qc5-;)hUEizoT{=6;r=CKI##VvR_0CXfK6zlmWBSc&;KYGTH^ZG*|KGGWV zD@Vk~gz1!<#~PTm+doKCuTR2m?M~E)pSD_wE_=>CYhCyddtZ8R-^6>O=eI?-#ZDek zV{0+FuJ*SxqKMqbpx0-J$p2-W4nwfB;x`j!;}H~YnMF5758WrMf$SKHa8PHX-cry6 zA3UVjG$5!?LbiAM#ZyVa8UnG7(Uuf_pj@g5#$n5pTIrf1ew8a!s~FtBOH364@x0${ zX5OnB=eP5?d#3b!`8(Q2m5?zg-G?g%Fh0|3P)3H<JD|O)c!=$v-a*xZ=bzqQX!haU zLx@iwQhX2*hxjuOK-;Z@LKVe9lj=52Crt}^<><(`ut%Rkn)Ghcv~Jq8?zObwCsY|Q zA(z6>2;_`ow{6-n1|8AG<033lxjtlwf@N+afqPDqRf_p1JS0T@rd63jne_ka6y|v6 zkNR^V=MU)<4T#5;^*zf?+KnjNbZmrTPZ9zAe!x;G3V^jypG9=4c)>K`*F2#@l7+mI zgo#-_mX7c6r`)WF1!v5={lFLk(h-Ovu=>Smz>sfKJ*K(FB5(Ls(d;lckhOS-40Xgq zEh6Pa?7K18{cS}t`vTd-<?HH?T>P53VMB@N8^W$%<@o%uH)m42ix?o{yiY~j_lW-p zkJDOa_g2+5E95m=m5ks&`;FxI&IHevj1ksN^yQWi`%T*FJ+p}z04pVNaS^jsTNR7# zOU9tGK#_`Xr{@TjMDvpejDGR4zCyJurRUHN_`iQOsn5;nQ-^W^htO7S6I^()oyx@e zsBS^FTX)-D)1Gp}tN=A%3c4z7@A6LbQjosGS_CQidGzNfLLek}(%qVS=DiwqcU+}n z3@0TmMu5XZUspTC%*S7zW5&1_6x6-TVtaN+lxJ5jD`fmlXYA5LRpTvqEAlzRrEon< z$(l5{8HJ;QOLuUM<?sK)Jc+`>bc`4>z9(XV2zAo2YRG~1wbHNcthDVYpdvkJV0PB7 zqX&%W1_bJHM9)ex_<fISMX){5=8Re<TU5Eh@7H-A67|}ghM?1oL4>-YnZQaov)j@( z?sKrQNn@h{1m@O?!TJ6gcYaCEv|1-B;BRf*I?3O-dIK~cw>M`n>n8I%_<7DmL$+4* zEzvY}T)oumTf8X%&k=bz;5vJNChdXHsxxT^srwKx_rHH6qi<hjApC9Z5KsX~#LJZT z73F9DM0A^};pHdXKSR0^?{Ptqo|*R<`e3vsWFKE1P=WQBJiq%BmmZn&q$CGVV9B!Q zgH$16rSweSU@39K^(7FLVr<&ullzTUpcJa$FIE#*ye;AB#8RUvn|ksLZZSHtTG+4( zn+1r8w<1svaTL_s3?jAF+>89%bThc;pI@kN_$ywwzk#P784xa05iC<3Nk0|A|HG8` z35CD+E7fI;>!X+e6a=mtMn5EL%ZG~?i$qYwK+?h>x-rb5`V()VxX5eTL+i~MRgd(Z zMjRo6w~jM~;y@`MVHT$nSv?M&teiRkcxR~)+mu@swNeRjg4_OUMjQ{iN)#EuH_lZi z#&<#*&}XF(2<mo1B<2<-DHOD2e!S?R*AO@Ow%bpW2a3IFe+|c3rV?&it=L%C$@uT5 z^+#7fd<|rqv?*V0r)yd+>LaWP)#8B`Ie{;pFqW|rzirkNS&GjCG3QG2cPT|81D3yG zjC3QDudYxmAm4Mu_9%3}^kq@uixK^AMGRV;C0<kpE)4*$!CwNWD+jprtLlR^`hS!5 zpgJ$%Lz}dGs}ZEe&#qsC&DsNs+5=9^J3$Wf4J)@)WRop&MBZ=FKvF&ozgICp*+(+3 z;0{KTZ$^77x&Lc2{ACAW<aBVww7J%Cw5%KR)9EOH2fU~q3tn~q?Dd%9?_oY~zq3xX zf@JSSucu#dnyroG0luoK&PjU|KcOSPIdj$Ua#{ddSbAKPQ^+vGj9e%_Xh*Htudm8w z(V7ho*i0T<OURWNIuH8vD8Br^B2(dPW5%Yr(Ps8FnD`s-*}mg9L!g4UfrVkT)y8AO zD>%^K{dcTVIdaIeO8o`sSFFw_Vi8bv_Jq!KniE+@^c8#C!lN(D*`udZgwO5@J=X(L zM4vA)?&kijiRYT0ZF`dRm5RcV+}K%ecu?0Xc=9hF#NkXDi=D>evaw{4M~l~WK2fzD zUMS><Gcq9ZC@J<R=|f2fiV;ESa4z5DL1j3gZ<U)~!S}62D|3M<URBxLpEQ5Cois>; z=NBlYmFh+M+`6mrt<rzUrMq+R$+3y>LhV@-Y*zH-4iWmO@u9ZEooSYydKTbICS6_e zSi9kiL61ZqM&oBIHUVQp=i&()u4q6yG~fyOV{?%2>0MuSVQ+21AMPP9Pm6)Xu)ZV? z=z8==Rg_POG~t(z^lI=w{qJZf2tq&v%1#LFb|ZxjTh>>VMi1MZqfAt2dA8T<Dh>m+ zlFfv!@FwmyCPzc2@iC)T(09e1H)zoz_TGJQZGf%@QQDN2&IURMlits(m^Q;lV$;Si zL5kO+Qr90}!UKC)4%T(3LQu%7c>XiED!%>7=FF_8dDae)<?K8P8%0csKVJ72W;)rc z2qf^pSlB^kw{0_i)~6`=1w1^s>_Z4e+byBT1i3pl3JesQOBB(xQHJl*=moeT5`DxT z=kLH<zo!d3PjX0fNxEvaEl_>tngf`jNmAB^E^!($HM(w!>OxQsqF&hm<bQoTpT$YM z+aJV2IaD@d1+G;z=>UFQDC%aREg2V$#8}kEMO2gE6|g~3b+Oo$c8yi#F60k`%OGwW zZ$eHHdKNz78C5nG-<Grp*#7-4S12T@uyZ!rW6d-;!5%7lUh|-YC`V#`ph5b=^Y1}f zuizx)W^w(t!v)xgSIY&_?<VDa@&wQROIf8@8#8KTdm6aVtsFXE(PXDd8*b>YA_t(V z+y>h-L^mNg!RZ`$MU~F~T&L`+!t5M00nBmO>#8&}ZQO+%$e6OYNjUr5aSjF(qx;*; zIq4>eKdS|w;sP)cy8J;_V9)Y*`^(5aT2V{<MqA&OhchWy={#hXJz;TrT!+<0{zbz; zEE{#h(7GX*-^PtH(#a-=dO728-9Gz&;pPn;d^2-EJd+%%(o6tH4+qp#R}Wx4Lpb^5 zck`g~KE}OfWVahFbg!pUe+CA0*lNI^Sr7PifR)=F_JIu7tK_KUC=9~0!W9WYJA-XC zC;C#kpk5w3B&}mltHHK;8S2d%88A%s8s#d^p+{&q(Az+__(9N*5DoLk|H83W{^pFI zp~Rnk%J^Tv^{5)@8vdf!ac!?cUFqqUDZukHg>PnthN5j>l*Gzjc$YciE#wWFaxIXm zcz0qHggpFJUEhgm_$1!{fnMP!x+AT?a}jCgNN-|pnUNulsHvA={2xutS@vIon~{#S z$Ga4V`Ao%J>DAc%Wbt}Gfh=o%xscSOA2&s||7WYq!9w<1strq63}elndd~fVjV}T5 zs;2NMh>zh-1<O({fCLR5Mlf#`Y^LCqUTLF@3AODc8ZbQD{4)>XT0VSf*6tVay<W2x z&5EX9e8~G#{?XKLMHe5l<1mgeNRrTx;zCwoYj-iBWm>Zi<nlSE3h?+dEp#31505<( zPu-u6NMo|O3+?OheC&RE@qcH+87P#TUi1BJLu2YD3=L8=NfD6T`Zpa4@b!>ztTX#@ z@fYL`m*2~E6eb7*sB+=B6T@uTp)z#?T{CN`7y}Pk!@Qb{4?8t3Dy)NFgh){drvUS7 z{*tZ9Q&Ij6^7sE5l9bEKBdgpNFJzmH4=pr;!Ut}8q^jyhb})4R|Fr<*P_6ePWXWSs z%!A!luo{>klB!E>hWA3Tae>CwGnyQXA7u!b>Z7U3%I2rqz;kph$-}cheN{qJu?cS% zmR~Krroso+BI;5NrqU?ZWdB1!Fl|okH)c*v|E*V2glM?@&mYo?BIgw;-5vLn--9uA zutC2B0v;9F7{AaX^|OLgOe)HF+{MQ}M+d}K|3N)rQCPF2*@-ylX9ks`^@;!9ReA=W z0oG!3S?5GfJ%d{I!T83QW%+<~&LF@+K(AmhL|cm&fg6dk`MVyCqji3||3$3$z95!R zq~>+s!v{3Pdz_vB0GS4Em~lYk_<{wUP)ej)QR6sCI86;Ix@6F>)^50x_QOQ}z}^2y z-qrsNc!qd)gd2g%2b^eWOvOi7BkTN`|NFNDu%I%RUD8G`5vtp=J!int3Pa=QZ-acb zpv5CMFTtge=|LRm^x5WGwjQv3G#c=wXHf9ZrZ?30GHDZ%6+iLrl{+CcFHaXsfKHU% zg`*rPlrZ*451qqbnBuBLoj&hLf&onYBlA*UeURDCql-8;ag073g5M|pY*N}oN2)PX z!<EhEy*!%@2YB)aIW509knBT#Q7FHQzEr>b{NQ-W2KurQE=Y>5Uu#40em-=)Mmj7T zb0%nd!j!BBvRl`lloul-2A)52CWS-6Z|%XjY2BO`K>PXQ(oMY4>SS*meA581!o`)c zUpddNS${f>`gr6gRTXxBk834%HkJp3G0s>pT55Mn7+}4leQ5K)7I=I%q?iJl*U|J& zS=8@W*IYGhNHrNm)UWjan0oJcs^2$$9NA<`GK)}FR>rZ3hEWNXnU1846LD}H$0o96 zk2LI22N?&)NLEHkIvft!9Os0bgX5g@ef4?&zK`$kKOX*g-R}FE&+B<zSCqGCCGhA> zf7gfabQdR7teaSUTpZiJDD>ieRq@+`?0Uu#+QH)3;|tE#{G0d$*f}rLzk9D&7_l{u z1bzCbJzFH|0uwnM=syg85XC6i-7a=v6jB<w8{RrumF~wto_6qe8;vPmf#vXj!Q4L4 z!|hQGUL4bkOO<UhX0Gpfc2e$k=0eHBcrXp$td9%~FMWX+xBBPWMJ0%0?BwoQb|_+I zkzl2Qt#OcU#W6q<_EdU!>{$sPug5fZszDImq`%G`EkRRb=Wn|#7BT>yz=<Mr!w}<j z8e#kJpLA>J&3|50$+aK!v@pHj{&efCrQD*8<LOlXoY04hD%S%5gp*fTq=x+sci)e7 zbL(}hL>B0re(!6S<3oRtD)$dk=aYSg)`a^K_`gBt;=3+Dpgq?*N9O^EwNu08sYpb7 zUOb3<<jx~yEI$U-R|mhTjL!@ts2x*`SC@!8|1`by+l~zffiph?P>;7aXaNw*P(oPV zn#w@4P#O`#23>i>Vy}cX`?yfD%3rOConpR~`rynjGU!CB$YMM)(>BdVcmL1t7)NE` zJ{LYiw4a5Ko3_s0RIO2DSTsDY9eQB!ME$Ev<IU;|>1Qr6K=p4d0$>gAAT9BK0zi@% zM~uJum&tiO?|9Ky%rn9#%06Pn3e_~#LM_&tLK?6GKLc%LuuD^c(DS^6um!B+s0)25 z{w;ZY4vyL6QHMakM1veNzKPz->7LV!Wd=pWJc4%r-oIy|9|WK7s<Ibx5E{LG5gaD! zmo4x`DHbM#p@h&n=_gYFoYnB{Qn3)>9UtMhPd+zb>BSu`4rrZg&C2)w9s&`uYD`!l zh<pKOazQUoU$qK0#PW)WJY_e1F`)r(RRp((s?Q}wYr#^C=8o%@#vL5He{<x?#loyW zr3MgfP|UU~Itctj?>ls*XQ-~iL6JKSp~ym3Q16wFn!NO)(Nm|Z&nLgB&%l)QscSG( zD*xK8V}t&GQSJD8h~P5p`9;~{HOZI5fwqcRnXI71MIN=!!tqv5v%W-u?tOY(_6#@w z5Dxc~#6HY~ug1-VzGe2XN|!K)K#BA4cOfM?(sv-|e01~&F70^p@e;DF92LHWo7?-? z6Q1f~kDG=T8+q8=KfTOK`Kq%N`xtqeAkp`5TV{N=vt<klNBPljU$@h#;VyE&%}TJi zRRR(?ct81K?7q_VYr2@<S=5NuZGNFrya(OT``BRXU)Bf6k(|<rAw}_=qumpNeG)#3 zvPF;lo5dY1`wULX+!2h2ZM=y)f>TmSKwdIAT@k{VpKtll9K!p7375^Q^sr}6N2YbH z3ODdvEXTLzuzV~C?*4<xr$PR4`QeyjhjIAP1tWfJPf41Sf$CSnfSlvji%+8~pi{%c ztL{&_{Wz*}1;W0G!<1I+Xj`e)BvxaRD-eaQsk}b^`<o~_2AFlY#Q?~lbyl4h`i&V= zGjH5FphzloZe{z<KxV2czgs<}iVc4>5JxMR&t)KN_k9DjIq2?dq!7W%{%QgaALhHG z?;F^5UwoQ(s=<kLsDEw4`8L;r%BWncWd`*Y6OC$}^q)wL_84HS^-S)5`QVRJJ4HDA zsh{aqS>BJH;#HWmE@a@BifF#g*~zaNk8>2OyDk%mdQ<yfmqnYyPCVkhuJDq5tR=S- z;uZhx`zNYBWvSxlBAXU(DpBXXN>xc#OFQ3}N$*xMxp>%Z%?nr=u(m;x(jnM3@YsOm zpXhj<CR`|aMD&eDsc{m*k@AhB0%>ho?>I|Uu$c0nL!L9?Rl$t)ZhJksUQl3-;l^R( zsOX0f(^J}RCdoJ0$&Uvg@ez2k8997VUQO@=&$UVU?X=m5M#7J6r|VU#SBE*TNkpSe zE+)1mFP11-a|6IX?17ysAPFyy$l5ahQj6MXR2qxJuJL|Occ*v{HMc8*S5;U&{hiLs z)=_{r^fBk$6m#n4;#UU3V8>R{yBXm_``IbC!U(m{Gpt{f2@LM-q8DH00ChXAA}cMS z#gO101NYzqrIKktIQ1lrYPUdLdqtnX!16eU@%|ryT-C;AjIAT=G8wmk07847w@{LE zu;euY@pc!7i>g?CF5Gy}Yd1<1^O+kehk=j>k~BX5__}BqwshaJ`B{RvNMAA6neOYZ z-oD>I+nrtNF}ScJsv?}3BQ2I05A<v#tc|ll9LqG*hJMM`61uaZGDVlw^Z0a~s_#X5 z+n?X!jo8^5-76kf8ruo>pZINZ<=mXHiAE%ddn{HO2-kbL(;1pY<52yJ8oI7cGqew_ z+sdSwzLe4`l8VD=&hx{jR!&!YLhU^HXZ`pt=7ZBLIdbr|UTaVFXa=)OMB=+Q_X3l? zXD>)<JcSj^#qTUiGD8~JAPv9Dq#cG{D71RjmdTy|oXw8S(oK9})^VC(ris-OdN2EI z`|E<=9b?g5&lz3yeG1D_^QMFs*^Tft<e*|o^g~$RBh^u;rg~yL$h}>R-w0+=$uvt4 z*V1*niyhaq^mFY%5wm2ZRDbC>`Z27%VwxQBv=Gqn04RSHyvGpjk`Ez8sbUd_OaC7P z_f{M$=wJC_kub{BihA5Sa^Zu&UQ!-E_Lev2iA%&o^?e`bHlGJmgcKu9DgWKeyhlph zShIAzAG%+{{e%|aVg@QP``F(|ZQf#f*Uwh`h;HnuDJ7-^*0hXX#htG`#b;56X8{q@ z*e7BN|4UJ{$BWs>#>aoVz&!@1qhQjXyXRWXqLTNpx~=juvRYH|1+B*nj!tr}b^v$$ z>{;xJMm*@zyARjzI`U`?s-=jls$RVLB-dZRegE!wf4zurYUGfhPhiY@9De7Xej>3x zeMmIgE?8&rvxM(PgBjno%&1AmPbXQdF9RFu-i-R8e$EEedL}<1?*49GcxO7btvK-q z&nb|@T{FlIu)AINsyWg-EsaUcREpStCuUyci5TkOuQoyOIp9wAiq>rCz@EGGZS=VC z6{N|53NkMUvB&abK{Y9;WgYRdBst+1jL?@8OWwYfd2xMrdV3$7OWb?q+?sH&buwCH zd85Z5wOcKEsqS6(hRNw3%b{yQQ5`-eCYbnFg(^f4==la=L~bA?8P+kX!MaG;Kf&c6 zz%nadcFOWJ=h+C(tg2n6zvXueh7%^hWG!CiSs%mX5%|)r+3^&kTHOz|-FMA5gtCEY zg?tAW70dXr81KCAY=Ew#UV5!1pQSkcm)5@-;az`**({#rnMsh8X+2R($vg?=UwE@c z{eFd~8*X-hY5XWQtygm~c<6;XJ5>C=Aov3I%6UXz$Em`N(NS~fwCOTE`_=&?S8?s% z=I2fB@V(2B4a#<wam*gK&(1luMS2X?qTXEUJX#Mbg#K8T(17t{qcWh3NDYYpl_zFX zpUat{eirgw<?PVz=ZKNlXcisl+DJ~Bll)AokItR8^(>EkWcv39?_874whF##VlTS! z>Y5->tsuuL^U92PACR>#{WDoY$!p&jDj*vJpcaV_vld^dj0lMS>2j7E!>@PMqtY2{ z)kd-hWF4D=Jm=$T!@vcp?uja%f=rID<ZTD)UAAg#kCSAFubyLq-e!jCb1h0HO&Pv% zxGuZ&SYU@qJ<2%oRH1Ss+oO?7YS1(G=N!i_yLYsnViY@7&U$@_Q#2i$ICQer)bipF zmOF<`;muDz(O^{VoIdNZ8u<8qmj<QzXIme}mq{({rW181YG=!4<RW1mi#CtpI*z4< z{AlBFC6V!l=<b=|>}>C6akVAWqo2AOwQb?gJeDk-a`@Xr^DevjF<Z*^pIm6~k0=xF z)z8l^wb@&fMmmMPK8+mMBW}DvS7`mah&!B1Y);;-4cIm~dhRlQ@9+d855Z6`N{^ji z%Hx57eQR>KA{SIs=CU^EvO#1?Jm8%kI&SGzSCjZ+GZ%_r@mlYP^nQDPr<9oY?*Sz) z8Uy#xL60L_jVZy<S>IMs-hO>VD=B(I9Q*9~mY@hB*45(l!i1#2o0}G*;Ovs@tzC{e z=ltN0RuzRUi>Tq!P2L}~Vr*{D4I?}yBIZ^l{exI$i_Q){2f27?clnm`5%{*|AvFnX zP-us@G4pvpB^#Ye&fYm;{Ap3&K;B}M9cquP>PT=dc5CLF96kF|$o|4B$H7X@%-XBo z*J1i<U~Qv?3<FP^!9|+nlL(<F1hY+EEsk7kYSZoFe}?Abd4hr6(syAHP$O*#4L5X? zzI2K^jpg;1d#wo}@frng9K9}o>iM`S=H@ts$XDHnw9>;T4M7fd7|ZnQ;?u9MB~9XD zE&}$OAoApTw(VoB`eS41mxGdL*ls|kr;HY6s8eOX&nXY9zX52A9MG3>FsrkzW<B2w zgknK9XB39>Y|pGM2=}Wmoy&K%@1SjIQ3?^hjZ?fp9D>#iwHWo2dR@&C-(i+<?LZ(J zRM38=lS>b(eGUMEew{tz`b_Np#0NI3)Sb%%c|+8Wp>MFGpYQ9|f@_bft!_1+o)#8# zr!!90yu0)2Wwq=eXNi+-g%`RnB)Cg%hj=X!oe;@~iLvhNDYrC^DxWugsM^VWnZzO{ z6?H!5;0x_X|G%>3`!@@zLpek&?Zina!d>&U<Vj<W1)lA5wJ(J|PG}WH>&M0N$MO-+ ze?tKk^{YaO@f7wG<OYuG=VgAJF6(o@CI7iN)=SXl6L9)!Bk6X(!?!%nKRnJ|aVX>_ zTuK*ar*uy<_jk{AQfm72TOF;q$>!$itoMcPl}Rgdy%=uG`*^q7#dMuJS)2M{@lT3b z3cR_~*1E*eftWY7-KcZx0uy+?f*G2ek`D!a%meaqNb(p%t=fWkORH<1GeL~ng4oh0 zuV7Sj2ufLwooO4_*$qByb29b1SU8LfUKj5*sPp2Ng=t7rVm>spsVL*s`)LyDoh<Iu zTOULjs1IJZP2&zGaKE-{5bIAv5_38uUVpJn-)Go42~XcmiQGL=HTVxsc$LIUeg+AY z3LlLDodaD@F<;;)yG>-Azaz=`Et}tzXGiekmF9Z6IEps&`_%=W4%rtL{#mgL#^z<q z*%#!nTHhd+39Cy(Qb7xEP6=K>&Tuc(X9=DOlRK477I^#WcW<!<5znb35DB_wKM`JP zeHwsM!}C|o+FViYeU3*&6@(LI;Wqhd;nEe<R#3tSZqZ{=G8u2xDt8L&-Ie_4xw`H{ zS6OoixlsJ=qk+;>xt(3OzsW$y7#iO0vo^3>9j89$Z0dA%U8uDrn%ZZ7`d$jZz0L!x zwY1c;sC`BuGtym}!A!@v5{>8MJky7HvBweYg9Lvj1)^vJQM3lZpc(d7>@l7-TtDKi z*D))&6TNsVGI%G&CtI%SAE0Gd^|<xMAw+5=&hs3^a*%`NI~&>m5F*bodF=%2g3XyX zys~qUfd?DH0+S4ThG&6%$6yL#bldq|uHb#4EE7mtkhx%Yu`A;rmoKbd(!Z~run`6N z>8jOBYxB%bGvJavH?QP9iR(QWLe>qm6ccoOC7!H@dWfDuZE)Tzevqu_^XzRjb8qUz z(1Ik#H**h=M=Q`rNG_Ckt8A9GMIpF#*f-K==Bugk{Z2W9HA$BYy7eBP%>2PG+iEWQ z49O{9^Xv_0`M~GRCpK|+$LB}W0iN}-rvMeCN;mlNUF-=9n9Wb(LFdlmT{!tMoV>L~ zc6C9McV~)orwQlgVD?brR5Ru6G-_az@i#1dzmxm7*wHTq>;Fn=??3n1YgU@=%cDk< z7Yt9m3uW990tX7;Yh}}AwH79vi#>d^z++ev1v|NfwP#x6IbbS=eOdH-$9{sP#ikEF z+SMsfIkE_WkoQy~1R>!9=b52$3uC>VrSSkybum}0!BZ|C)YB{Rv-kYIy7X}5_eU4m zbr)b)488MWw$>gLc;r`yIAAPegXfUS6eCdhHpCY?YHd5&H|=Y7X?qUOlOO2}0gy25 zj~vQsi(@a!I?NR0kHqgz#5;83qvK`@<1L=F6N@jE9&LVIYllmXyP<Bns)>a^RaZ{+ zer78FcH-<!i<h<M2A?oB$i{V!R)OO9F#Z}P#j5f6swDIYBwN(!TJlS6{nK@5`lg=o zVX@H`LBFAM-*U9hOG~?S>Uk8KG2-WZ=q;$oP1?TJ`pUyU2G{;4Rf?R`jS_wqoYTL* z+k;x9-r1dnGnPupxicRd_q>*RbRqtj-{YI$@BX~Lz>6GGZ(hVcwqaqc?56fUWFWVX z4QshAy%Ui6v5@;hV@#qS%ZLrl$ZzVN0}xe{J_&Z8J2!q8#Bu#3%)zP~h&#V@Jai@6 zJU*vAw!T+(V9N2%MEbA9Vfyh>7tn9(MJ7DlOWqH-ZOuy)kl>p39OiBN(;swiNeLr* zi?vF8xA-PQm)J^nS^C6ye{-Pcrf%rU-tKVj&HJO2trk&|BrfO;ZK9c=AyHCepjzOw z1Yxhyb{FNj-^r*Lg5S*-$2-@C%a1J-79PnYUbH@E0+Teh_izt=aG={~m<;`j2V7?u z=6A?#91hmrxUr>}FfCE(N;~|m8*l1te|2+@aa7H>#7gG;^T+fQ_3CKpTYeyMl*p^= z+0j{SnVl@@oggfYL8TwOHh_a=uH(FsYz466(MUY+moq3gobg?B80FsfsO2nAP;IT> zF#W@g<{{WO&G3)#WsiZZk>c_C=LT$v=&;=2oh5C_qb=PoUiM=O_rLsXRbfc|Hn@Lz z_(!nD`8TFE>+H2Yv!D9laA3^jiMLBM$A?Qxw1q7-dd)5R){e1xS9hiAC7vCrKjX#= z+e`e1J=;uoyClizkZr`F-lbiDe78bM8iq4hy}2sUtuUFXAblbypRT9y=PYa97qiDA zN_Xi~1Uufa4pleSF9Q#jKL7Z2@K;On#=_Gx5@g0sNhyTZWzv)I<CV&WwX&z=k|nNF z4#O*F?&xs4&_fbz`B>{?gyO#~H3__McpJr&JF#c_AUo>jY46sxtRqurr^qU<ch#8h zyKR|B0juWP54{K9)<E3A#KB!KHR_0fBerfOlr*=w-M9RrCzTfTvV&D+c3E6Qm->NE z-zk+fiR076gB%9=#@RGx#b0*~x`G=T9)f{9ylrT|b?8wI{1=?$FkAK|tF#mtgl%cp zQEy&<i|=~UO}lreiu9Q~;zcigPh=eD8BA4|?$J%Np>VRemUX}6#4=<@OLdij3HPs( zNPY^2m@5DQ?ik*FNGx+OCM86jG7fhCg|ZZje1P8jJyUG-1Z6Sy>GJL5ae4yc&AvN* zr^2?>a3?inmH>-rVHh^*`o-9x57|-OBBZz?BH#S!d~rxNUn2US#5U&RUkTld8w*%S zd{ydm&{bEr_DyCy-8aO2@F~<#^7I*kl(=Nm4me??>@0C2Jt1S%032BMp6yAZs(*G~ zE~{@z&slB7X@>OCDed(z&4mpy@h&KCf9nNn^P^nnvXSuy_kxT|neQ@!Mn!2B%O9Qs zeS_1ZrD(ss)lxAr6b#lG6Vn&H#NvD9>EjT{AjlWPsvG+F<jF8rwmIVyG4(VPFI=Qx zldC@()wVyMqslX?$_SZ8o=31G7_qbpvWgC67Bh#(_A+8u_y|ItH`Bv(>t8)Q6K7Sd zYIkZlyYc<-x%~3j3Dsg3--GpJ-!H_p@X+1OsQ5xJf3nLKxv9P6eh1=i$G9~iS8h5_ zIQ8ktyB%jWs!dqsL!vqF>odxt`<EJ9d-RN#x+|Q3U4!$v+w&E2xs4A#tX+o=45bzj z8zg6*{~bX#aB~^CxZb>H`h@dpWRO;BjT*O7a{xpl(=qe814uDx3B&`=USbX9To_BA z8_on=4ptp_(l5Z1{!HirUX@K8Q}zJO$_=a7nr@##^yng?QaU@?)U|Di^=j;*&g`b4 zzi8J4P3Z1H!K`Y-91OlqJI&cMKq5{ip@HtnFXGsTJ)Hu@E3BN;5gi^Q+HR$~Aq&4V zWO8{V+WzdRI`T-h0Yl$dKIk87)X0eNN_0WiCx~pk#W8vzq=lYI;3vJ1^}jtaUg=}% zsuFs<L4Tl83t3;qc*XTcH-#o5UYk|$iW?&S{CQ7A98mX^EpwGHR~OF2iQ~(zY8<C# zvOr}dR`Lu`)j$nu%muxTL+nhHaV7B5#{>`d&hb5I+SvNj!)5t8!YJU6eqA5i__vch zXZSSdY}st6%#z}IXc%z^xvR?MB^KFeu@=t4p_0V@Q#KiIzF_0V3Sla5G5h9kPCUP2 zA$#IV6pX1j`o~I^o^E~4!|HJEo33`!lT4OIwtgXq;HgcrkrOJ6OwdY5+tx?y-^|+o zI?Co4cC;ngCgw9SR+upGRmO1dYPY8NrBJF|+W4|4n>y^v*Lk(mAv;}{LtQ_$m1==H zPhO_%)8-4<ioNt22xuVxsd9N`<e*Fsu-_@Tk{!%bt|F^>7*Jfq6z_6^?XsXAsnUe& z^U-&H+=cLX*9QP^^`B290zQ#zaGrfIg1E8|8sBO!`T1N2QHR>K4Hd@_;baZVU|ZtC z3L;*$`Ke)JvG=o*r+YL%ctG1;nqrHqbIR(!a?7<?)H6=7tsJ(Zb<XOXq-4;oTl+~X zP7d|hj@_kEMMuA*kf~K+MI)z=0fH05X`*FDMlK&cmUe|pmE1l)I853fajakRHV9`m zq;m+|-L@;cj8u)9`l;;1({##v6e;{Pr@@)akTIP0-Luf}z}?Qo<UC`{rG@!71?PSO zy=^t+p7SX~G>ey-+Kd)!V|7OhF}As?6|<XmB_Y-=OzU<Ig>qBZElQc{?vHsdRj-sX zz&kwpl2*2&a^C)Q;%q+EbetgNt5D!rb~Cawy2VrW)|GS%!_g~A98g_K<jV^HUY!Zx zjgr!?Ds0)7FUq<vEb0B4vRZf7Px&EyGu|V#-!ky$E7h4Mzp1feVIzt8fK6<dqP6Ay zcAGhT+k|foe7SvQt$sVuC3LxZBd&ToXlh?~Qxfw;if8KYU$?M7e~#y7E86e#v;b`p zq};j+lD*WgyGO5rcf3Yc9Yh3YFnQObs@R>aZ{Bw<>$@Nk#iYJ4&*T!B!t9qA5Bod_ zL}Ej-u&p`>g$l9Mc1{{9xq1u-@IF)0DPt1lZAv7*g%MNg><tyKsXHu1CVCkKWXhmW z6#z^$p*7?T3!GjUl5<})SW`|@J=-<?F&xc5fVNem8{C7G9;xcu&5p`q&*GxQUfC^3 zp3+snu2`WN&}LCKadEf#kfmM0J45p@Zu8hw_<r>s*N;D<tM36qvUHX3;l(Rmnf9XD zZ>&^QUyZziOfrbNBcw5m6VtbJZ2#nYhg)mVEX=1_S8acwxHPskh2AszzE@!QzVj|& zc>02nUR%*CQ==-Ore(ba3$E8qR|}Zh&M3Im-@f^}Y&c4x`sJJJ-)>(U(#kfqjhdAR zIC-u1{E!y&y`I-aYh8lR2)iMw&ma|tD$|15CDK8I7y3?Xt5d>Ed058YGnpE(O^ZA@ zI&3BM9bcU49etWh{8fE)w3S3<`zZlB?9UIJ9V^8J)5yMSs)Tli=icP^Bd~@dT+m`m zT?OLsxTREE!l;$D4z*{4R(8#`hNFUeDn__!L~h3)#&)q!3wz9jLv+tR*Qv_7b@OyA zsI`85LrlctmQ}*2={I$Ce)&Z$pK>s<mA79WHHfy=q8Z+!!75Ltcgjz24$_Q`Nd>_J zs?AK}5eqt&!P9-T8%mg`^a3NFz+QQO(%({_52a;?^J>a;L!iC`%sr8jd^J$>nnj6M z+5JYD`@(I7)lfL|-9KvSQK1)B#qwJiATgz#JlDALuHJg0`@UR3SRmxJnPb5d-8Ksw zrUL)hfA(wDxuAb<0SuyWd5E%!aZ6%qQ*_03g`_Tn-?3pJxvZkf>^@0;8O2WVa-T^i zoBW*k?kIozjMxI%=6B)~pOW4&{G85OX3ccAOn()gYRgE_Q9Qd|cH(uOYBsBZjT(Qb zwCK?D&fgH*mqMOO(kYG4mYlJd9Lq~%Hr5v71)S-Ies{0iN7RBkAA<fb7ogH%e6~^* z!whzAZQG1dtu{J-bM&_EX^wBh@t+%WzelTC#70(q@9M%vEt8VYzk9%6uX^@xfA%vK zZ>7)sEb1<X<>QvHt9)O1_%f2S_?t^2iTdRlz1QyOvTf@^g^Mm@LrbU;p8*nt!K353 zGe)$M4+!4oedbvP42lJeW*zdQ9DaXAS4)<mQ2Y4D3G0N;zqVg*IMVMgNHhhi8t8=c z>~xO8=aooApv-STD-mk7-ICM?bVU<;*1Gay;+@KiNpJY=L~C9g)V=c(Zj^X)IH+)Y zG{)UZs<k=S?r#v2g)jr=f`@X`HnWFbSI)_iJ2nPN8jb$3eEYx8$fQ`@`9PB}Osl`< zEEaJ8L|R;JD!b(La;D(ZW%K5u*B8>5Ra%-tC^3E#+z=lT&scD7!`Z4Jc0wsbmmpZ! z_t&*Yo>6gWq9G3qMOV@lAd)Nm7Q&j?jB^kXP7><&#L~zu-2$dw9WizdA@{I2tD5x3 zoU$`*x8WI9+PvKbnnEKfO{<D8_x2QTaMrwj)VFdRJ$!EXX5!O5&lx87sh;<yuJ;(~ z3)XkvcBgRmR!ZleXV#lFNs@f6Vke2yZC$#<5-<C9G4)`q`Rm^Wl|T4!>pryYdD>W} zL?}tln1oXGXF%eZ!7Wm#fE7fC$WV%IL~374V@28?UW;D;hkK?qH_XO`$+p0ufk>&F z4=!i<0|yt-fQ47^`w&~sRrTh%uQdWuFIdCQ8@MN&oH4(_y`}T_C7HBt8>u{W=9rTi zs`q28N99?qJY{&;CmSj%lR=69M!!fafV5OyjJkS6i`mk+%D$yvSJoo12+CZqzGez@ zy>`<+R=l#{^-lrWQF73Fypo0D3nl%tf9qtUQAH~tdEEd4rz{WQ62hW~lX{KK_i=0A z{<XvqX%?B7Xm>yMW!Yg!++{c0i;qPs!xjE8a2Q@2+}F9r7QO(C!s1K6D)e&BUSTlF z6d7>&-aX?xt4j(!{0)PaZx&T5&`LVt7nq=;=^fEkp)Z{2R&UjOBk|<kV)A0<Ss0X? zZn$zlF+U{okI!=sM))^zq*G5>lgea74#C93?da~tKrlVI*Wi-S4&JLC;_vN-sv$D> zk@LUcLjOl=bbFO(%^kd<SGh5(XR6<;moj+$G(^58lv=5Y*?-KFl&8(<9f?XUVLTB^ zx>yd)g$DNFbpwU4AMccn#atvQAJZ1E*^hR8%oLfb0;X$Z#{Q}XO6eB&PaN9Rov(Tl zy`drGCL|vT!gcQYg5q{rR&I?I^Cd06SOS@amK>Bu8h$ob_|2KCks-*v;*lBMYNYSG z%ZM2o4u`Cm89ROu=qU!a2m@CseoEH;d(<NfQaz+15wAfaX04zTtbojr3Am0qCgk)d zUI|*UEonXw;7=HJ9Hb%MmZEnXVz<6YlfP3N`H{Fh>f*x|XyxIlHC*TpnUMb(Cm03G zev#Z)`|D#|D|#8+15cVAW#U+nRE<*F2X((l;j%}9r+YFk#O9pEXD=GgHORyVdikP& zhT00vO}?LR4OwNAP$p$32$SjS9Ri7L(5S1S=QV+G2(aupk;K@ZQ#Rp)yC+e3#IGmw zyZg;#R6A^}qy_pzA7Am0j-_?pX2f!cwlO0ap(-&sJR0hwiM!x)Rp}ZV=AMH*29(ak zK;p8R!Oj8Y&MwZZoXtc~ngVCUG@L*>C8Qol9HObpJQx@=n3$YSoyUw|o$5uxFa0J> zjPq&*F?P+4H}wye<~z_R?;zT{5kZ2+z<TlP2MNXEt%0-FisD)QKVK3f-L-W-^$Kb0 zn0wxbG!)HvO9PEIzRYOLJM2()^~j)XKj!yWzJIJYa;2L`vk9Q&PxVLy6lG7UzwtbO z_siDVB5}f19nlS?{<}-!+Y?t5Dm;3Nxq7m`n7(7W{doB;WqT!~#K~s2(z-k5{YCFZ zh2>}^T~7P5FK1<Z`{5OM76$Dvqg>aGlasYSl(<v^Rg$V@bR*cZq*FAVIyMq!Od2~4 zHj*mD=hAY296px*jZys(;9q5@v^vN`o13R*O|=T|z~v4#G7czUNZMgdG9_!Q2mZuo z^nk}aSY}uFMC((9yXnSpUnzeV4D0-5Nd_LT@`(JV-yn`7D;IUIGe@@>|3SWcV7@Mp zZurxrKL&RGt5-$d;+0DgqoSLleJ&OppZk9bo<*JBQ3x$hH#Q9)7qRdbcvU1d&R8wo zZIIL<kn1?SEPVU^o%h@h<SS&&tFqK>t~!HAO4A5012WCYKLJFH_n(is@e!Dn?LCtv zj6ihDP~ZqLY0BKUN5-W3JTMUzU?7Q+;Fao^p?nw_?fh}LVt8<jI9?-FOHk3z4l^`> zG>HdFNYL&X4Y}T@er?9@l)~2Hm>x7BYz*FxV}}-GsOgSGJo*d^7?b!T!6U+uCIhZW z_$4cQLMAF9Q8dSduj1yo?0ZYoA&s3tiojWzCiZa5pci`aT#~@?g_ke;^riGd<x2U2 zKE4rpUG=AUp3mP)8mIQlWVl;`l*`m*_v&;}?uqu0Owon`kKzle55Ia*k}7OSPK$;5 z$mCa<2e3iz!Fh>Gj7VGpcuk*TzqQcQm`kUi_{Sr5E)G1VbP|$%OqW*>8M<NTz-Tf6 zk58|LF9)@^=FYSr`Z|9gowY;W%3J_Cw-XWdI|3S+hP#)-oU$&ODOgE3X>^^?Z%sCx zAN-zq%eSP&pII%AYR3(|yx=D!PqBNh#z2krek<N{67u-{)hr1igRkmLo~H{f-iI)A zq(;j{H+&H>`DXg!d_c)WrBud&|GR@y8Rvu~S^U5$?e=pfJEY0MmF|UiH}P3-s@27R z3)e1x7K)&FjH~>Hy*!|FUKqeV1T4+hITHYzH;BhKd7&8x{Y3S`N#7CFkvj%3=;%p; zvZF9@&j7Wu*U*|<kdtjBDj9mTys;2eKolIn$qxY|8;nUW&k;|)V$a?Y+Ee!aMGzuc zXFs$#EhDOR0d=N-rj+xOV>&E;4EnOoChjW7ZL<TFFK=wR`YK=iy2>>$Sy_Gq|En!r z;B<3^xoOpJ(~KP>%MUzi`Q--^86QdJ?>K^Qr|P+fUVn~CUPJVT1()a%fjKrndOfg9 zRKjF<`7?siR3u}1=ZSRqLia{8eFdj`3TW+%A!1aiG7r~OX_HE`)Dm_~gL9hs!_^2` zX-Y1vE%!`rwPi;i_6D>|Pu&ctQc<k-gL_=uhvW^DvYY4cEE*OY2!#v5?XNDUR6e^~ zt5JoOCBCnkpST1uhg2LSu}p+ODg>OoX08J%V2F2^8=ou;Buy!Xi12QO(<8EoIAB^% z#Vfkx4jyp*pm1ceK8)V{<yQ%{)C+@>`tlba6lnOT9blgL&JT6|_|S@1vn0ve&QANY z*xqj{9e9cEJL>K@fOQ-?;;t>c3*U>L+4wPgg3Nq5Bj;xg-@C;D2W(Jz=iFzq?z2_7 zi_CwsKLxUCr39bKq}p)r0R&XoAk$!kkvl6GEiVl#e!sM)=tYl9Os77H#h)8Dd`>ip z#W(MVj~o7evHT?ujqU5agT7;c-?6|S$NOfSy)~eccucvW87EkTi_u2deFct@Ut8vt zjv<lD#IcRb3g21DnwqApP`N2f?TsT3Wb%Pw2BP#94K^5H^tesx(%kzYTKnP8k@!Lc z_A%nN7eU{_>^e7B<!}~##a}Qa_)jDeBjx;5pN^o8Uo)VjT&d9=r!5Z&P8KNhBTL(v zRVB+oZw@FUPsw?Qg?zYg$1|q%RDi1!STNI87y~O$J;z4I|H$S6n3IawpoA%x)(+7T zw591Epys9lt}uWpO2ei{ER2J<mTKe*@bn|ZaMWs+u(qwsDvXp|<V7EVvJvOg(mU(b zGR0()8vRo~V;T^zmtmw&L2d!6b8EttqP6~O#}oj1g+%b`Andda=ubX;<lS+><CglU z+t+VioBe+$x$`@Lb!eV(Fai{w9QQB35kizk&_Fjxs0cu}wnM-b_P1Mu8BS^ohX&8i zUDaHDU?(=-sQO|J_-LiLXle-QXZ0xd2HEC#tkd(?YDa<gbS+l%kJH;FpBgfBYf=#s z(dGCdP<X6C!u@be2l^Aew<zi2wOMyzEwd|7n~iKGafOF~sbc2!eRfR<bC@K8D18Pz z1`s!?x&s;l+=hfSMfmnbX;9to=uJww%~+$`fj@#jgNj8Qx!IkE-B|I$-e?K23lB*U zZ*E+j7<USCVzt%M9dADA_88$Xx&M39MJSy3;44t_C}h*28!}=A#m)Yb>;ESX0g!Q< z^8t@dk&Ppdk+$N9(lFrTVZ51hU;hVv@1+3_@AB2)GB5h9+Z1+5_x9)u`Z40Q7oA8q zd`@u%dOm#DXiG*K-}2t@CWL}p!asrpyhI)ue7a+)51Wp1Yg;ogBh7T^VsD(#zAvHN za_gDe$WpSz_~P;mbYK%G`0zd$uTCV63hDx-u!=y!>Ox7?TVPBVNNc0)EE30!YaiX@ zaSrA<1ekX4%|jwL#(R98buePjQ&1WecNR3>h^A<detbL4BT>897?EloxJxhAnh27Y z!!(GfrdX1WR?Zk=3RA>nz&JV=xx?uyscUO=VQ9dQxNzujx~R<^9{hgm%AAXyhWf;> zk?!KN6ozf=L;L=b9(enj9}gj4FA2CPJ3*;4vM_mRO5Gpd9K6f7k*Y5^`Ef)7xP=Lc z+i_yR_;U=>l6B6QExdXZNFFUr<K+6eQ>uFV4$nzlQKWVYhsDL6LBILlJ-if$K5VOC zye-#n*8nwoOHuK+YuH_}p>ff6KMB1#yrF+N%wb~?C8bBU1iGiHFA3(yQ2vh3iDNZ_ zgf`kPzFQL-UKo3Kw0@v^Wl-|tw!XC%tpoxj<PzyrzivQk*wW!m%>YY9%a}BxwuDDe zq5G6%!?cJl1@!O(DEZU<G5Q+fg{YVR+y|}TBI-`oqd8W>`!OlRYF1~wCCPOevw^rg zGP=s!bV6RNcx`5($y%%BCU})mBL6`VEbwz1(8vDu|0lR1337k&_+1Ba`q-66kBaC3 zAlsYS3BUtOX#ffFCrJK@M<(1uInM>YD@8Ms8#6@c;u>3gXZS^9+HcDzHabR}IZLs% z4E=UG$_sH*unKZ%!XwU+{V<c3buzWFu21Aa%f;e7!qfGWnxyywikUTB9Jdtf`PzIx zMjep@t^fo$^M3*(yf?vz0rj=`e{4UQ3s8KUe*a_mnr%a6O6HjV2~6O?p2bMk77&`V zgs>#w5Bp11oc~}t-lR17y0t<Y?>DDKZ1nMVId_G_TuTfyjbglQXnk~>b}wR8viU>S znVE6Ad`RHL&5oq{Lqey!2?PxSD!Y2*a#!PE@VqFUW>XaC;+*D<TwKsy$+olM@E(dz zS<+_2pn9Qqk+>w+T^S9H7ih~}93#d|qWcpdH^ASdF@+46x^z66W00pQ97BTWbRg&} z2#Vv18_gPnBdQmo)I^=VD4ztQj3?X=QqeSht6AKn$atfXr0AmSlalVnrG7O7m|Ipp zZ2o@pTcT_vESdaf|K6xIJ9Hf@Wl;nhVHhQcK*ldr6a`%GItNbs6<mT?%Yw`8kSmYL zH`#!w&mAO-8vnY7*Ji*pBo6Z2as9M*up{>OVP@rhG+`nBWWu_U;!C6BKYjh{2Ugb> z&rs4O!brB~N~mAdwQ!Bv8!{!Ga9l*0SE<N`N#{2pm`i>oCJ=O3`hE`mgH&1zEqW>u z5AiC7omj&5DHjD20an1j!(_#l6uSTjp!+ef)Qgyo{|SmB%|_xMme)HfOCT=aE1iFg zg5Abrbg2}#J3BO?PN78#Uh8BblmjW55PC07IHPtT)t?t2+srldkJBoLJ{uqw>4z<a zs5H{?eQikfx1bWj%{Yiu4UwcxGHunC0p=fco?pWT4qvEfV$bN539m?=QogJtxPr?+ zpw!8J#@(WUd}kRk)St6UtM${q5~>At<D1sN*s$FpS_`_Gqa*W1+TjTL!n0bYmA0oD zh_sH_p_iIC9JMf>E|7$Nil8LWQ-0%DdUYsAze?r^%L5pxpL_bSnm93h*dm?gxb^7- zIrXRh(RTc{RpVOp;m}GdP}A*b4~BMh4d4zg{rao$<EtLD>Fa-2)FzEV0oKLhAF0#U z0?_j%n-3>2!6S9wK8@u9m!z3TDDAqqi#L*L3){Xg@2)rZbY_0O(P!iGpVRt*D@iL~ z^B;vZpWNb|Z=0mgqtXvp4xjco1#j#1(~CUv%l)eKOpw!==U=4Hb?jGwjNCSLd3<1< zd-_R3Kjy=4LA{!~U>!7**KOMD#V{#L5-`sj5To1m3P>o&F@<@D3|<DR)Cqb-)(l@M zjk)ltnH{ez&x89nuJxQT%!p#6uNLl+2`5!tJ6MhnH@?U$?5q{0eUHhrDe-9y`6gRY z-BY^oaq<xO{oVn+1-dp~MIghwiBgl^pzVfj&EodSd_8MmA+4jlQ<lz)7Fp}>L*E}Y z!W-Zs12=rUo{AGc!il;wEQxTO<N{+!LIT{and>Z{^vC4)rCyATOw8=E#erR4VO?(< zuO3`oUm;W1`}zjZK57)i-|>J?y^V*T8@d8RAWg;?UpIQ$n%T9-X2Q6i&zfCKgr`c7 zsU<_2AFfXRn8qqsw!MA*TFFQoNtx4Ls|9vUP>8j7YtAPq)RTl6f`a=eG<C#3O}v0? zWVbPm*lswYudhXr_BvaP_VWGz&eMoSdm_}_V&HobJ58`C9A!j>rcEC@+LvlI5@P$A z{ZV<FR=;8XvUEfu^wr*Vu4aR~+Ugpj8iSI=h3>F%=nw3zn>TY#Sp-`S5I0wY14{#F zhIATicH`+SO+rv_zs;;F_fPtf8*Th5mY8pXX-v*?;h+1C=Xm+o*uutDq3T9TZvFO` ziRKG4nwA^++@pGmpfymh1PhDjg)&caB!0{gQ?W(lnnP4PgN8In%(u_kf4Y4oE5&*3 zl&BGD&mT_R5<?tS;2t0j`&Ew*28<j&_|wPy5qth!ZTtDQh!`rzrejyf(Wt)<67jcf zoVEbMokD7mIgk&5Utz<kz<Mxg6vA3^?smmNyiD1OmBq49>YFciKM$YWt&EC8AqTuC zF{|_2M0Ti<P<DTXBI@ZK?A}-0+8n~GkkZ^|*9aPMu>9tO*qO$DIchlGh3y|TJ3sPz z|7FLx?B>z-_=J%;HQ9*nS}_^AmTVN&f;f7M2!8%t5{L{s4p|OX(rEX15PzE+>TNHe zsKhQ%3SLddP=P{rmP+yii$vi`MFL=GZc|sa+Fh?Fuo0^fo268ZQ3>1EtEth^$Xe`k zQsmZZQ8QZgF`dc^Eo_XPJVCC!+Lv^^TIf$7Dm|W5rT#|!At5LmMh{DCKhwUc(!ZmK zX!2PKX`GfePVH6gm{dGKA8-*nC}Xy#RA5AMf~QC%ezocAm!bNtVZYSNqZv6YkhE{* zOEIGomaYFJPO}Kl=%p<)0+OMu^B?z;aI-3^gY&^*u+h%gtkACo-|{0!UbJHwJKOJG z1&wK0RQv(h0^|8@I|IqKd3sQ??L17|1;<ZNP*C9Fk^x~jZo-kO6=+*5!s{;ilgk9g zK)IsjTIlAx8jrX2O6K!dmuOUS7oyO+^3S+KS9ce6Qi`gffJg6+5aF?*0h5JNutJxN zj`I{y1za`4_sGb9&Y5|Y4oABMZ#UxF+s@^U{h++9oPT~JxC|iyc04&)&w}X`ev3|J zVFQAtm1hKe>DT{mwDP$pG<EoZ)-^$e76i#DS5yow&n)`sVC_+FeS(||wnZ$Ct&$}! zHX(Ma8n~}1^X188^tm0!K^L}hbSfI%+Ioya&mE3Sm6c8|L(KEI5~wTbcrUo)jusWy z0<#iC;Ivb8^$0^M$0GDDH&R}Yx&j5t1{R6I|19DJLr)I+F=F2Oii3d}M~1)tzdK@A zM&)kcP1Z)+@U(etguj`yq>ht~wy)kwSGoSl?<~c|IdiM6$X|PT`_BG)x3+kf3(}2A zFewCDe&3S5RT@F32)xe(H>_~A-gy5BcW{tv)T@8eUbYwU=fuVVoK)uh6?z0hg{^4o zVgNUvxJ25S%rnG5O@i(2^B}WWQuZu@xdtWu7Nud&jY(y+)VKeWzC;L;t;)|Lhde~3 zx>AU~+8+qsZTi+C%CNr0+N`lNCTg`==M_V}KStqoV|44(Bx|0-)a^}c{}2;t(*w9I z)g>c(p#T27<mQHd7qENK6TySL@fIYF>QY3-<hbx6DVuWX2Kv%4gvCBI7R1Rp+_^iH zhKAlCt^6gc0UzX51brZM1-Ea>+RIcW6)VjSDPnnQMXY{uaT`rP^j03MpL49VyX|Qu z%e8lYEQm&=9if&Y?#{SP<tk9LjY%%_FX?!&2^SJ}5s=E$>2s{v1FeDKi2q6XS1F6& zH@3l>5mfl<AteQ`0*wjyDRJkO^vLDk!%tN2cR#=J^YQTg+R(HHKJK-c#o7UA<$!>| z6|kega&q`A)4<Fa@puMg7ESLjMcCE^MQmmv3_9_j8t8q;NU|P^89Wg9B)#}dx&#|W z##eDrQY;<*e?KjHKUivzupV1k7>J?5Z<2CGrk<NUfJWoBzTY}44y+JwS+&k78VV5Q z)aL9Tt8=36ZpH?%gqQ-f%pMt6AKpXS;W+ifT_wbp6blu7IMfDCyXRvU6nu6t^}Vn( z=+=+@pkQ$@Z*#3Q4E*mw{UiwgS-8;NA<2N}8pw|EDO|-Y!XJiJ)|NpftKhXVm1fI6 z%yOR6Psrz#bZflbHX26X-qqX|Nt`RxUpx9lJzVvtZ;DVZ(C2`-gXR{oIX!=^w44H_ z<F8^gDk?MvX-wc;^H6D2y&`B5b5a`B;>U_HbHU_~&6lE%{<He4FEcyo&PT^oi{Oez zn_KqL3WA@{r>-gI)DAi88kT$wBRVJxb?TQreK^qe$rsiY3Ns9JBH<4YnK8}i-TW#r zU2agN^*rzof^M)v`<amx3OMaK-Z(THB>(q6ceTnRgX**m9=Lr(IXHwl28+yLE?B;j zy&eo2jCi2#r5y5B$Ad>>(LvuZYL%zU?x_>$Ru|%E8n>N0cff{-*c1HWe~fMe)5jw5 zx6|h`CnNE99D~anolHoOSyrSa8@RL{Z5u;blcM&-M(^&f?KOO95l}`+f#pFDEXm^2 zxLkGMT1|qzCQl&k3^2*kC`?f!h9KVmvg7>AM?azKM6*3Ij+R0uUVz<6NJ)naf*s4v zrBP~iP0K$>h8XI!L%P8)WE6gp5#zN%g#PB?9cXb)VLQ(`yc9<@4BJ4z(!un}7C*qC zL`%M68_~S)wu74WU*ZX_UM+wk3g$H5E1cRCNA_)RDxE-@={tq%4B3y7aiZB06kKvT z{8dIVFY>7_1~cZzj4=oT^d3Jv_MAk6AaTQ$v<P`ZL$8bg%gV>SiwlO*uvT=NErG~Y zh{g@_6wh%WXKyeM`VHk1&x5ctbva&^3-iAj3G>QPURlJuvxhTY=qZgeU~T&1Xi@RO zY6~lvUh0CO_oLGa{OZ|HIc!y=&$((w;#Dky-AeI`JdD|vt$`$(VJv0Mf2FRAZRP2! zd+4BCI695Sk-s##`=_*XfSS<3gtN@@Y}p^O;kk(Z`|nZLn#I8KHL3M@IXpHAXBkX7 zm43lRY*rfdxy8D4zIZMxBzi7IjlSqM|D2>sA8j3*M~_F;G$K&)u-lconQF+V+bjl{ zSH&Cn%jpI`KE>eq$NtXd`_X7$7M6&<LUNM`sjlYr@!3HNT+gi_Ztw41dQ(Pv=MVau z^AYfk8ZKtz;5UK~G}F?TD4@2Nhp<^Tq@A_uAOSEj+(;)vcITAO&ykfOg#5c7H@BQh zlqHivTPQCWSwXy?e(<QY_+S{9n(gwpA!5@H(_$RVGKcYGEpMFF!Hin{d&H<52{7+7 zBw3q`p-{y9Bk*;8^AURw-HadX2D?oa6!k}Zx4;o655GT0(?xOyjw(_<cM@TXhM^bT zYOlcIMu$79-;kE<dIq=zbw65HB5j_edsaDpZgLC%^NlcAyJVJ--g#fif}3@A^9*e< z&?9h5>68>%yVIlUp>LKbYA<YMuCX85_3LK%Us0$quHo1vjkwpSF-PynFnAy@Kh(vF zOcupx72$on28@HDfQ38pKSh_aAw8qQ@y8O2hQJz%Zzip1zgF^)O@LSHKdtYShfSJk z0lPke1;E-dcwkAwWL|QgnFoBX>(e7Qm$*rihcNxmm0*853Fp&t|MQI8$95A+*U-Uy zAKbU_*xiLzipV*d!I4Mm>7%%<p%U53XGkYH2~@8|i^N~N;qXxTv~lp7GLYyBDDdJk z;UzR0>)u_w=W_0GvXvw~gB)qnn#R)$cg3O)Zih>qgu_KKb<SSsYqp0@S>*FyaiW;2 zauKlnQyUoO0jeoqRq0nTa*afOv9IOfo8s&gSnF>**c^25-c}Ap%~jP94S4ER8nD8f z_9WLaJ>YUKhvnNR#ewkIkDsm_uOD7h?;k3$5i{IjGw5L}SF4UHeSIIjqfEZ(<(MC+ z=hS1&J?O`ViScCu^8&Ge8A3`8fmo_<Adl?4c7D!BcpC#jOA(0rJO1x!4XVm8K5z^4 z&C88%Cb)_Mw5mJ3b2{pw=KtjaY_nk{rX?-suH3mmc{P{WQlOFu3VvuDOqsc8(%417 z&II`Swzae@zPo(6s&0E0L2q}6*)`lX6HZNqn{pg_WX&uW6SloHL?7Cc5c_r)cFP+F zj$G}o?fM%r6$8TPbK^~T=yh)7mN%x^1*0sDBG2$3DNg1ee0c+qjia4VQUp>DhCmCF zr#1e2c)5q7HY5c_6#Qne$JikS54iJ3N|TPWbyo`8j4@8lGt8Jq3hZ(iPvhpVyKEB% zpjlVR@sZgbA7X3ErxV}#N8!75x2oc^&;0I>fB0}<w?bRBCA(>V6vNgc>5Ds-C+iKW zq;eVuYsrIVG1k(k8b1~c^`AfzdDkelRJimKq*T8$bR`BNB@s)(Bhgm4>-cG?F^Lfe z8#bCa?%aNR->`ZkNK+sD3i;}4$9jhy2|lvNTU#^!qS^k*)4tA579`~`9BsU?w4)CK z$s6KoTl?yQ;1cOoiECmcsm^r7a~3^{;mYPv$)y4c2(-hC+w<d$24&_M_XGuN4f-j2 zfQQWIG7Ww`V^}G3LMBjFiF<#^5m?HAsy|e!HjN$$dnt{zWLq@6zE{SbqUKhv$Lr>1 z5nQC!X|!}iX+5NL0-<+Ab#Bi1v+eg@>cYbgq?=iu2~Hcodq1^B8PU`4ItBXqn);G= zLK&kNn7R^H0^GxRu%PFN2A!6J<xROe2i^7W<YCTF@k1&UsL}R80`agV_Cc4X${oTr z%>m9n(ZPB)%nL?f@S(wkoC#?n5^qL@V~^oUR5IupLYVe2ko4aP`^hXICn9y%^T_aM zd4OIm89nB=_4)MVL((lOyz7v12YBB^9HZBWCDWD*X4^hYE+#i-ek^Y&gkD!Po;B-4 zY8LScWW!RK3>PGGu0PGq-5VO4SO2JEP;_tZ&CgF+%&$hl0%vT3chI!7UtY9dXl3pl z*>5hPrth%1-f6-|8ug8nNXI%t`&6KHB;N3T@Eb+YEEY!XBxg;P9a3IW|DVn2ZAENq zcRBMe7N1sxO_QsRC?3E)GP=)w+np@e?(Ej%@D53=o^&YxbECJY#e=1xan8qP3DiIP z%qKtt`o}=_)g7)l%HaHihTGjDx1Kr?MhS78w8OaVMq(BbnAo0c&ip;^W(l7n`Q4^j z8{v-U*T-K)!o-wOqG0HhuQVzxtC%~Wxigo83a>w;h`}kB*vYQ{Q)q<!GpTg=Ao&{= z-m^z8!CPONV=JHC;%iBHMNMiF^0~{SUG$(JP+sjlQH3#$3D?qcd~T8I>E+LsJ=y#b z==N)Y#)LmJmwthd-cbMf7oNX*vmA6wbo@tot>n0vPp%vi*n;Wlr3d0bvgrv$N{Xk$ zE757iXj>E=u!P2Vmc=pZ9zQ`Q27);MjF{DFL`CwF$m>>nWE2^PLS|XJ&vDhxKH=UH z9=;!NH!0X|{?XUPqnFoUPkx9$UY2Jz>?D@B(7*t+{pFg1(08$3i=}(vc)Pn8C)yu& z2$_hFXZ~Gzvw%<Ww!li4bKtuP3B~=2CrkNXp4V%*ovvm18tfUItqd<NX2wu`Eg96M zDcMx`7b-NC0u1#76oIz6Xfq<oim5Bsc^HN@yn%4*{y$A!i9b~B`%WrpA#IXusU%5~ z#Jn?-B73$Z*)j-a$ucp<P?nT6`!WWVQT9QWVMZwXkhNi$BKw%hHV0$I@92GhpU-#x zfH~*f&;4BYbzj$g&cj8D9+tG?iNn}Amegh!S?L}UG**Ym{!qNfx|*jtC<`bry*CMb ztYozO&iGIL6=PP1e)#y}A3>}YmQ)I}4O3|haKMd<vw6IQv*c~!6n0V)4nLm%q#4FA zdwR#M)Egt~++aDVU~sE#JpZRz*OdDY=n&k(ueO}eg#s!A^UUA*T*e7?H1^RJhiu*o z!ICy~ox<JZp$!}u#)#WkVz&CcI+l%2SAEtpv?2?lINnOl>mI9^*~CHBECa=KALo*q zqGK{Pxt%HRXM3M|49qxR0M80@KDQ95;ag}S{&*7U>S7`r*>($ge1ck_KrixqcJoQ$ zhy_IkUtDfvUs-=2DzNKYy<X-0m8bh}?iBK2LDS~$f6#M_nhxj-6H-WR@L?yVy|=6~ zG0!M>N2u(L8y%VR^LxPJ>d!D^*ks!Ggw(q>-JLS4a!EXth``tpaVPGWz}p^bPPr{R zvbN=c*LS=yf8h+i4DbEkNhv}t-S>{}S%dS<iZ$mi{=#)Gv%xM=RP^_TT4mW6*qdYH zRO+)rk2S|7FQ$3B6A$pG_>8RasSA~o$U!@@Xi<t&{v7<P*7w4Z5MSXgwO>!wf_-f> z_Em^+V~*UA7@$sLNk((q{Yc`FB6g!Ii_V!%;lMbkVGg39{+MKXQ0}jC^U-^s%LPG* zXixJoIjeL2Yh3EXy^(hiFHZ;c!c&`o%|%5Yzh{`SFocH(65$sZNQ`X(o-lVT27UCQ zLZ;q++<{iPkVtPcmvI&I@vAM(Sa2+O=Zc#PEik-ch0wI}P@AbZB}tHYCe2>B=*f*q zhwN*g&otsp*$zlcLdJA1=gB;A*kJcgGZ!Rzs%_Z|z9mKD6%UOi39Fy!58Ysp=yt?A zymcJ(!V#@AFG_D6I=bkz${Am4t=(uOe%5{J4q}uz=ORuLju`5mMk1agud%BE=$Vg_ zwyD9x#XXs`rI}wk+il7rE`1_B8Anrtn$-FzycP69CNBr{oVE+*-w4S?(WeY^W!QG! z;91TPr35L;u+8#M$CUMUHwhUClAwzX{a~l2e)?D`4~;{B@awC8U`i6!*CXn2r2+mB zN#vbs(c_Vgr|s|FVB6HR#s<>-3XUDsX(Ws%>ig$@$BJIgUpSkY?I<%^F*{lzD{&-z zHRoa}$taT~4XS@O?+&z**J1BBo4RNtQut$~D!g?4JqiT*1Q3)`W)reQ`G`tFH_(FL zi5@cgrt3Df)urx*R<O<BZ09SY!AMVw9eC}>)Z00uqsw>TRQ8k!GKeU7;VoUx40jSm zeq3{P<ig6;Zxo*^c@U94j9o2hVxLcU!>cLS<qwvvo2choV!vWuEY-d@@(b(%KyC@v zCQunzIP`rVYY*djo67~67l=81c2L0KL(4D5#TPfTQ`J#uK3e30!K0_Xr8WDdX8BW& zxm7joGrubt^~Nzm*WiI$b;CuA>Uvki)l+vzpcffpDOkO3U}Tb`F~#%%WxKDto$?}v zA29<&w)Wdbqrb{|l8n@iHod{#c{fEKb4D83tCmMnr*77l)L0dWZ@z9^3gupz!+rzC zXT5IJ^{ra>tfGdwHsoo{rkJbuXnpzQL?2NTjXi_Jc^?;G`>hGZpE+xKs-SX3|66A# ze6RCM9}RC0NWC;%;yW$kL7*onNce28e<)k;|F7NZK6eI*pD14e9J^>~Q|=xc3kTJQ zs60T_ZHyo?Z;A7J4aN}*L@<}qo~FsqFmX1_P}0M;Y1E3Kb(mM=%8eXDw^h}5>%ET( zeu(+@`X8(uowavG+Je5w3>P*8`kWvPLmD|}t7$kaZc}xA#RFAi#Nw8hkXj^sxMSg= zdj$Y@Zw1w|oi5i~lx0#+i+UPNvN;>b4>#BX98N2AmXRK<b*I=4w;)?{*cJILc+w#G zZM2=!l}iEVnyw+Lu&hyN4k>mx(~`^u<$zz@!&GKpcLFCfn10aEZ~rv=3Fq(HmSXt7 zV5})3)SMbCHyb_5Q=*TZYR09f_r&HLMbwp(m{l9d$H^R#8K(A_&Q?y3d*vgw`q&o1 z{kQo)((isSoX`H8ammYyqBXd8F8x_w<tWJGYVomjrXUnlex#|kFW9IJ|8(q;2dopV z?u_>*D5h)KOg${AN;+y*2q_1j-*dy+2$>MiQL}UKY>~UPoOGn)NbP}Q*q7hP2VTST zsqKIj7;3@2h&(zo!O_SrHMU!Df${BZFDh)wtmDaz2Zd(~>UD2CMO?#(3xH)_lSp%C zI7~C&Q2*x!USN-C`9(Ql5=NiJa$((@nE27beIP%1=~Mjj-X)&vPaD)k8|oQN1>$;b zk;lZe&NH2z2I4i6&E6P7f143w=a@WF9vd9sJ3iyGLaZ?LSab7RXxRAucU>o<{L3fX zT?-Dy)V?fQaF4^dG2FHMROHxTC3`rti5mZ(@SCzTLBaq*Zc&D4EnPI>vMsOx=Qw)o zoRo5twsYCFSW7bjCX}%?Q|0}rm66c|!!Eav)$$gJWj9XZ?->l=6m&j(;a6k^7!x8_ zJf6YYU<VG#?4V4felIUSa&+&b!#cW`)O#P3S2p&SuOF^TUVtBTg-p7tjmiu6`x&)N zOn6GnF%zbk9iwR5%iD@^Y!-~tmC4-CU?S)w-uWo{pcD9(ulVJm&8bgA4;NG0-J=Y? zYHs1@D*HEfPS(?}*{VkS-$ci_85*?n*8A+Cu{R*gzs-wD-E$DAv&zYTAR{~>k{5(< zM=R(qm`f39udmzSDFwSI*_j5ytqk!vkZeye1uM5=Jhe6aKiupP=c5>4pjs@b-VmV3 zL498a{1W4#H#-cgR)cHilu|~&y=}QK@I#K@Hon(Z?O>c-O4;u#$)kC%MQ3o15e*|} zQ)YX=Y!t(kyJwJ9Bqd>)ADD>^r9wIbQxqI5h?kkfYgV3wcRxBIPY{F4%!EYsef48~ z9vKPgAp!<Yd6^^y?|)HmE;K>x{xn=gp_~+(1!m`9F+Dk*X14g~Z0xUI$LbZ!2dl2Q zQQ~WV@6f3i;AhvKe#s%cKXA6TL#dgz7UPS;sYrhTs-Gb?xZ>|25bH6pUa>ZmOl{Qh zG6dU(*jKls=$|UY;VQ>H_qW<esZwf&8R5g^R))PJAOJSK%fMOYzeOPaGF}vd1Y0Y0 z_6ECf84v+zBgXgqHr4bItk<#0^)vm#mK0Tuk+4^CPmSS)p9-xHwhN1G$kjIXm8ZvZ zIL%ixnCnfP?B_BUe<`KJ9lia5V4QaO%#=|ODi%iZ7vgWd1nm!|4;MxzbK0E>ZaCw> zvpM<>;t9jz_gKWKAaAl7+V&5ZJ%U~_+AfL~QYd`Jby^Dxv3z=iJ;OolLDY$a54#s{ z7(~%)L4TV#{i452C%`q{xv>4z7qjO$p?z#mG;WH{OuG{&MsEJySbcMsy$wzCG8xdI zgz4P2@QX?s)kXNVdo9$SMWQzxu})lKCI=BGCJvspbu=*rW=$z0!=%|ne=;|Sw2sX9 zA_gZ3Sh@0;es!zcN%iO$TZK-@2p)JODgGdEu(<8W12Uk)vA$Bzlzqd~4*8jN_jQ7< z&fB0QLE~Gef3%cI(KJ}^MV9w{et9$Ks2U-cRGv{nmn76rNs1bNl0l9vFrJ4ji7yg= zaf7T_d=#{^qpb$$&D7C<!TAPNDF%J3z}IdXp;F8vv@;ml=2pEF8(%+<9CkCB4UN#^ zH(T@0nEM7SE(5613gVESg_P43-fEoL;i<D5!OwLbUV>Gmk90X1v7pqWhnAY&j#leu znzRcjw^xM3kG8imBx~`62kvpB2SJ+-j~6swtC?c%A4a3uvBUwSo#Zw%81KQ$-0=Hc z?!Zgz9^E#~JX%grrLQu~Ngog64d2$!vm;y5`x)XV?$ZXWY0*bE*egT{LThQFgvDM< zDoERTqfe0&O`hHS`4g08_3ytk5h~3x(*?|z958B6d#Iq^h}lUIGZ1WL)WwVGOTe^O z0X{04nS$EAO$nC5<3}4>W4ws!u4r5aGSQu}n*DKHDLL@ld<PZ7?IjY5_@jR|NKOUH zXtNM~XC3P#eMH^_Y;bMbrnBo>j-77c+>lf6m6dD>n2a~{&o|FhrHcsH;NC72xUBqA zF*=xjAg?3Mg`&61$1e`^xH=pTtW1IyC<0u54j@IbI0S-~f=ey9Gx(zDe0g8Eu+>eJ z7n`Z?UG-4=;#Ecvz5QJ`#CNrE{VGvHa2*!JC9f5~;1Y4iS`uGO5CUW8k1DRa>mID` zFg)<-Y936<rBBQEWM6~7Yk%g+e!GC-{I=8;%LFM8<zpJ4U{*DN`5jHSi5neQ<e6dc zP}toN5H$ZTNyLA-5%q6wl;L`4BZ`?WjO2h<?u=k|m?lOlu`<x<0?nF31e-x&9p1Gd zr+Z?eld{q0KmEkEoU0G&i|-TPO*Mb3iP`MWC#P0ezJW!QE5f@TK09tFCO6z^5&D5% zYA)s%#~C(IhLV%{;0TS!6jauisWJ002%e<g%w^yCFDBNHDG8FGC=<;~6a;_|T{Hry z4csY2-t>;ecZn6OiBM%%(+q+hC0RUk2I&m=7(bEZV!e!{h&>zQO7^NG8{$d8xZB~^ zt3<3>WUS9pg$|~2=2BsJUDy4Jj5pUznROKz!K;TOEzTpO@k7><gm<&MDIY~CIpu=b zcN+x6<16LO9KZ`-@;6V5FXQJ$DA8a=nP-+Skg6t*53bzn+?l7D4ze%m-V9d_Q;J*l z%FI%tnuEnDt24;d(oBQyF&f_#^GUn=5${Ej(V8TytVr42vp;{h;ipX&Umfri7Mnfh zeD2^;*6Hhp=~9mSoFB<U3Xiq#`KTJ=oBQir2~-nLVE3x0)hMHZOOLp)Q7(Jef8jB9 zhpWTk>U3q$RzrQ+4h{8YhPaZ7OJCQJu~Jun1?x5K?$Yd=O9teeT(6c7$neq7psGYD z<^xHvn+BfT*PtWlJR`^JmL{jId&Kou$msRsK>e-i5vr2Y(=n&&GX{?BCOL)5DMeHG zq0AM_i0TmE7xoy}GCUhZ)fT~Q!X7wNeL9mwLu{e&bh*Fqb~ck90i{HD%x;%rA1kAt zJf%XAi=4g>jT+FrFCS{ot7TVD@9V=8l>KpPdKY@HiChIx6YdW?-sB^S$wp3dOc^K3 zZ=dQUD{i-Yem&HkH*>kcBP%UQTWbT))Oq)e$_Lrcck{6LRlwopI5k)PN7>sZ6W`%E zcVv_1Lu8x#DeJ-63Y6iU7G|y^K;X+jTC9VKp+`lNOj*Z3Z?IiY=mG0!tGk`P%7Kj- zXv3zMzDG-!{GHDJD4zK|t$s5>(Jw2yH*8tFGsALNM(?}&71xl}{kj<6^H)O0kEWcm zYz{`=?0)m9s;Q67`21~P69t_o%)KDq3gN!ZEjjD2W4ml^G~sS<)2At|cBa%zVm27B z*oFCOZBgOiC}ZPoDQc5Dd)5lZcVq_!G7@Bmsf{01c}^atrIc>LqW=ve4zv`-qzNI* z9MAk3g(_0j5vRSaV^L|v4(Do%w4(;HdG0$KC<OHHRtYX{H`cw($xL+KtLno#^6&s& z!mbfI;cn8+N7Zca3VyVF#rvOVrnX_`qP5SHw^_g13#~CSz71+}$iX}vs~POabIOhM zwXn1}lcVvArml;T#%W)DZ}0T1>W8x2v{;|9C-qB81wYubK29_BexR`?|3>jhcQjo) zimqKh1)9%-5gY7nb6-b`wMzyGeUu*-ofKUBJK}Az?DKwML&s#3OvrD`5=9BAWkqKx z205%Ps^$6Pc)9~Y_NC;<>94+ZuUz+g0v&^a_-Gdt;yaN!8>XFl^n7<uvs>`0cg99% z?mvocIm0r(Z=LF|E%BP|6NY`iXGW&==^83Jl0T8o7#zb@GCnKMHX45BHH(Nz;Fp9w zXLST&xx{P^F#9j8{WIx_mso|XL@}6p8Kjr=qUw)HmqX~$`DMqinQ87x_r>P@yf>No zy3o{Izt(NN+^;~@WZG3KBN}Pyq;soM#Moo^G0|Xx1%586_*i$|0#osr!iOVx3lWHN zhmrhi)AI2X31Ty6Ws7E(etS}p61A^_pUV{=6`z5-By2S1k)EY~0)b*|C0<^AluEz@ z(|+DeS#{bbiigcqY9qebW{vn9M;b3>HEMPvV~X4cGeDDuKt3<#_ARGWR8;W+OZSc- zUbwzz@R({<p3kYLDmdhNtslWN^R>urp08?sR14_1aMnkZI_t2|q~SyP9pgElBxb&P zGG;?{F!|3bR2ZC-NqAelm=hp*a4E_XBXi(v`$O;Y>X-Bw!yX+K1nZ$0+P0C)F8mks zvYbv(Dl_R+)qZNq2)MrI=}~kq2k5>qYg+-=lFjrN+G!u)UqcH9PC)t7-uo0JMY1`s z4?gf)+@CU|nX>lPjEGPRo2XB<+1af5hHrAhl`9l!zCWSZx}4d-`?e_m1qpWyYxlY^ zNwk`mF$Bw<lo{b^z$BsI=T-p9G!p>xP4mBe>x`zi>|y+KYL1EMqA{zs#taqlG6DGc z8!SES1wlOF=m7nDVIe?swfGum)7r|V%7%LT>e7DQleak<11R)qul7#<CRturU3q=2 z5swMgeV(6!NgEKpHhRqQ({*`JmGOTGHnFx((6&8XcHn={|KK_$cGV}QRz|pqw-XdL z9ir$PuJ<kWJ$?fl2(ya!bt~@p%5Ei(Js29|CkVhJ?h+)f-|of%sC29Phx=OBHQN02 zWq%CmWPip^r0=vpuWFzysN%^-A#`EV%Sj68EzW{Ex1~nn&Ng_;9DTq-&200|*n_;w zX|mHy?*)<)UQ~o~aP@>V=-XIKJzUDP7%5CTF5`*pcJbRAbdz5_xKB3S59U2xM9Gh+ zG$B1#`t%!jHCI}?-)|sH%oTFa>z8lr>abuX<}qIc9Q}g}`^sgb;D1TrKbXsSH?@{1 zI@O<0W2Az{x^2~C8XxFL4^dPp%29OuMR}y7)EbLsk{HQCrL3ZOIAYuk$?%VxZ@XT- zz}{twpM<-VUvL{Zt|M(avKZbyxQojB+wLhz8*NMGvZ4R&yZFG3D(>q9&aG}t6USQp zI$A{^g2uXU)z`PQX3>59<fRFxr=8&7u}^+egE1o&`e@v=Qs*X$8^ZN1I;q&I!72^p zgRA%G85z9xF37tvqj$-4AbP0&?#MzE9WJvg5mLQew!uzaXLJ6$Vwfi$J2P_%(LKUJ zxhx~%FvSb9($a+DllE{xPJ`tgJ7q|b`}!u~6+}m5BGj+@X&XIE)O09tW;iH1*qzb2 zckFCH7UWg86!JsdewSN?bg!gfqI-x=))#aCn~2Hg3zzoy`^DAk2*U5&v0%lgy(1|+ z*+NPEn>6Ck3OZj8rIHuC2fjek^xr;Nnji%CI2RQiDh^kO&;Z#kO$u3L7WH$V$%=Hu zjCSHoi{WCd_2KhB)kBnKFPoL@>#KfPf3f<^iqm_m&CIqp(h}d(pS>h%Dl|HeOObr! zBq>qn{rOj;>B6C`w~g(WOuOEw1P(d{Ki>VA3Xy8L;Voz^sQ6cFUQoA;`nRgI9F!*1 zdN;O`F(7K^k-F8;qykbEaDtLhL9fg&K6TG_Pol86B^ljvHP6%Ujt*?c;1{2&72c9f zP3(A>Ex+Yzo9*+-?)oKRoRG>464yPO-`)0;kyN<x-sg0H@h@=J0dX-?Jlyv%77jf_ zd;MvR?)DUDbH7M1FpvH4tICFtUP!m5A}#GeSmUyH{<m0<s>uR**tu$N__lLt`<shI zO1OPEFvPD3%`4KX{E+?Wr^Ulvj5sJF^Nb(*&TB43mK(3l<w+IqE!3_MH6C>`)5hAb z2HdG<SQMV)Hz+s8KJg(8?0dW>-nQQkn*C#MFC|pTDKYbQ-Q=eK*5tvT3nrJmPcDUC zy=ezMPkWR_YX95oY;5eBzP7sC``Gh)tXe^5cvY3AB;-3k?+hGEkHK9=+ZO&8#(hH+ zqe`CuB8|apk`Ds?7Zy<{9jU}$J@2NN_n9v#ERHykdIrflZ+~Pn_z*Yl5nS-Rg>-Fn zwY{7Rm7=uB(ht0DdP2ee2hXJDr`1%;XVwLVEYA4(Ss`_xW2j-J)Kw{W`1Pl%Us3s= zo7%fdT_K;2d^_;AG@O}I%m){>3%DbIj&{J*FX<2GW-ExRUIaUoYQ6<)inbFdY_d22 zutgu)j}8V;{JtwLRY8xKBS+@Rv9p<=JOP$)obwgro`(APev5bMCU;OG*YuM)<36-T zcCq;%l*x)_%8Cr^YlQtm0JXHnc}i^jg+s<nXw2FPVexSS@`Qr>kC?~T#;Xf`M^k@{ zjc6QHkhJBcIHY4jvr_t(69RaU=PK%|lZ8!}ADx^sTOL1YV^T%H35%Z)8T7jS?NjIX z6x5J)%?-c8sq(9vYrds&$ovtChha-9mz&LI+H&ZKl*JR8V2ApT4~)aF#WFo;F@jW` zb#z$<tk}#Rs+Fv!l4E{LWzwtKQ!VE@1gf-(#!WmPtkZa@qj>BtvjW8?r}hf(P-fQQ zTqTodhHa7}5f=?!X{_^>?>LDvBh)Z^47ja0dy5-o0$|w#Nik}I!E^4PtC6X%1Qi!~ z&JC;VmEzM9+FWWqqgvM5Tm6p%@1Sz${^FCm?haoaavcQ^v>9IU@|*@ohI~L}qfNkn zg3=BF^(MjO?!fVmOuCEwG}{0@)TO+g<w#`rjxLT`PJzs0s-Edj@&;q@$@l6G^}U~L zn-5yuoiYM@_3QJA*40P-WA~9WO?ldJ{B1e6;~Jm;Wc&B3|7uEJw!}VB&K=X8@ne;Z zN|&$oU(mC1biVdA%|O8UWQ1+IhWGXE!hM&adil@JlordXtu_QuUYgfW)nb$DMRpB7 zEjlC(z8yGjXgEqsfuXmCr-@Z{+9$!;*~wpxt;KWim3^wG#?XeU+dB_3`eyK4%#Iy` zdvtDTn1Pz``z&{c@v7rp<Gu5Fi=0}URng}?R1vBQARpKO)zta2^1{M$<<ljU>-A-K z^W<fe@CH(!WU63PJ7saV{$Ll><)?%lL8khQg9Tj2k(^WOnZKO4(U=3yg_|ZI9`8&1 zJkxJoyK*+RjDGDNYAU_E^QfO2_)f>5z)Lzy0~}0BuFr@VM%#X(cW-yeg2x}Qq|K+z zy4uLs03i<e5hV5tkan_pyTm-Z{m)DX`Ig&ceFI8eRI&qv-tjRYR~Z6rVOGW~7fN=f z%aNuoWbYnF5+zc1do{7jgt31V6Rs&=1>T1s;6hjm+%n>@zCvwfio5l;3NlmjPq>^4 zDp}G-lj2bL+`t_BQ9SswdyN3k{NTORB+L$~2qlu}J;)^{uCwuu=<sd&mKr#f5Jh)U z-cH$t$uHB)h;6HSb)^%kp#l_SFEz?Qz4sZ7F3k^{5nDXHZdGM9e~vADaaERF1Mi_~ zuuN`PExDzoJk3R^<KQya7RA5C&Q{4hA)oRu>H&}V;VNDtAKG`GE{SX_C|Qe&`y}D8 zGriBbOE51(Dq6BMMn&`5J<y`+D?Bn92bOe_`nOGv8<x%B{pa^~`1C-|?tGFA#B-p~ zylrt1^9@Do(Vr95u~z<cDa?E~X_G1sJGT~*=%Y(ZxaQJXS{A!(M8D~DMOtCQ%pyp6 z9<l=DrUV%fuS&t15l6xoHtnBKwIK(M?UmmUerG05W9HskSS*UpYnVde?mcCm&OL!* z-(32dK;_kC-rfzevvB0+d*#@}yhI?K{hmu);Q$fw9Pq5T-HsG{&@3hQ|4l~MJ&9O< zZV-(FutInOJ@QtDbgboz<+aV|@N)}C#qT2o?&!P=033rdqED`gt2`0^xoLXShmkl5 zZP#lMOGjo~j3tRg(0^Rex34oLJ*7sd@la>eAcE;^)sN?EmCs^{#~V)CXH$C*OrUsr z7VkB;r@GIFDUQO<BUPFb(g;(`H)Ck@WeRp1L6c8DV1bQW(Ks9&<o?ZtwQO>N*r3wj zW@NObublJo+tm+o_(O46LbHs(7ja^x_AA^9)G_63loj7So@s*B7Zy+u9R6*zFQfBM z%)@XmiRo77ms4Y3t!;eVI$$U$yjCE?%D7If^0ULeji}*jrN*q!h6ipq>pOS9Lf!R$ zR!UND+~i38n_-qV*D2j*51%qY1qt21jzrLlJ<e2CR)@<o>AyLtzi}6>WC@<SG+?jg z;SpHHGY+S*>nXXx|Ch<->Nl*e7Y<ckR6d=<!^A0pYPWWnCN$Jq`(n{v0X*W-=P#G@ zyzu}Iw|Vzl7cB)e`Wx`-+dzC#Rt4|epUGSXfJp|aJRxlmHi6W&i2j}cJi3v*tV_-$ zXzz+$w7&X|>4WaR+nf339Jldocg=5+h?V9`V@iwUh91SLxR{nss=v%Vufd%20Tstc zA?^&J&ovW&{dscRUu*C#8tcI&mU4g+6gTI;=hZqvIfjXPO<tG^LZHzz93YE1q$8%3 zX&)%q{sp*tb{8#Ss_XsJaIRsub1JqZOZCi+e=45GK@DEV{uw>`**i(~)H<=U_k$7f z<bXTF{)K758EshwRce{jE|1&tpv3kJ)Rqt<GhAZ+I=ha|j6Ka(+Exh~H9LZGXEJ5M z@y01)FqcT>ApDlbs1AWfu1F4aJ_n^<(LDu$plL1Z+V{RhTKl*PfAJ694}QG?l~K_r zjuQG=9;%-GFnabgpr|o?sXjZ=0%omj_vDs-*IsF4W)di|Qm^Tu(V^>Xhc@m3P>96; z@WeYOf=e4V&om0)!hV99zwpkb^+0DpI^hS47={SmpWVt#^XG5!lZCLtOr%rKzkgtK z!cRcHQR!wn;-g+LvggO%^6H5L3{5-@M^Zp+afJR0qaCOfS$Gi@-jmdSa@lv$CAZ8v zr`VaG`4l@d=n&p@9aEGVB%QGm&1Q$KgcvQJ&ZXS3-*kBB!-x~6e!|<@?mt=b&MDwr zUjnL{q~5TJn&JR0N&oI#V|#cCf}G^zt^$ZmF=OktVEr^X;{hrMgW|g0SUvsTGVHx{ z{~Bo|Cbd~(@&UE9-s5oQaI>ne*X+Q(of`os-l5Y^iaudz64n1~a*Da!ng8<cOeS4q zH#n6=6&|5Ucy6J35MX6}xP8y5VdCq2GIo<|R_8?iv|&LOsMACiy3`qmud}jVa+yuj z-{qzyUzA@X<_vxa2aKm9mwOcc7o%&?d%*d!YA*LmH_i0TEORy#(P*1*W3!f6pfPX~ zHEXA2JyM=nH)EW_seSM&t*tp6F0ll<#T+3P4g2cfIs_b$XUn#def(HpJDN7R3VdLa z1UqSb8*GL?(WqKkbTuwS;%<?auc&Mk;>j_mQ}{YP|H+79_s6#ky3Q*lL|UDoc#(n7 zg~chR13<&Z{P(x~(uBeU^UH;D-x2|KCrtvqg)&|S;;Zg0tGULnCw4cbuZG&Q4++2L z*CER)1f&g%hYuT02;lp=px+Zva5Vb&-@OA7<n9dwDD6mntxef&Y$bc*U(Q}+SWb3r z7ln;Ylm?p#q>%(ihl}n}i<d6I4t%so3pucrcnE8Xf1!QbXhbtytNBNiqEgx|&@TrO zC<#o{R<6MIpDotR((6|eN!DYw(d+D+Y)Gqkxh%A^VC8$ss{OdwNT^7}Rc2nvZd?Aj zd7&oX&gND!8D2|_WiVrFwzzljr1BF~XMg)aL|*4jCSn+JTcZXI<3uW`^hy#k?J=s| zli=I}byIAC1hg@d(TDEVznW7qS=o=GXT^{2uNv>gUE=etEX@)6njVa#Qe!e8pzQSC zw+8?zx=hLiwsmv;NXjpD>%$DDVSLyGtP7KyO;y2in=NYb9RwmcrsTDZsMvx@vW>1& z3@YfIde__D*qF;^7lp4x=f@|2p%h~#1N<CL&NQ=wK?kG+z}<O8^91EX#jL6pD|39R zZj^?lZ*mq{;GE|%NrLUV{VfvNM*WJxYrLW5_X0S4Xy9G={E0!`9(>i2WP#A+(PtJQ zc&)RC#vW{3or?SkW2hhh=J*R>uhG`em-t<$crRsuAswY@lWDduIRO6<8s}Kmhv(~8 zsKqafP(JJ~*$FT4arF3>^Eo4Rn4Fqb(K$d%sovs(-}Z@Sw@5M-MHW4+k21V}Y}^Ol zytrcYn9_a2PozoB+sP3O=ioY9u6B!Tv&CV}tAx;XBH9Z!CG&G|iaJl;#9OEOe#hJH zzM2%5oD6k`!&`>IfF6a-urVBt6liElvyWDjB0zdmV=;rxeunR;-40^>GBD(^h4DuT zZmedo{uH5ZQjw^qaj4kdU6l%rwFA{&(vD*=Jb$l%v4x+qG$AViYCqTRZm(ZOEg>m9 z=W^}v>Q*%!wXv&{gIJ<s$7NJmD{PRHo86f#N>MmLQTY9GI}JF#pi@H(O8C<(b-k2v z%EaW47+jq-=kU$f4(c*C+=7US9Iep&Aw$SJKA`d_+-WBq2SGyYAHh|;i8%0$+afOa z?si+TStSe~!r;qhxzFzZA+&t=pfY2eG3CH?8AEutWB6sf-s3@JS`W=RokV)ZX4VgR z)c(=wwjRG~_WT8UE*ZN!iajXS8j^&7PhizTMR3=rlaB|!Ho0rc@Ag*}x;r950jKnt zeKcV(%kSdRWlW(TVKJg5K+qP$kNu6qScCZ&vTtjoU8|sr#96CJvS+saKXw6r%O<*) zXuD_9pLB6L9{w;FENYWRVg$Q@bbILh+ux|ATwCLPA@uZs1MneG4H}WvV%2BSr@nJI zis0&;XP=)Bcb>0$!~8?23jtS2Bn?LSz)Pf2XyECn;9CNdujVei58a0a+OogCTzYb; z?n?S<@c4!73lReYuRe?SS+}H-vzlx186w+mxoih$grcUIf^zIePwa$9Kozr^IsLgW zXjy-YnK>0CLED*V0TO~~5y~>YnAt1D;f#Y*xo#C(V|V6Uy$sHNx)hPrGhXtdy(2sK zM4asvkB7U>!504T_x{}4fXsL(KfW9z<^X4I1UaM8`5;~qS22{bT4#6YIqeD9to7La zP8D8M2~)}PI^zg#P6gZ}r?Ts=*u#bU3V~h)uy&E|H*a#xK_}DVr>Ks++1i7LR?%hc z1=$@<mXY}d#s>0Q<zshdK&K{(zP&1x_nmqSrV<@g($qtoO=G^I=!CkmYKT_#ySjZj zj_Q1rv%GktKH7IK1WxN2cFr1aJ|rkl6d&q8GR)wg;hnFY56wxtTwx+f$N>c_qF{E$ z#&%w1o$RBfsG^<WXkhgV2YQa#S7Vuj<psWuF{R%GFS&w~Ms2}N6%I;h8L$Z0!mMJ7 z{&XI(B<S=wEAc-SyN`3kS<;#w_W=e`^mAl@4-_`H6-E;K%;%+WfP%XpMz>LXmRGm+ zWK!<{zDkLgvA>?y!tH-ow^<WkFIlg;JX$_P#Vs&Pm|V!(n0XdvV8<lg#jcwLE8X73 z*C{p2#a!6@CTffWz$i7Hw<qhLb+;@BR-<R*J+YpoSR>wcJuxjmW1M7-4vB6Gj`wjP zeKe8Dn&Y(S_zrP|A4~Dvxl2kb+vSaxjG9#RB;lCeKe=4#U$FHc30uCz6qO3PWt{at zk`RP0GoAE~0|+f61_1{Dt0vL<BlB6{bJcT~#s9`29$!+I36ck-_zu952`q-(@YhiS zvzNB)5U9;&9+_tH61~4vuLNRABn3w<%#fAjUsr3C*TgB_AAxcq`oyC=E-M9^8f?Pl z7lVxN27pmGU!#g_H~M>F!Zh<G(Shm@N{_=JivTecUqX#$XU4^}uT;~#+GxlL7!w#k zd7+;O-?d={ZX`$&N==W_e*2-ZNNx;^#%8m>m@=8RsQHlu33($SAaZ>x*go<@<)_8K Q9pF#rw&AVfn|3e$4@pH~>;M1& literal 0 HcmV?d00001 diff --git a/hianime/iconapp.png b/hianime/iconapp.png new file mode 100644 index 0000000000000000000000000000000000000000..894598acb83ec6ad8eb01a49310756577e1d360a GIT binary patch literal 56218 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⪰#@ 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%0DhPS-@>i1&> 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 G!oLC3Ve8xg literal 0 HcmV?d00001 diff --git a/honadrama/honadrama.js b/honadrama/honadrama.js new file mode 100644 index 0000000..064716e --- /dev/null +++ b/honadrama/honadrama.js @@ -0,0 +1,124 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://tn.honadrama.us/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div class="movie"><a href="([^"]+)".*?<img src="([^"]+)"[^>]*>.*?<h3>(.*?)<\/h3>/gs; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descriptionMatch = (/<div class="StoryMovie">(.*?)<\/div>/s.exec(html) || [])[1]; + + return JSON.stringify([{ + description: descriptionMatch ? descriptionMatch.trim() : "N/A", + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)" class="WatchButton">/; + const match = regex.exec(html); + + if (match) { + results.push({ + href: match[1].trim(), + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const serverRegex = /<li\s+([^>]*?)data-server="(\d+)"\s+data-q="(\d+)"[^>]*>/g; + const servers = []; + let match; + while ((match = serverRegex.exec(html)) !== null) { + servers.push({ + server: match[2], + q: match[3] + }); + } + + let uqloadUrl = null; + + for (const s of servers) { + const ajaxUrl = `https://tn.honadrama.us/wp-admin/admin-ajax.php?action=serverPost&server=${s.server}&q=${s.q}`; + const serverResp = await fetchv2(ajaxUrl); + const serverHtml = await serverResp.text(); + + const iframeMatch = /<iframe\s+[^>]*src="([^"]*uqload\.[a-z]{2,3}[^"]*)"/i.exec(serverHtml); + + if (iframeMatch) { + uqloadUrl = iframeMatch[1]; + console.log("[Debug] Uqload iframe found:"+ uqloadUrl); + break; + } + } + + if (!uqloadUrl) { + return "https://files.catbox.moe/avolvc.mp4"; + } + + const uqResp = await fetchv2(uqloadUrl); + const uqHtml = await uqResp.text(); + + const mp4Match = /sources:\s*\["([^"]+\.mp4)"]/i.exec(uqHtml); + if (mp4Match) { + return mp4Match[1]; + } else { + console.log("[Debug] No MP4 found in uqload page, returning default"); + return "https://files.catbox.moe/avolvc.mp4"; + } + + } catch (err) { + console.log("[Error] Fetching stream failed:", err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + diff --git a/honadrama/honadrama.json b/honadrama/honadrama.json new file mode 100644 index 0000000..5c134bb --- /dev/null +++ b/honadrama/honadrama.json @@ -0,0 +1,18 @@ +{ + "sourceName": "HonaDrama", + "iconUrl": "https://tn.honadrama.us/wp-content/uploads/2023/06/cropped-logo-google-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Arabic", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://uqload.cx/", + "searchBaseUrl": "https://uqload.cx/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/honadrama/honadrama.js", + "type": "shows/movies", + "asyncJS": true, + "downloadSupport": false +} diff --git a/iyinghua/iyinghua.js b/iyinghua/iyinghua.js new file mode 100644 index 0000000..9898f44 --- /dev/null +++ b/iyinghua/iyinghua.js @@ -0,0 +1,82 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`http://www.iyinghua.com/search/${keyword}/`); + const html = await response.text(); + + const regex = /<a href="(\/show\/\d+\.html)"><img src="(http[^"]+)" alt="([^"]+)"><\/a><h2><a href="[^"]+" title="([^"]+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[4].trim(), + image: match[2].trim(), + href: `http://www.iyinghua.com${match[1].trim()}` + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const descriptionRegex = /<div class="info">([^<]+)<\/div>/; + const descriptionMatch = descriptionRegex.exec(html); + const description = descriptionMatch ? descriptionMatch[1].trim() : 'N/A'; + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const episodeRegex = /<li><a href="(\/v\/\d+-([\dpv]+)\.html)" target="_blank">([^<]+)<\/a><\/li>/g; + + let match; + let episodeCount = 0; + + while ((match = episodeRegex.exec(html)) !== null) { + const href = `http://www.iyinghua.com${match[1].trim()}`; + const number = match[2].match(/^\d+$/) ? parseInt(match[2], 10) : null; + + if (number !== null) { + results.push({ href, number }); + } else { + episodeCount++; + } + } + + if (results.length === 0 && episodeCount > 0) { + episodeRegex.lastIndex = 0; + let index = 1; + while ((match = episodeRegex.exec(html)) !== null) { + results.push({ + href: `http://www.iyinghua.com${match[1].trim()}`, + number: index++ + }); + } + } + results.reverse(); + return JSON.stringify(results); +} + +async function extractStreamUrl(url) { + const response = await fetchv2(url); + const html = await response.text(); + console.error(html); + + const streamRegex = /data-vid="([^"]+)"/; + const match = streamRegex.exec(html); + return match ? match[1] : null; + } + diff --git a/iyinghua/iyinghua.json b/iyinghua/iyinghua.json new file mode 100644 index 0000000..1e201dd --- /dev/null +++ b/iyinghua/iyinghua.json @@ -0,0 +1,18 @@ +{ + "sourceName": "Iyinghua", + "iconUrl": "https://files.catbox.moe/mh7uxf.ico", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "hhttp://www.iyinghua.com/", + "searchBaseUrl": "http://www.iyinghua.com/%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/iyinghua/iyinghua.js", + "asyncJS": true, + "type": "anime", + "note": "SOME STUFF IS REGION LOCKED" +} diff --git a/kaido/kaido.js b/kaido/kaido.js new file mode 100644 index 0000000..cbbcad9 --- /dev/null +++ b/kaido/kaido.js @@ -0,0 +1,149 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://kaido.to/search?keyword=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const itemRegex = /<div class="flw-item">([\s\S]*?)<div class="clearfix"><\/div>/g; + let itemMatch; + + while ((itemMatch = itemRegex.exec(html)) !== null) { + const block = itemMatch[1]; + + const hrefMatch = block.match(/<a href="([^"]+)"[^>]*class="film-poster-ahref[^"]*"[^>]*>/); + let href = hrefMatch ? hrefMatch[1].trim() : ""; + if (href && href.includes('?')) { + href = href.split('?')[0]; + } + + const imgMatch = block.match(/<img[^>]*data-src="([^"]+)"[^>]*>/); + const image = imgMatch ? imgMatch[1].trim() : ""; + + const titleMatch = block.match(/<h3 class="film-name">[^>]*<a[^>]*>([^<]+)<\/a>/); + let extractedTitle = titleMatch ? titleMatch[1].trim() : ""; + extractedTitle = cleanTitle(extractedTitle); + + if (href || image || extractedTitle) { + results.push({ + title: extractedTitle, + image, + href + }); + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + + +async function extractDetails(id) { + try { + const response = await fetchv2("https://kaido.to" + id); + const html = await response.text(); + + const descMatch = html.match(/<div class="film-description m-hide">[\s\S]*?<div class="text">([\s\S]*?)<\/div>/); + const description = descMatch ? descMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(id) { + const results = []; + try { + const numericIdMatch = id.match(/-(\d+)$/); + const numericId = numericIdMatch ? numericIdMatch[1] : id; + + const response = await fetchv2("https://kaido.to/ajax/episode/list/" + numericId); + const data = await response.json(); + const html = data.html; + + const regex = /<a[^>]*class="ssl-item\s+ep-item"[\s\S]*?data-number="(\d+)"[\s\S]*?href="([^"]+)"[\s\S]*?>[\s\S]*?data-jname="([^"]+)"/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[2].trim(), + number: parseInt(match[1], 10) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error", + title: "Error" + }]); + } +} + +async function extractStreamUrl(id) { + try { + const epMatch = id.match(/ep=(\d+)$/); + const numericId = epMatch ? epMatch[1] : id; + + const url = "https://kaido.to/ajax/episode/servers?episodeId=" + numericId; + console.log(url); + + const response = await fetchv2(url); + const json = await response.json(); + console.log(JSON.stringify(json)); + + const html = json.html; + const serverMatch = html.match(/<div class="item server-item"[^>]*data-id="(\d+)"[^>]*>\s*<a[^>]*>Vidstreaming<\/a>/); + const vidstreamingId = serverMatch ? serverMatch[1] : null; + + const someResponse = await fetchv2("https://kaido.to/ajax/episode/sources?id=" + vidstreamingId); + const someJson = await someResponse.json(); + console.log(JSON.stringify(someJson)); + + const link = someJson.link; + const codeMatch = link.match(/\/e-1\/([a-zA-Z0-9]+)\?/); + const code = codeMatch ? codeMatch[1] : null; + + const anotherResponse = await fetchv2("https://rapid-cloud.co/embed-2/v2/e-1/getSources?id=" + code); + const anotherJson = await anotherResponse.json(); + console.log(JSON.stringify(anotherJson)); + + const streamFile = anotherJson.sources && anotherJson.sources.length > 0 ? anotherJson.sources[0].file : null; + + let subtitleFile = null; + if (anotherJson.tracks && anotherJson.tracks.length > 0) { + const englishTrack = anotherJson.tracks.find(track => track.label.toLowerCase() === "english"); + if (englishTrack) subtitleFile = englishTrack.file; + } + + const result = { + stream: streamFile, + subtitles: subtitleFile + }; + return JSON.stringify(result); + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} diff --git a/kaido/kaido.json b/kaido/kaido.json new file mode 100644 index 0000000..02e33d2 --- /dev/null +++ b/kaido/kaido.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Kaido", + "iconUrl": "https://kaido.to/images/favicon.png?v=0.1", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "3.0.2", + "language": "English (SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://rapid-cloud.co/", + "searchBaseUrl": "https://rapid-cloud.co/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/kaido/kaido.js", + "type": "anime", + "asyncJS": true, + "softsub": true, + "downloadSupport": true +} diff --git a/kawaiifu/kawaiifu.js b/kawaiifu/kawaiifu.js new file mode 100644 index 0000000..23a2a85 --- /dev/null +++ b/kawaiifu/kawaiifu.js @@ -0,0 +1,169 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://kawaiifu.com/search-movie?keyword=" + encodeURIComponent(keyword)+ "&cat-get="); + const html = await response.text(); + + const regex = /<a class="thumb" href="([^"]+)"><img src="([^"]+)"[^>]*alt="([^"]+)"><\/a>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + let href = match[1].trim(); + href = href.replace("https://kawaiifu.com/", "https://domdom.stream/anime/").replace(/\.html$/, ""); + + results.push({ + href: href, + image: match[2].trim(), + title: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + + +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const summaryMatch = html.match(/<h5[^>]*>Summary<\/h5>([\s\S]*?)(?=<\/div>|$)/i); + + if (!summaryMatch) { + return JSON.stringify([{ + description: "Description not found", + aliases: "N/A", + airdate: "N/A" + }]); + } + + let description = summaryMatch[1] + .replace(/<[^>]*>/g, '') + .replace(/’/g, "'") + .replace(/ /g, ' ') + .replace(/&/g, '&') + .replace(/\s+/g, ' ') + .trim(); + + if (!description) { + description = "No description available"; + } + + let aliases = "N/A"; + const italicMatch = summaryMatch[1].match(/<i>([^<]+)<\/i>/); + if (italicMatch) { + aliases = italicMatch[1].trim(); + } + + let airdate = "N/A"; + const yearMatch = description.match(/(\d{4})/); + if (yearMatch) { + airdate = yearMatch[1]; + } + + return JSON.stringify([{ + description: description, + aliases: aliases, + airdate: airdate + }]); + + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const listRegex = /<ul class="list-ep"[^>]*>([\s\S]*?)<\/ul>/; + const listMatch = html.match(listRegex); + + if (!listMatch) { + return JSON.stringify([]); + } + + const listContent = listMatch[1]; + + const linkRegex = /<a\s+href="([^"]+)"[\s\S]*?>([\s\S]*?)<\/a>/g; + + let match; + while ((match = linkRegex.exec(listContent)) !== null) { + const href = match[1]; + const text = match[2].replace(/\s+/g, ' ').trim(); + + let number = 1; + + const textMatch = text.match(/Ep\s*(\d+)/i); + if (textMatch) { + number = parseInt(textMatch[1], 10); + } + else { + const urlMatch = href.match(/[?&]ep=(\d+)/); + if (urlMatch) { + number = parseInt(urlMatch[1], 10); + } + } + + results.push({ + href: href, + number: number + }); + } + + results.sort((a, b) => a.number - b.number); + + return JSON.stringify(results); + } catch (err) { + console.error('Extract episodes error:', err); + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const patterns = [ + /<source\s+src="([^"]+\.mp4[^"]*)"[^>]*>/i, + /atr_id="([^"]+\.mp4[^"]*)"[^>]*>/i, + /<video[^>]+src="([^"]+\.mp4[^"]*)"[^>]*>/i + ]; + + for (const pattern of patterns) { + const match = html.match(pattern); + if (match && match[1]) { + return match[1]; + } + } + + return "https://files.catbox.moe/avolvc.mp4"; + + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} diff --git a/kawaiifu/kawaiifu.json b/kawaiifu/kawaiifu.json new file mode 100644 index 0000000..e05b5f1 --- /dev/null +++ b/kawaiifu/kawaiifu.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Kawaiifu", + "iconUrl": "https://kawaiifu.com/wp-content/uploads/2018/05/Kawaiifu_favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English (DUB/SUB)", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://kawaiifu.com/", + "searchBaseUrl": "https://kawaiifu.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/kawaiifu/kawaiifu.js", + "type": "animes", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/kawaiines/kawaiines.js b/kawaiines/kawaiines.js new file mode 100644 index 0000000..2612630 --- /dev/null +++ b/kawaiines/kawaiines.js @@ -0,0 +1,82 @@ +async function searchResults(keyword) { + try { + const response = await fetchv2("https://kawaiines.onrender.com/api/anime"); + const data = await response.json(); + + const results = data + .filter(anime => anime.title.toLowerCase().includes(keyword.toLowerCase())) + .map(anime => ({ + title: anime.title, + image: anime.image, + href: anime.animeUrl + })); + + return JSON.stringify(results); + } catch (err) { + console.error(err); + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(id) { + try { + const response = await fetchv2(`https://kawaiines.onrender.com/api/anime/url/${id}`); + const json = await response.json(); + + return JSON.stringify([{ + description: json.description || "N/A", + aliases: "N/A", + airdate: json.date || "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(id) { + const results = []; + try { + const response = await fetchv2(`https://kawaiines.onrender.com/api/anime/url/${id}`); + const json = await response.json(); + + for (const [number, url] of Object.entries(json.videoIds)) { + if (url.includes("drive.google.com")) continue; + + let href = url; + if (url.includes("strmup.cc/")) { + href = url.split("/").pop(); + } + + results.push({ + href: href, + number: parseInt(number, 10) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(id) { + try { + const response = await fetchv2(`https://strmup.cc/ajax/stream?filecode=${id}`); + const json = await response.json(); + + return json.streaming_url || "https://error.org/"; + } catch (err) { + return "https://error.org/"; + } +} diff --git a/kawaiines/kawaiines.json b/kawaiines/kawaiines.json new file mode 100644 index 0000000..47595f0 --- /dev/null +++ b/kawaiines/kawaiines.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Kawaiines", + "iconUrl": "https://kawaiines.in/logo.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Hindi", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://kawaiines.in/", + "searchBaseUrl": "https://kawaiines.in/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/kawaiines/kawaiines.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/kimcartoon/kimcartoon.js b/kimcartoon/kimcartoon.js new file mode 100644 index 0000000..0b964b1 --- /dev/null +++ b/kimcartoon/kimcartoon.js @@ -0,0 +1,115 @@ +async function searchResults(keyword) { + const searchUrl = `https://kimcartoon.com.co/?s=${encodeURIComponent(keyword)}`; + try { + const response = await fetch(searchUrl); + const html = await response; + const results = []; + const articleRegex = /<article[^>]*class="bs styletwo"[\s\S]*?<\/article>/g; + const items = html.match(articleRegex) || []; + + function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); + } + + items.forEach((itemHtml) => { + const titleMatch = itemHtml.match(/<a[^>]*href="([^"]+)"[^>]*title="([^"]+)"/); + const imgMatch = itemHtml.match(/<img[^>]*src="([^"]+)"/); + if (!titleMatch || !imgMatch) return; + const href = `${titleMatch[1].trim()}?video_index=2`; + const title = cleanTitle(titleMatch[2].trim()); + const imageUrl = imgMatch[1].trim(); + results.push({ title, image: imageUrl, href }); + }); + + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + throw error; + } +} + +async function extractDetails(url) { + const response = await fetch(url); + const html = await response; + const details = []; + const descriptionMatch = html.match(/<div class="entry-content" itemprop="description">\s*<p>(.*?)<\/p>/); + const description = descriptionMatch ? descriptionMatch[1].trim() : `N/A`; + + details.push({ + description, + alias: 'N/A', + airdate: 'N/A' + }); + + console.log(JSON.stringify(details)); + return JSON.stringify(details); +} +async function extractEpisodes(url) { + const response = await fetch(url); + const html = await response; + const episodes = []; + + const allMatches = [...html.matchAll(/<li[^>]*>\s*<a href="([^"]+)">\s*<div class="epl-title">([^<]*) <\/div>/g)]; + + for (const match of allMatches) { + const href = match[1].trim(); + const title = match[2].trim(); + + if (title.startsWith("Episode")) { + const numberMatch = title.match(/Episode (\d+)/); + if (numberMatch && numberMatch[1]) { + episodes.push({ + href: href, + number: parseInt(numberMatch[1], 10) + }); + } + } else { + episodes.push({ + href: href, + number: 1 + }); + } + } + + episodes.reverse(); + console.log(JSON.stringify(episodes)); + return JSON.stringify(episodes); +} + +async function extractStreamUrl(url) { + const embedResponse = await fetch(url); + const data = await embedResponse; + + const embedMatch = data.match(/<div class="pembed" data-embed="(.*?)"/); + if (embedMatch && embedMatch[1]) { + let embedUrl = embedMatch[1].trim(); + + let fullEmbedUrl; + if (embedUrl.startsWith('//')) { + fullEmbedUrl = 'https:' + embedUrl; + } else if (embedUrl.startsWith('http://') || embedUrl.startsWith('https://')) { + fullEmbedUrl = embedUrl; + } else { + fullEmbedUrl = 'https://' + embedUrl; + } + + console.log(fullEmbedUrl); + const embedPageResponse = await fetch(fullEmbedUrl); + const embedPageData = await embedPageResponse; + + console.log(embedPageData); + const m3u8Match = embedPageData.match(/sources:\s*\[\{file:"(https:\/\/[^"]*\.m3u8)"/); + if (m3u8Match && m3u8Match[1]) { + const m3u8Url = m3u8Match[1]; + console.log(m3u8Url); + return m3u8Url; + } else { + throw new Error("M3U8 URL not found."); + } + } else { + throw new Error("Embed URL not found."); + } +} diff --git a/kimcartoon/kimcartoon.json b/kimcartoon/kimcartoon.json new file mode 100644 index 0000000..4eb3316 --- /dev/null +++ b/kimcartoon/kimcartoon.json @@ -0,0 +1,17 @@ +{ + "sourceName": "KimCartoon", + "iconUrl": "https://i2.wp.com/kimcartoon.com.co/wp-content/uploads/2023/03/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English (DUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://vidmoly.to/", + "searchBaseUrl": "https://kimcartoon.com.co/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/kimcartoon/kimcartoon.js", + "asyncJS": true, + "type": "anime/shows/movies" +} diff --git a/kissasian/kissasian.js b/kissasian/kissasian.js new file mode 100644 index 0000000..74c470b --- /dev/null +++ b/kissasian/kissasian.js @@ -0,0 +1,222 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://kissasian.cam/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)">\s*<div class="epl-num">([\d.]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + results.reverse(); + return JSON.stringify(results); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const iframeMatch = html.match(/<iframe[^>]+src="(https?:\/\/[^"]*justplay[^"]*)"/i); + if (iframeMatch && iframeMatch[1]) { + + const headers = { + 'Referer': 'https://kissasian.cam/' + }; + const response2 = await fetchv2(iframeMatch[1], headers); + const html2 = await response2.text(); + + const iframeMatch2 = html2.match(/<iframe[^>]+src="(https?:\/\/[^"]*zjet7[^"]*)"/i); + if (iframeMatch2 && iframeMatch2[1]) { + const response3 = await fetchv2(iframeMatch2[1]); + const html3 = await response3.text(); + + const obfuscatedScript = html3.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + const unpackedScript = unpack(obfuscatedScript[1]); + const fileMatch = unpackedScript.match(/file\s*:\s*"([^"]*\.m3u8[^"]*)"/i); + const fileUrl = fileMatch ? fileMatch[1] : null; + console.log('m3u8: '+ fileUrl); + + return fileUrl; + } + + return "https://error.org/"; + } + + return "https://error.org/"; + } catch (err) { + console.error(err); + return "https://error.org/"; + } +} + + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + diff --git a/kissasian/kissasian.json b/kissasian/kissasian.json new file mode 100644 index 0000000..a6b39b9 --- /dev/null +++ b/kissasian/kissasian.json @@ -0,0 +1,19 @@ +{ + "sourceName": "KissAsian", + "iconUrl": "https://kissasian.cam/wp-content/uploads/2020/02/cropped-icon-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Chinese", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://zjet7.com", + "searchBaseUrl": "https://zjet7.com", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/kissasian/kissasian.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/kisscartoon/kisscartoon.js b/kisscartoon/kisscartoon.js new file mode 100644 index 0000000..506fcc4 --- /dev/null +++ b/kisscartoon/kisscartoon.js @@ -0,0 +1,121 @@ +async function searchResults(keyword) { + const results = []; + const regex = /<div title='.*?<img .*?src="(.*?)".*?>.*?<a class="item_movies_link" href="(.*?)">(.*?)<\/a>/gs; + + try { + const response = await fetchv2("https://kisscartoon.sh/Search/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + image: match[1].trim(), + href: match[2].trim(), + title: match[3].replace(/<.*?>/g, '').trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="summary">\s*<p>(.*?)<\/p>\s*<\/div>/s); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + + const regex = /<div>\s*<div>\s*<h3>\s*<a href="(.*?)" title=".*?">/gs; + + const dateRegex = /<div>\s*<div>\s*<h3>.*?<\/h3>\s*<\/div>\s*<div>(.*?)<\/div>/s; + + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match; + let count = 1; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: count++ + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error", + airdate: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const idMatch = url.match(/id=(\d+)/); + const id = idMatch ? idMatch[1] : null; + + const headers = { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'X-Requested-With': 'XMLHttpRequest', + 'Referer': url, + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' + }; + + const postData = `episode_id=${id}`; + const response = await fetchv2("https://kisscartoon.sh/ajax/anime/load_episodes_v2?s=tserver", headers, 'POST', postData); + const json = await response.json(); + + const iframeMatch = json.value.match(/<iframe .*?src="(.*?)"/); + const iframeSrc = iframeMatch ? iframeMatch[1] : null; + + if (!iframeSrc) return "https://error.org/"; + + const headers2 = { + 'Referer': "https://kisscartoon.sh", + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' + }; + const iframeResponse = await fetchv2(iframeSrc, headers2); + const iframeHtml = await iframeResponse.text(); + + const sourcesMatch = iframeHtml.match(/sources:\s*(\[\{.*?\}\])/s); + if (!sourcesMatch) return "https://error.org/"; + + const sources = JSON.parse(sourcesMatch[1]); + const fileUrl = sources.length > 0 ? sources[0].file : null; + + return fileUrl || "https://error.org/"; + } catch (err) { + return "https://error.org/"; + } +} + + + diff --git a/kisscartoon/kisscartoon.json b/kisscartoon/kisscartoon.json new file mode 100644 index 0000000..44b356c --- /dev/null +++ b/kisscartoon/kisscartoon.json @@ -0,0 +1,20 @@ +{ + "sourceName": "KissCartoon", + "iconUrl": "https://files.catbox.moe/ajv0go.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://kisscartoon.sh/", + "searchBaseUrl": "https://kisscartoon.sh/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/kisscartoon/kisscartoon.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false, + "note": "Only works with nPlayer: https://nplayer.com/" +} diff --git a/lmanime/lmanime.js b/lmanime/lmanime.js new file mode 100644 index 0000000..1e5866e --- /dev/null +++ b/lmanime/lmanime.js @@ -0,0 +1,115 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://lmanime.com/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)">\s*<div class="epl-num">([\d.]+)<\/div>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: parseInt(match[2], 10) + }); + } + results.reverse(); + return JSON.stringify(results); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const iframeMatch = html.match(/dailymotion\.com\/embed\/video\/([a-zA-Z0-9]+)/); + if (!iframeMatch) return JSON.stringify({ streams: [], subtitles: "" }); + + const videoId = iframeMatch[1]; + + const metaRes = await fetchv2(`https://www.dailymotion.com/player/metadata/video/${videoId}`); + const metaJson = await metaRes.json(); + const hlsLink = metaJson.qualities?.auto?.[0]?.url; + if (!hlsLink) return JSON.stringify({ streams: [], subtitles: "" }); + + async function getBestHls(hlsUrl) { + try { + const res = await fetchv2(hlsUrl); + const text = await res.text(); + const regex = /#EXT-X-STREAM-INF:.*RESOLUTION=(\d+)x(\d+).*?\n(https?:\/\/[^\n]+)/g; + const streams = []; + let match; + while ((match = regex.exec(text)) !== null) { + streams.push({ width: parseInt(match[1]), height: parseInt(match[2]), url: match[3] }); + } + if (streams.length === 0) return hlsUrl; + streams.sort((a, b) => b.height - a.height); + return streams[0].url; + } catch { + return hlsUrl; + } + } + + const bestHls = await getBestHls(hlsLink); + + const subtitles = metaJson.subtitles?.data?.['en-auto']?.urls?.[0] || ""; + + const result = { + streams: ["english", bestHls], + subtitles: subtitles + }; + + console.log("Extracted stream result:" + JSON.stringify(result)); + + return JSON.stringify(result); + } catch { + const empty = { streams: [], subtitles: "" }; + console.log("Extracted stream result:" + JSON.stringify(empty)); + return JSON.stringify(empty); + } +} diff --git a/lmanime/lmanime.json b/lmanime/lmanime.json new file mode 100644 index 0000000..a3c213f --- /dev/null +++ b/lmanime/lmanime.json @@ -0,0 +1,19 @@ +{ + "sourceName": "LmAnime", + "iconUrl": "https://lmanime.com/wp-content/uploads/2022/09/cropped-site-icon-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://lmanime.com/", + "searchBaseUrl": "https://lmanime.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/lmanime/lmanime.js", + "type": "anime", + "asyncJS": true, + "softsub": true, + "downloadSupport": false +} diff --git a/luciferdonghua/luciferdonghua.js b/luciferdonghua/luciferdonghua.js new file mode 100644 index 0000000..67dedfe --- /dev/null +++ b/luciferdonghua/luciferdonghua.js @@ -0,0 +1,125 @@ +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://luciferdonghua.in/?s=${keyword}`); + const html = await response.text(); + + const regex = /<article class="bs"[^>]*>.*?<a href="([^"]+)"[^>]*>.*?<img src="([^"]+)"[^>]*>.*?<h2[^>]*>(.*?)<\/h2>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: cleanTitle(match[3].trim()), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="entry-content"[^>]*>([\s\S]*?)<\/div>/); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, '') + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(code)) + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, "&") + .trim(); + } + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<li data-index="\d+">[\s\S]*?<a href="([^"]+)">/g; + + let match; + let count = 1; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: count + }); + count++; + } + + results.reverse(); + return JSON.stringify(results.reverse()); +} + + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const iframeMatch = html.match(/<meta itemprop="embedUrl" content="https?:\/\/geo\.dailymotion\.com\/player\/[^?]+\.html\?video=([a-zA-Z0-9]+)"/); + if (!iframeMatch) return JSON.stringify({ streams: [], subtitles: "" }); + + const videoId = iframeMatch[1]; + + const metaRes = await fetchv2(`https://www.dailymotion.com/player/metadata/video/${videoId}`); + const metaJson = await metaRes.json(); + const hlsLink = metaJson.qualities?.auto?.[0]?.url; + if (!hlsLink) return JSON.stringify({ streams: [], subtitles: "" }); + + async function getBestHls(hlsUrl) { + try { + const res = await fetchv2(hlsUrl); + const text = await res.text(); + const regex = /#EXT-X-STREAM-INF:.*RESOLUTION=(\d+)x(\d+).*?\n(https?:\/\/[^\n]+)/g; + const streams = []; + let match; + while ((match = regex.exec(text)) !== null) { + streams.push({ width: parseInt(match[1]), height: parseInt(match[2]), url: match[3] }); + } + if (streams.length === 0) return hlsUrl; + streams.sort((a, b) => b.height - a.height); + return streams[0].url; + } catch { + return hlsUrl; + } + } + + const bestHls = await getBestHls(hlsLink); + + const subtitles = metaJson.subtitles?.data?.['en-auto']?.urls?.[0] || ""; + + const result = { + streams: ["english", bestHls], + subtitles: subtitles + }; + + console.log("Extracted stream result:" + JSON.stringify(result)); + + return bestHls; + } catch { + console.log("Extracted stream result:" + JSON.stringify(empty)); + return JSON.stringify("empty"); + } +} diff --git a/luciferdonghua/luciferdonghua.json b/luciferdonghua/luciferdonghua.json new file mode 100644 index 0000000..5589c94 --- /dev/null +++ b/luciferdonghua/luciferdonghua.json @@ -0,0 +1,19 @@ +{ + "sourceName": "LuciferDonghua", + "iconUrl": "https://i.ibb.co/MwKW01H/cropped-lucifer-donghua-DP-192x192-webp.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "HLS", + "quality": "4K", + "baseUrl": "https://luciferdonghua.in/", + "searchBaseUrl": "https://luciferdonghua.in/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/luciferdonghua/luciferdonghua.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/mavanimes/mavanimes.js b/mavanimes/mavanimes.js new file mode 100644 index 0000000..8fe3351 --- /dev/null +++ b/mavanimes/mavanimes.js @@ -0,0 +1,225 @@ +async function searchResults(keyword) { + const results = []; + const headers = { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "X-Requested-With": "XMLHttpRequest" + }; + const regex = /background-image:\s*url\("([^"]+)"\)[^]*?<h3><a[^']+'([^']+)'[^>]*>\s*([^<]+)/g; + const postData = `action=ajaxsearchlite_search&aslp=${keyword}&asid=1&options=qtranslate_lang%3D0%26set_intitle%3DNone%26set_incontent%3DNone%26set_inexcerpt%3DNone%26set_inpages%3DNone`; + try { + const response = await fetchv2("https://www.mavanimes.co/wp-admin/admin-ajax.php", headers, "POST", postData); + const html = await response.text(); + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[1].trim(), + href: match[2].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + return JSON.stringify([{ + description: "Désolé, le format des données est incohérent, impossible d’extraire de manière fiable.", + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + const regex = /<h2[^>]*>\s*<a href="([^"]+)">/gi; + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match; + let count = 1; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: count + }); + count++; + } + + results.forEach((item, i) => { + item.number = results.length - i; + }); + + return JSON.stringify(results.reverse()); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const voeMatch = html.match(/https:\/\/voe\.sx\/e\/[a-zA-Z0-9]+/); + if (!voeMatch) return null; + + const voeLink = voeMatch[0]; + + const voeResponse = await fetchv2(voeLink); + const voeHtml = await voeResponse.text(); + + const redirectMatch = voeHtml.match(/window\.location\.href\s*=\s*['"]([^'"]+)['"]/); + if (!redirectMatch) return null; + + const finalLink = redirectMatch[1]; + + const streamUrlOne = finalLink; + + const responseTwo = await fetchv2(streamUrlOne); + const finalHtml = await responseTwo.text(); + + let streamUrl = null; + try { + streamUrl = voeExtractor(finalHtml); + } catch (error) { + console.log("VOE extraction error:", error); + return null; + } + + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } catch (error) { + console.log("Extract stream URL error:", error); + return null; + } +} +/* SCHEME START */ + +/** + * @name voeExtractor + * @author Cufiy + */ + +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + + const obfuscatedJson = jsonScriptMatch[1].trim(); + + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} + +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} + +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} + +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} + +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} +/* SCHEME END */ \ No newline at end of file diff --git a/mavanimes/mavanimes.json b/mavanimes/mavanimes.json new file mode 100644 index 0000000..2a9ae92 --- /dev/null +++ b/mavanimes/mavanimes.json @@ -0,0 +1,19 @@ +{ + "sourceName": "MavAnimes", + "iconUrl": "https://www.mavanimes.co/wp-content/uploads/2018/03/cropped-mav-192x192.jpg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "French (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.mavanimes.co/", + "searchBaseUrl": "https://www.mavanimes.co/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/mavanimes/mavanimes.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/megakino/megakino.js b/megakino/megakino.js new file mode 100644 index 0000000..597ae12 --- /dev/null +++ b/megakino/megakino.js @@ -0,0 +1,112 @@ +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://megakino.vip/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<article[^>]*>[\s\S]*?<h2 class="entry-title">([^<]+)<\/h2>[\s\S]*?<img[^>]+src="([^"]+)"[^>]*>[\s\S]*?<a href="([^"]+)" class="lnk-blk"><\/a>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: cleanTitle(match[1].trim()), + image: match[2].trim().startsWith("//") ? "https:" + match[2].trim() : match[2].trim(), + href: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="description">\s*<p>([\s\S]*?)<\/p>/i); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + return JSON.stringify([{ + href: url, + number: 1 + }]); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const postIdMatch = html.match(/postid-(\d+)/); + if (!postIdMatch) throw new Error("Post ID not found"); + const postId = postIdMatch[1]; + + const embedUrl = `https://megakino.vip/?trembed=0&trid=${postId}&trtype=1`; + const embedResp = await fetchv2(embedUrl); + const embedHtml = await embedResp.text(); + + const iframeMatch = embedHtml.match(/<iframe[^>]+src="([^"]+)"/); + if (!iframeMatch) throw new Error("Iframe not found"); + const iframeUrl = iframeMatch[1]; + + const iframeResp = await fetchv2(iframeUrl); + const iframeHtml = await iframeResp.text(); + + const videoObjectMatch = iframeHtml.match(/var video = (\{[^}]*\});/s); + if (!videoObjectMatch) throw new Error("Video object not found"); + + let videoStr = videoObjectMatch[1]; + + const uidMatch = iframeHtml.match(/"uid"\s*:\s*"([^"]+)"/); + const md5Match = iframeHtml.match(/"md5"\s*:\s*"([^"]+)"/); + const idMatch = iframeHtml.match(/"id"\s*:\s*"([^"]+)"/); + const statusMatch = iframeHtml.match(/"status"\s*:\s*"([^"]+)"/); + + if (!uidMatch || !md5Match || !idMatch || !statusMatch) { + throw new Error("Video data not found"); + } + + const uid = uidMatch[1]; + const md5 = md5Match[1]; + const vidId = idMatch[1]; + const status = statusMatch[1]; + + const hlsUrl = `/m3u8/${uid}/${md5}/master.txt?s=1&id=${vidId}&cache=${status}`; + console.log("Extracted HLS URL:"+ hlsUrl); + + return "https://watch.gxplayer.xyz/" + hlsUrl; + + } catch (err) { + console.error(err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} diff --git a/megakino/megakino.json b/megakino/megakino.json new file mode 100644 index 0000000..29923e9 --- /dev/null +++ b/megakino/megakino.json @@ -0,0 +1,19 @@ +{ + "sourceName": "MegaKino", + "iconUrl": "https://megakino.vip/wp-content/uploads/2024/03/cropped-favicon-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "German", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://megakino.com/", + "searchBaseUrl": "https://megakino.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/megakino/megakino.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/monoschinos2/monoschinos2.js b/monoschinos2/monoschinos2.js new file mode 100644 index 0000000..f47293a --- /dev/null +++ b/monoschinos2/monoschinos2.js @@ -0,0 +1,333 @@ +function cleanTitle(title) { + return title + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, ""); +} + +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://wwv.monoschinos2.net/animes?buscar=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<li class="col mb-5 ficha_efecto">.*?<a href="([^"]+)" title="([^"]+)">.*?<img[^>]+src="([^"]+)"/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim().replace("./", "https://wwv.monoschinos2.net/"), + title: cleanTitle(match[2].trim().replace(" Online Gratis", "").replace("Ver Anime", "")), + image: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="mb-3">\s*<p>(.*?)<\/p>/s); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const parts = url.split('/'); + const u = parts[parts.length - 1] || parts[parts.length - 2]; + + const initialResponse = await fetchv2(url); + const html = await initialResponse.text(); + const iMatch = html.match(/data-i="(\d+)"/); + const i = iMatch ? iMatch[1] : null; + + console.log("Slug:" + u); + console.log("Data-i:" + i); + + if (!i) throw new Error("data-i not found"); + + let page = 1; + let episodeCount = 0; + + while (true) { + const formData = `acc=episodes&i=${i}&u=${u}&p=${page}`; + console.log("Form Data: " + formData); + const headers = { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "X-Requested-With": "XMLHttpRequest", + "Origin": "https://wwv.monoschinos2.net", + "Referer": url + }; + const response = await fetchv2("https://wwv.monoschinos2.net/ajax_pagination", headers, "POST", formData); + const pageHtml = await response.text(); + console.log(pageHtml); + if (!pageHtml.trim()) break; + + const regex = /<a class="ko" href="([^"]+)"/g; + let match; + while ((match = regex.exec(pageHtml)) !== null) { + episodeCount++; + results.push({ + href: match[1].trim(), + number: episodeCount + }); + } + + page++; + } + + const total = results.length; + results.forEach((ep, index) => { + ep.number = total - index; + }); + + return JSON.stringify(results.reverse()); + } catch (err) { + return JSON.stringify({ + slug: "Error", + dataI: "Error", + episodes: [{ + href: "Error", + number: "Error" + }] + }); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/href="(https:\/\/(?:filemoon\.sx|[^"]+\.to)\/d\/[^"]+)"/); + if (!match) return "https://error.org/"; + + const filemoonUrl = match[1].replace("/d/", "/e/"); + + const filemoonResponse = await fetchv2(filemoonUrl); + const filemoonHtml = await filemoonResponse.text(); + + let streamUrl = null; + try { + streamUrl = await filemoonExtractor(filemoonHtml, filemoonUrl); + } catch (error) { + console.log("filemoon HD extraction error:" + error); + } + + console.log("filemoon Stream URL: " + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log("No stream URL found"); + + return null; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ \ No newline at end of file diff --git a/monoschinos2/monoschinos2.json b/monoschinos2/monoschinos2.json new file mode 100644 index 0000000..f3cf0bb --- /dev/null +++ b/monoschinos2/monoschinos2.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Monoschinos2", + "iconUrl": "https://files.catbox.moe/jz9l88.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://wwv.monoschinos2.net/", + "searchBaseUrl": "https://wwv.monoschinos2.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/monoschinos2/monoschinos2.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/movi/movi.js b/movi/movi.js new file mode 100644 index 0000000..6bc9cd8 --- /dev/null +++ b/movi/movi.js @@ -0,0 +1,102 @@ +function decodeHtml(html) { + return html.replace(/&#(\d+);/g, (_, dec) => String.fromCharCode(dec)) + .replace(/&/g, "&") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/</g, "<") + .replace(/>/g, ">"); +} + +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://www.movi.pk/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div data-movie-id="\d+" class="ml-item">[\s\S]*?<a href="(https:\/\/www\.movi\.pk\/[^"]+)"[^>]*>[\s\S]*?<img [^>]*data-original="([^"]+)"[^>]*>[\s\S]*?<h2>([^<]+)<\/h2>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + image: match[2].trim(), + title: decodeHtml(match[3].trim()) + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<p class="f-desc">(.*?)<\/p>/s); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: decodeHtml(description), + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + + +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<iframe\s+src=(https?:\/\/lizer[^\s>]+)[^>]*>/i); + const href = match ? match[1].trim() : url; + + return JSON.stringify([{ + href: href, + number: 1 + }]); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/var\s+video\s*=\s*(\{.*?\});/s); + if (!match) throw new Error("Video JSON not found"); + + const videoJson = JSON.parse(match[1]); + const uid = videoJson.uid; + const hash = videoJson.md5; + + const m3u8Path = `m3u8/${uid}/${hash}/720p/720p.m3u8?id=`; + + const encoded = btoa(m3u8Path); + + return `https://lizer123.site/stream/${encoded}`; + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + diff --git a/movi/movi.json b/movi/movi.json new file mode 100644 index 0000000..da0fbb1 --- /dev/null +++ b/movi/movi.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Movi", + "iconUrl": "https://www.movi.pk/wp-content/uploads/2024/12/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Hindi (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www.movi.pk/", + "searchBaseUrl": "https://www.movi.pk/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/movi/movi.js", + "type": "movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/novelbin/novelbin.js b/novelbin/novelbin.js new file mode 100644 index 0000000..136f8b5 --- /dev/null +++ b/novelbin/novelbin.js @@ -0,0 +1,198 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const url = `https://novelbin.me/search?keyword=${encodedKeyword}`; + const response = await soraFetch(url); + const html = await response.text(); + + const results = []; + const rowRegex = /<div class="row">([\s\S]*?)<\/div>\s*<\/div>\s*<\/div>/g; + let rowMatch; + + while ((rowMatch = rowRegex.exec(html)) !== null) { + const rowHtml = rowMatch[1]; + + const imgMatch = rowHtml.match(/<img\s+src="([^"]+)"[^>]*class="cover"/); + const linkMatch = rowHtml.match(/<h3 class="novel-title">\s*<a href="([^"]+)"\s+title="([^"]+)"/); + + if (imgMatch && linkMatch) { + let image = imgMatch[1]; + if (!image.startsWith("http")) image = "https:" + image; + + results.push({ + title: decodeHtmlEntities(linkMatch[2]), + href: linkMatch[1], + image + }); + } + } + + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + console.error("Error fetching or parsing: " + error); + return JSON.stringify([{ + title: "Error", + href: "", + image: "" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const descMatch = htmlText.match(/<div class="desc-text"[^>]*itemprop="description"[^>]*>([\s\S]*?)<\/div>/i); + + const description = descMatch + ? descMatch[1].replace(/\s+/g, ' ').trim() + : "No description available"; + + const aliases = 'N/A'; + const airdate = 'N/A'; + + const transformedResults = [{ + description, + aliases, + airdate + }]; + + console.log(JSON.stringify(transformedResults)); + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Details error:' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'N/A', + airdate: 'N/A' + }]); + } +} + + +async function extractChapters(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const novelIdMatch = htmlText.match(/<div id="rating"[^>]*data-novel-id="([^"]+)"[^>]*>/i); + if (!novelIdMatch) { + throw new Error("Novel ID not found"); + } + const novelId = novelIdMatch[1]; + + const chaptersResponse = await soraFetch(`https://novelbin.me/ajax/chapter-archive?novelId=${novelId}`); + const chaptersHtml = await chaptersResponse.text(); + + const chapters = []; + const chapterRegex = /<a\s+href="([^"]+)"\s+title="([^"]+)"[^>]*>[\s\S]*?<span[^>]*class="[^"]*\bchapter-title\b[^"]*"[^>]*>([\s\S]*?)<\/span>/gi; + + let match; + while ((match = chapterRegex.exec(chaptersHtml)) !== null) { + const href = match[1]; + const titleFromAttr = match[2].trim(); + const titleFromSpan = match[3].replace(/\s+/g, ' ').trim(); + + const title = titleFromAttr || titleFromSpan; + + chapters.push({ title, href }); + } + + chapters.sort((a, b) => { + const numA = parseFloat(a.title.match(/Chapter\s+(\d+)/i)?.[1]) || 0; + const numB = parseFloat(b.title.match(/Chapter\s+(\d+)/i)?.[1]) || 0; + return numA - numB; + }); + + chapters.forEach((chapter, index) => { + chapter.number = index + 1; + }); + + console.log(JSON.stringify(chapters)); + return JSON.stringify(chapters); + + } catch (error) { + console.error('Fetch error in extractChapters:', error); + return JSON.stringify([{ + href: url, + title: "Error fetching chapters", + number: 0 + }]); + } +} + +async function extractText(url) { + try { + const response = await soraFetch(url); + let htmlText = await response.text(); + + const startPattern = /<div id="pf-15549-1"[^>]*>[\s\S]*?<\/div>\s*<div><\/div>/; + const endPattern = /<div id="pf-15560-1"[^>]*>[\s\S]*?<\/div>/; + + const startMatch = htmlText.search(startPattern); + const endMatch = htmlText.search(endPattern); + + if (startMatch === -1 || endMatch === -1) { + throw new Error("Start or end markers not found"); + } + + const startIndex = htmlText.match(startPattern)[0].length + startMatch; + let content = htmlText.substring(startIndex, endMatch).trim(); + + content = content.replace(/<div id="pf-\d+-\d+"[^>]*>[\s\S]*?<\/div>/gi, ''); + + content = content.replace(/<script[\s\S]*?<\/script>/gi, ''); + + content = content.replace(/\s+/g, ' ').trim(); + + if (!content) { + throw new Error("No content found between markers"); + } + + console.log(content); + return content; + + } catch (error) { + console.log("Fetch error in extractText: " + error); + return '<p>Error extracting text</p>'; + } +} + +async function soraFetch(url, options = { + headers: {}, + method: 'GET', + body: null +}) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch (e) { + try { + return await fetch(url, options); + } catch (error) { + return null; + } + } +} + +function decodeHtmlEntities(text) { + const entities = { + '—': '—', + '–': '–', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'", + '/': '/', + '`': '`', + '=': '=', + ' ': ' ' + }; + + return text.replace(/&#x[\dA-Fa-f]+;|&\w+;/g, (match) => { + return entities[match] || match; + }); +} diff --git a/novelbin/novelbin.json b/novelbin/novelbin.json new file mode 100644 index 0000000..187de88 --- /dev/null +++ b/novelbin/novelbin.json @@ -0,0 +1,19 @@ +{ + "sourceName": "NovelBin", + "iconUrl": "https://novelbin.com/img/logo.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "novels", + "quality": "N/A", + "baseUrl": "https://novelbin.com/", + "searchBaseUrl": "https://novelbin.com/search/?wd=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/novelbin/novelbin.js", + "type": "novels", + "asyncJS": true, + "novel": true, + "downloadSupport": false +} diff --git a/novelcool/novelcool.js b/novelcool/novelcool.js new file mode 100644 index 0000000..726edba --- /dev/null +++ b/novelcool/novelcool.js @@ -0,0 +1,160 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const response = await soraFetch(`https://www.novelcool.com/search/?name=${encodedKeyword}`); + const data = await response.text(); + const results = []; + const regex = /<div class="book-item"[^>]*itemtype\s*=\s*["'][^"']*Book[^"']*["'][^>]*>([\s\S]*?)<\/div>\s*<\/div>/g; + let match; + while ((match = regex.exec(data)) !== null) { + const bookItemHTML = match[1]; + if (bookItemHTML.includes('book-type-manga')) { + continue; + } + let titleMatch = bookItemHTML.match(/<div class="book-pic"[^>]*title="([^"]*)"/); + let title = ""; + if (titleMatch && titleMatch[1]) { + title = titleMatch[1].trim(); + } else { + titleMatch = bookItemHTML.match(/<div[^>]*\bclass\s*=\s*["'][^"']*book-name[^"']*["'][^>]*itemprop\s*=\s*["']name["'][^>]*>(.*?)<\/div>/); + if (titleMatch && titleMatch[1]) { + title = titleMatch[1].trim(); + } + } + const hrefMatch = bookItemHTML.match(/<a[^>]*href\s*=\s*["'](https:\/\/www\.novelcool\.com\/novel\/[^"']*)["'][^>]*itemprop\s*=\s*["']url["']|<a[^>]*href\s*=\s*["'](https:\/\/www\.novelcool\.com\/novel\/[^"']*)["']/); + const href = (hrefMatch && (hrefMatch[1] || hrefMatch[2])) ? (hrefMatch[1] || hrefMatch[2]).trim() : ''; + const imgTagMatch = bookItemHTML.match(/<img[^>]*itemprop\s*=\s*["']image["'][^>]*>/i); + let image = ''; + if (imgTagMatch) { + const imgTag = imgTagMatch[0]; + const srcMatch = imgTag.match(/\bsrc\s*=\s*["']([^"']*)["']/i); + if (srcMatch && srcMatch[1]) { + image = srcMatch[1].trim(); + } + } + if (title && href) { + results.push({ + title: title, + href: href, + image: image + }); + } + + } + console.log("Search Results:", results); + return JSON.stringify(results); + } catch (error) { + console.error('Fetch error in searchResults:', error); + return JSON.stringify([{ title: 'Error', href: '', image: '' }]); + } +} + +async function extractDetails(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const descriptionMatch = htmlText.match(/<div class="bk-summary-txt"[^>]*>([\s\S]*?)<\/div>/); + const description = descriptionMatch ? descriptionMatch[1].trim() : 'No description available'; + + const transformedResults = [{ + description, + aliases: 'N/A', + airdate: 'N/A' + }]; + + console.log(JSON.stringify(transformedResults)); + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Details error:', error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'N/A', + airdate: 'N/A' + }]); + } +} + +async function extractChapters(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const rawChapters = []; + const regex = /<div class="chp-item">[\s\S]*?<a href="([^"]+)"[^>]*title="([^"]+)">[\s\S]*?<\/a>[\s\S]*?<\/div>/g; + + let match; + while ((match = regex.exec(htmlText)) !== null) { + rawChapters.push({ + href: match[1].trim(), + title: match[2].trim() + }); + } + + const total = rawChapters.length; + const chapters = rawChapters.map((ch, i) => ({ + ...ch, + number: total - i + })); + + if (chapters.length === 0) { + return [{ + href: url, + title: "Currently no chapters available", + number: 1 + }]; + } + + console.log(JSON.stringify(chapters)); + return chapters.reverse(); + } catch (error) { + console.log('Fetch error in extractChapters:', error); + return [{ + href: url, + title: "Currently no chapters available", + number: 1 + }]; + } +} + + +async function extractText(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const match = htmlText.match( + /<h2 class="chapter-title[^>]*>[\s\S]*?<\/h2>([\s\S]*?)<div class="bookinfo-share">/i + ); + + if (!match) { + throw new Error("Chapter content not found"); + } + + let content = match[1].trim(); + + content = content.replace(/<script[\s\S]*?<\/script>/gi, ''); + + content = content.trim(); + + console.log(JSON.stringify(content)); + return content; + } catch (error) { + console.log("Fetch error in extractText:", error); + return JSON.stringify({ text: 'Error extracting text' }); + } +} + +extractChapters('https://www.novelcool.com/novel/Shadow-Slave.html'); + +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} diff --git a/novelcool/novelcool.json b/novelcool/novelcool.json new file mode 100644 index 0000000..f032541 --- /dev/null +++ b/novelcool/novelcool.json @@ -0,0 +1,18 @@ +{ + "sourceName": "NovelCool", + "iconUrl": "https://www.novelcool.com/files/img/144.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "novels", + "quality": "N/A", + "baseUrl": "https://www.novelcool.com/", + "searchBaseUrl": "https://www.novelcool.com/search/?wd=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/novelcool/novelcool.js", + "type": "novels", + "asyncJS": true, + "novel": true +} diff --git a/novelnext/novelnext.js b/novelnext/novelnext.js new file mode 100644 index 0000000..cd592e1 --- /dev/null +++ b/novelnext/novelnext.js @@ -0,0 +1,219 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const url = `https://novelnext.dramanovels.io/search?keyword=${encodedKeyword}`; + const response = await soraFetch(url); + const html = await response.text(); + + const results = []; + const rowRegex = /<div class="row">([\s\S]*?)<\/div>\s*<\/div>\s*<\/div>/g; + let rowMatch; + + while ((rowMatch = rowRegex.exec(html)) !== null) { + const rowHtml = rowMatch[1]; + + const imgMatch = rowHtml.match(/<img[^>]+src="([^"]+)"[^>]*class="cover"/); + const linkMatch = rowHtml.match(/<h3 class="novel-title">\s*<a href="([^"]+)"[^>]*title="([^"]+)"/); + + if (imgMatch && linkMatch) { + let image = imgMatch[1]; + if (!image.startsWith("http")) image = "https:" + image; + + results.push({ + title: decodeHtmlEntities(linkMatch[2]), + href: linkMatch[1], + image + }); + } + } + + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + console.error("Error fetching or parsing: " + error); + return JSON.stringify([{ + title: "Error", + href: "", + image: "" + }]); + } +} + + +async function extractDetails(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const descMatch = htmlText.match(/<div class="desc-text"[^>]*itemprop="description"[^>]*>([\s\S]*?)<\/div>/i); + + let description = descMatch + ? decodeHtmlEntities( + descMatch[1] + .replace(/<a[^>]*>.*?<\/a>/gi, '') + .replace(/<[^>]+>/g, '') + .replace(/\s+/g, ' ') + .trim() + ) + : "No description available"; + + const aliases = 'N/A'; + const airdate = 'N/A'; + + const transformedResults = [{ + description, + aliases, + airdate + }]; + + console.log(JSON.stringify(transformedResults)); + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Details error:' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'N/A', + airdate: 'N/A' + }]); + } +} + +async function extractChapters(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const novelIdMatch = htmlText.match(/<div id="rating"[^>]*data-novel-id="([^"]+)"[^>]*>/i); + if (!novelIdMatch) { + throw new Error("Novel ID not found"); + } + const novelId = novelIdMatch[1]; + + const chaptersResponse = await soraFetch(`https://novelnext.dramanovels.io/ajax/chapter-archive?novelId=${novelId}`); + const chaptersHtml = await chaptersResponse.text(); + + const chapters = []; + const chapterRegex = /<a\s+href="([^"]+)"\s+title="([^"]+)"[^>]*>[\s\S]*?<span[^>]*class="[^"]*\bnchr-text\b[^"]*"[^>]*>([\s\S]*?)<\/span>/gi; + + let match; + while ((match = chapterRegex.exec(chaptersHtml)) !== null) { + const href = match[1]; + const titleFromAttr = match[2].trim(); + const titleFromSpan = match[3].replace(/\s+/g, ' ').trim(); + + const title = titleFromAttr || titleFromSpan; + + chapters.push({ title, href }); + } + + chapters.sort((a, b) => { + const numA = parseFloat(a.title.match(/Chapter\s+(\d+)/i)?.[1]) || 0; + const numB = parseFloat(b.title.match(/Chapter\s+(\d+)/i)?.[1]) || 0; + return numA - numB; + }); + + chapters.forEach((chapter, index) => { + chapter.number = index + 1; + }); + + console.log(JSON.stringify(chapters)); + return JSON.stringify(chapters); + + } catch (error) { + console.error('Fetch error in extractChapters:', error); + return JSON.stringify([{ + href: url, + title: "Error fetching chapters", + number: 0 + }]); + } +} + +async function extractText(url) { + try { + const response = await soraFetch(url); + let htmlText = await response.text(); + + const startPattern = /<div class="text-center ads-holder ads-top"[^>]*>[\s\S]*?<\/div>/; + const endPattern = /<div class="chr-nav" id="chr-nav-bottom">/; + + const startMatch = htmlText.search(startPattern); + const endMatch = htmlText.search(endPattern); + + if (startMatch === -1 || endMatch === -1) { + const contentStartPattern = /<div id="chapter"[^>]*>/; + const contentEndPattern = /<div class="chr-nav" id="chr-nav-bottom">/; + const contentStartMatch = htmlText.search(contentStartPattern); + const contentEndMatch = htmlText.search(contentEndPattern); + if (contentStartMatch === -1 || contentEndMatch === -1) { + throw new Error("Content markers not found"); + } + const contentStartIndex = htmlText.match(contentStartPattern)[0].length + contentStartMatch; + let content = htmlText.substring(contentStartIndex, contentEndMatch).trim(); + + content = content.replace(/<div id="pf-\d+-\d+"[^>]*>[\s\S]*?<\/script><\/div>/gi, ''); + + content = content.replace(/<(?!\/?p\b)[^>]+>/gi, ''); + + content = content.replace(/\s+/g, ' ').trim(); + + if (!content) throw new Error("No content found between markers"); + console.log(content); + return content; + } + + const startIndex = htmlText.match(startPattern)[0].length + startMatch; + let content = htmlText.substring(startIndex, endMatch).trim(); + + content = content.replace(/<div id="pf-\d+-\d+"[^>]*>[\s\S]*?<\/script><\/div>/gi, ''); + + content = content.replace(/<(?!\/?p\b)[^>]+>/gi, ''); + + content = content.replace(/\s+/g, ' ').trim(); + + if (!content) throw new Error("No content found between markers"); + console.log(content); + return decodeHtmlEntities(content); + + } catch (error) { + console.log("Fetch error in extractText: " + error); + return '<p>Error extracting text</p>'; + } +} + +async function soraFetch(url, options = { + headers: {}, + method: 'GET', + body: null +}) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch (e) { + try { + return await fetch(url, options); + } catch (error) { + return null; + } + } +} + +function decodeHtmlEntities(text) { + const entities = { + '—': '—', + '–': '–', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'", + '/': '/', + '`': '`', + '=': '=', + ' ': ' ' + }; + + return text.replace(/&#x[\dA-Fa-f]+;|&\w+;/g, (match) => { + return entities[match] || match; + }); +} diff --git a/novelnext/novelnext.json b/novelnext/novelnext.json new file mode 100644 index 0000000..59cb144 --- /dev/null +++ b/novelnext/novelnext.json @@ -0,0 +1,19 @@ +{ + "sourceName": "NovelNext", + "iconUrl": "https://novelnext.dramanovels.io/img/logo.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "novels", + "quality": "N/A", + "baseUrl": "https://novelnext.dramanovels.io", + "searchBaseUrl": "https://novelnext.dramanovels.iosearch/%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/novelnext/novelnext.js", + "type": "novels", + "asyncJS": true, + "novel": true, + "downloadSupport": false +} diff --git a/onlinemovieshindi/onlinemovieshindi.js b/onlinemovieshindi/onlinemovieshindi.js new file mode 100644 index 0000000..6bfc8fe --- /dev/null +++ b/onlinemovieshindi/onlinemovieshindi.js @@ -0,0 +1,95 @@ +async function searchResults(keyword) { + const response = await fetch(`https://111.90.159.132/?s=${keyword}`); + const html = await response; + + const results = []; + const filmListRegex = /<article[^>]+itemscope[^>]+itemtype="http:\/\/schema\.org\/Movie"[^>]*>[\s\S]*?<\/article>/g; + const items = html.match(filmListRegex); + + if (!items) return results; + + items.forEach(itemHtml => { + const titleMatch = itemHtml.match(/<p class="entry-title"[^>]*>\s*<a[^>]+>([^<]+)<\/a>/); + const hrefMatch = itemHtml.match(/<a href="([^"]+)"[^>]+title="Watch Movie:/); + const imgMatch = itemHtml.match(/<img[^>]+src="([^"]+)"[^>]+alt="([^"]+)"/); + + if (titleMatch && hrefMatch && imgMatch) { + results.push({ + title: titleMatch[1].trim(), + image: imgMatch[1].trim(), + href: hrefMatch[1].trim() + }); + } + }); + console.log(JSON.stringify(results)); + return JSON.stringify(results); +} + +async function extractDetails(url) { + const response = await fetch(url); + const html = await response; + const details = []; + + const descriptionMatch = html.match(/<div class="entry-content entry-content-single"[^>]*>([\s\S]*?)<\/div>/); + let description = descriptionMatch ? descriptionMatch[1].replace(/<\/?[^>]+(>|$)/g, "").trim() : ''; + + const entities = { + '‘': '‘', + '’': '’', + '“': '“', + '”': '”', + '&': '&', + ''': "'", + ' ': ' ', + '©': '©', + '®': '®', + '™': '™', + }; + + for (const [entity, char] of Object.entries(entities)) { + description = description.replace(new RegExp(entity, 'g'), char); + } + + description = description.replace(/\s+/g, ' ').replace(/Country:[^<]+/g, '').trim(); + + const airdateMatch = html.match(/Year: <a href="[^"]*" rel="tag">(\d{4})<\/a>/); + let airdate = airdateMatch ? airdateMatch[1] : ''; + + if (description && airdate) { + details.push({ + description: description, + aliases: 'N/A', + airdate: airdate + }); + } + console.log(details); + return JSON.stringify(details); +} + + +async function extractEpisodes(url) { + const episodes = []; + if (url) { + const hardcodedEpisode = { + href: url, + number: `1` + }; + episodes.push(hardcodedEpisode); + } + + console.log(JSON.stringify(episodes)); + return JSON.stringify(episodes); +} + +async function extractStreamUrl(input) { + const response = await fetch(input); + const html = await response; + console.log(html); + + const sourceRegex = /<video[\s\S]*?<source\s+src=["']([^"']+)["'][^>]*>/i; + const match = html.match(sourceRegex); + const url = match ? match[1].replace(/&/g, '&') : null; + console.log(url); + return url; +} + diff --git a/onlinemovieshindi/onlinemovieshindi.json b/onlinemovieshindi/onlinemovieshindi.json new file mode 100644 index 0000000..62b7818 --- /dev/null +++ b/onlinemovieshindi/onlinemovieshindi.json @@ -0,0 +1,17 @@ +{ + "sourceName": "OnlineMoviesHindi", + "iconUrl": "https://cdn-icons-png.freepik.com/256/14272/14272467.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Hindi (SUB)", + "streamType": "mp4", + "quality": "1080p", + "baseUrl": "https://111.90.159.132/", + "searchBaseUrl": "https://111.90.159.132/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/onlinemovieshindi/onlinemovieshindi.js", + "asyncJS": true, + "type": "movies/shows" +} diff --git a/pelisplushd/pelisplushd.js b/pelisplushd/pelisplushd.js new file mode 100644 index 0000000..252f633 --- /dev/null +++ b/pelisplushd/pelisplushd.js @@ -0,0 +1,6562 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://pelisplushd.bz/search?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const cleanHtml = html.replace(/\s+/g, ' ').trim(); + + const linkRegex = /<a\s[^>]*href="([^"]+)"[^>]*class="Posters-link[^"]*"[^>]*>(.*?)<\/a>/gs; + + let match; + while ((match = linkRegex.exec(cleanHtml)) !== null) { + const href = match[1].trim(); + const linkContent = match[2]; + + const imgMatch = linkContent.match(/<img[^>]*src="(https?:\/\/[^"]+)"/); + const image = imgMatch ? imgMatch[1].trim() : ''; + + const titleMatch = linkContent.match(/<div class="listing-content"[^>]*>.*?<p>([^<]+)<\/p>/s); + const title = titleMatch ? titleMatch[1].trim() : ''; + + if (href && image && title) { + results.push({ + href, + image, + title + }); + } + } + + return JSON.stringify(results); + + } catch (err) { + return JSON.stringify([{ + title: "Error: " + err.message, + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="text-large">\s*([\s\S]*?)\s*<\/div>/i); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]*>T(\d+)\s*-\s*E(\d+):/g; + let match; + const seasonCounters = {}; + + while ((match = regex.exec(html)) !== null) { + const href = match[1].trim(); + const season = parseInt(match[2], 10); + let episode = parseInt(match[3], 10); + + if (!seasonCounters[season]) seasonCounters[season] = 1; + else seasonCounters[season]++; + + results.push({ + href: href, + number: seasonCounters[season] + }); + } + + if (results.length === 0) { + results.push({ + href: url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + season: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/video\[1\]\s*=\s*'([^']+)'/); + + const anotherResponse = await fetchv2(match[1].trim()); + const anotherHtml = await anotherResponse.text(); + + const dataLinkMatch = anotherHtml.match(/const\s+dataLink\s*=\s*(\[[\s\S]*?\]);/); + + let dataLink; + try { + let dataLinkStr = dataLinkMatch[1] + .replace(/"/g, '"') + .replace(/\\u003c/g, '<') + .replace(/\\u003e/g, '>') + .replace(/\\u0026/g, '&'); + dataLink = JSON.parse(dataLinkStr); + } catch (e) { + console.error( e); + return "PARSE ERROR"; + } + + const defaultLang = dataLink[0]; + const filemoonEmbed = defaultLang.sortedEmbeds.find(embed => embed.servername === "filemoon"); + + const SECRET_KEY = "Ak7qrvvH4WKYxV2OgaeHAEg2a5eh16vE"; + const decryptedUrl = decryptLink(filemoonEmbed.link, SECRET_KEY); + + console.log( decryptedUrl); + const filemoonResponse = await fetchv2(decryptedUrl); + const filemoonHtml = await filemoonResponse.text(); + let streamUrl = null; + try { + streamUrl = await filemoonExtractor(filemoonHtml, decryptedUrl); + } catch (error) { + console.log("filemoon HD extraction error:" + error); + } + + console.log("filemoon Stream URL: " + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log("No stream URL found"); + + return null; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ + +function cleanHtmlSymbols(string) { + if (!string) return ""; + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function decryptLink(encryptedLinkBase64, secretKey) { + try { + const encryptedData = CryptoJS.enc.Base64.parse(encryptedLinkBase64); + const iv = encryptedData.words.slice(0, 4); + const encryptedBytes = encryptedData.words.slice(4); + const ivWordArray = CryptoJS.lib.WordArray.create(iv); + const encryptedWordArray = CryptoJS.lib.WordArray.create(encryptedBytes); + + const decrypted = CryptoJS.AES.decrypt( + { ciphertext: encryptedWordArray }, + CryptoJS.enc.Utf8.parse(secretKey), + { iv: ivWordArray, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } + ); + + return decrypted.toString(CryptoJS.enc.Utf8); + } catch (error) { + console.error('Error al descifrar:', error); + return null; + } +} + +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof global !== 'undefined' && global.crypto) { + crypto = global.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && typeof require === 'function') { + try { + crypto = require('crypto'); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64url encoding strategy. + */ + var Base64url = C_enc.Base64url = { + /** + * Converts a word array to a Base64url string. + * + * @param {WordArray} wordArray The word array. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {string} The Base64url string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64url.stringify(wordArray); + */ + stringify: function (wordArray, urlSafe=true) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = urlSafe ? this._safe_map : this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64url string to a word array. + * + * @param {string} base64Str The Base64url string. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64url.parse(base64String); + */ + parse: function (base64Str, urlSafe=true) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = urlSafe ? this._safe_map : this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + var Wil; + var Wih; + + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + Wih = Wi.high = M[offset + i * 2] | 0; + Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + Wil = gamma0l + Wi7l; + Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + Wil = Wil + gamma1l; + Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + Wil = Wil + Wi16l; + Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + var tMsw; + var tLsw; + + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<<n) | (x>>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + var block; + + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + var block; + + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + var modeCreator; + + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + var finalProcessedBlocks; + + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + var wordArray; + + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + var salt; + + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + var keystream; + + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + for (var i = data.sigBytes - 1; i >= 0; i--) { + if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + data.sigBytes = i + 1; + break; + } + } + } + }; + + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + var t; + + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + // Make sure the key length is valid (64, 128 or >= 192 bit) + if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) { + throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.'); + } + + // Extend the key according to the keying options defined in 3DES standard + var key1 = keyWords.slice(0, 2); + var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4); + var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6); + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(key1)); + this._des2 = DES.createEncryptor(WordArray.create(key2)); + this._des3 = DES.createEncryptor(WordArray.create(key3)); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + return CryptoJS; + +})); diff --git a/pelisplushd/pelisplushd.json b/pelisplushd/pelisplushd.json new file mode 100644 index 0000000..902b7ce --- /dev/null +++ b/pelisplushd/pelisplushd.json @@ -0,0 +1,19 @@ +{ + "sourceName": "PelisPlusHD", + "iconUrl": "https://pelisplushd.bz/images/logo/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://pelisplushd.bz/", + "searchBaseUrl": "https://pelisplushd.bz/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/pelisplushd/pelisplushd.js", + "type": "shows/movies/anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/poseidonhd2/poseidonhd2.js b/poseidonhd2/poseidonhd2.js new file mode 100644 index 0000000..33a2400 --- /dev/null +++ b/poseidonhd2/poseidonhd2.js @@ -0,0 +1,346 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2("https://www.poseidonhd2.co/search?q=" + encodeURIComponent(keyword)); + const html = await response.text(); + const baseUrl = "https://www.poseidonhd2.co"; + + const regex = /<a\s+href="([^"]+)">([\s\S]*?)<\/a>/gs; + let match; + + while ((match = regex.exec(html)) !== null) { + const href = match[1].trim(); + const linkContent = match[2]; + + if (linkContent.includes('<span class="TpTv BgA">Serie</span>')) { + continue; + } + + const imgMatch = linkContent.match(/<img[^>]+src="([^"]+)"[^>]*>/); + const titleMatch = linkContent.match(/<span class="Title[^"]*"[^>]*>([^<]+)<\/span>/); + + if (imgMatch && titleMatch) { + results.push({ + title: titleMatch[1].trim(), + image: baseUrl + decodeURIComponent(imgMatch[1].replace(/&/g, "&").trim()), + href: baseUrl + href + }); + } + } + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="Description">\s*<p>(.*?)<\/p>/s; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "N/A"; + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + console.log(url); + + const jsonMatch = html.match(/<script id="__NEXT_DATA__" type="application\/json">(.*?)<\/script>/s); + if (jsonMatch) { + try { + const data = JSON.parse(jsonMatch[1]); + const seasons = data.props?.pageProps?.thisSerie?.seasons || []; + + for (const season of seasons) { + for (const episode of season.episodes || []) { + results.push({ + href: "https://www.poseidonhd2.co/" + episode.url.slug, + number: episode.number + }); + } + } + + if (results.length > 0) return JSON.stringify(results); + } catch (e) { + console.warn("Failed to parse __NEXT_DATA__ episodes", e); + } + } + + try { + const data = JSON.parse(jsonMatch[1]); + const videos = data.props?.pageProps?.thisMovie?.videos || {}; + + const getStreamwishLink = (videosArray) => { + const entry = videosArray.find(v => v.cyberlocker === 'streamwish'); + return entry ? entry.result : null; + }; + + const latino = getStreamwishLink(videos.latino || []); + const spanish = getStreamwishLink(videos.spanish || []); + const subt = getStreamwishLink(videos.english || []); + + const parts = []; + if (latino) parts.push(`Español latino:streamwish:${latino}`); + if (spanish) parts.push(`Español:streamwish:${spanish}`); + if (subt) parts.push(`Subtitulado:streamwish:${subt}`); + + if (parts.length > 0) { + results.push({ + href: parts.join(' | '), + number: 1 + }); + return JSON.stringify(results); + } + } catch (e) { + console.warn("Failed to parse videos from __NEXT_DATA__", e); + } + + const tableRowRegex = /<tr[^>]*>[\s\S]*?<td[^>]*>[\s\S]*?(?:#?\d+[\s\S]*?)?(?:<!--[^]*?-->)?\s*([^<]+)[^<]*<\/td>[\s\S]*?<td[^>]*>([^<]+)[^<]*<\/td>[\s\S]*?<td[^>]*><span>([^<]+)<\/span><\/td>[\s\S]*?<a[^>]+href="([^"]+)"[^>]*class="Button STPb">Descargar<\/a>[\s\S]*?<\/tr>/gi; + + const linksMap = { + "Español latino": null, + "Español": null, + "Subtitulado": null + }; + + let match; + while ((match = tableRowRegex.exec(html)) !== null) { + const [, providerRaw, languageRaw, , link] = match; + const provider = providerRaw.trim().toLowerCase(); + const language = languageRaw.trim(); + + if (!provider.includes("streamwish")) continue; + + if (language === 'Latino') linksMap["Español latino"] = link; + else if (language === 'Español') linksMap["Español"] = link; + else if (language === 'Subtitulado') linksMap["Subtitulado"] = link; + } + + const parts = []; + for (const [lang, link] of Object.entries(linksMap)) { + if (link) parts.push(`${lang}:streamwish:${link}`); + } + + if (parts.length > 0) { + results.push({ + href: parts.join(' | '), + number: 1 + }); + } + + return JSON.stringify(results); +} + +async function extractStreamUrl(urlData) { + const languageBlocks = urlData.split("|"); + const streamwishLinks = {}; + + for (const block of languageBlocks) { + const match = block.match(/^([^:]+):streamwish:(.+)$/); + if (!match) continue; + const lang = match[1].trim(); + const link = match[2].trim(); + if (link && link !== "null") { + if (lang === "Español latino") streamwishLinks.latino = link; + else if (lang === "Español") streamwishLinks.espanol = link; + else if (lang === "Subtitulado") streamwishLinks.subtitulado = link; + } + } + + console.log("Parsed streamwishLinks: " + JSON.stringify(streamwishLinks)); + + async function getVarUrl(link) { + try { + const res = await fetchv2(link); + const html = await res.text(); + const match = html.match(/var\s+url\s*=\s*['"]([^'"]+)['"]/); + return match ? match[1] : null; + } catch (err) { + return null; + } + } + + async function getFinalStream(link) { + try { + const res = await fetchv2(link); + const html = await res.text(); + const scriptMatch = html.match(/eval\(function\(p,a,c,k,e,d\)\{[\s\S]+?\}\('.*?'\,\d+\,\d+\,'.*?'\.split\('\|'\)\)\)/); + if (!scriptMatch) return null; + const packed = scriptMatch[0]; + console.log("Obfuscated eval function found: " + packed.substring(0, 500)); + const unpacked = unpack(packed); + console.log("Unpacked code snippet: " + unpacked.substring(0, 500)); + const hls2Match = unpacked.match(/"hls2"\s*:\s*"([^"]+)"/); + return hls2Match ? hls2Match[1] : null; + } catch (err) { + console.log("Error in getFinalStream: " + err); + return null; + } + } + + function rewriteStreamwishUrl(url) { + return url.replace(/^https?:\/\/streamwish\.to\//, "https://xenolyzb.com/"); + } + + const streams = []; + + for (const [langKey, embedUrl] of Object.entries(streamwishLinks)) { + const varUrlRaw = await getVarUrl(embedUrl); + if (!varUrlRaw) continue; + const varUrl = rewriteStreamwishUrl(varUrlRaw); + const hls2 = await getFinalStream(varUrl); + if (!hls2) continue; + + const label = + langKey === "latino" ? "LATINO" : + langKey === "espanol" ? "CASTELLANO" : + langKey === "subtitulado" ? "SUB" : + langKey.toUpperCase(); + + streams.push(label, hls2); + } + + if (streams.length === 0) { + return "deijdjiwjdiwaidjwaodjiasjdioajidofejhifophwufipheuipfhepiuwghuiphfipehifspehwuipfhewipfhewhfuihfdlshfjkshfudislvhjdkslvsdjkl"; + } + + const final = { + streams + }; + console.log(JSON.stringify(final)); + return JSON.stringify(final); +} + + + + +/* + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + */ + +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + diff --git a/poseidonhd2/poseidonhd2.json b/poseidonhd2/poseidonhd2.json new file mode 100644 index 0000000..9201e03 --- /dev/null +++ b/poseidonhd2/poseidonhd2.json @@ -0,0 +1,19 @@ +{ + "sourceName": "PoseidonHD2", + "iconUrl": "https://www.poseidonhd2.co/apple-touch-icon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://poseidonhd2.co/", + "searchBaseUrl": "https://poseidonhd2.co/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/poseidonhd2/poseidonhd2.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/prmovies/prmovies.js b/prmovies/prmovies.js new file mode 100644 index 0000000..c22a457 --- /dev/null +++ b/prmovies/prmovies.js @@ -0,0 +1,110 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://prmovies.casa/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<div[^>]+class="ml-item"[^>]*>\s*<a href="([^"]+)"[^>]*>\s*[\s\S]*?<img[^>]+(?:data-original|src)="([^"]+)"[^>]*>[\s\S]*?<h2>(.*?)<\/h2>/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<p class="f-desc">(.*?)<\/p>/s); + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + console.log(html); + const regex = /<a href="([^"]+)"[^>]*class="lnk-lnk lnk-1"[^>]*>/g; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim(), + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "Referer": "https://prmovies.casa/" + }; + const response = await fetchv2(url, headers); + const html = await response.text(); + + let postData = ""; + + const regex = /<input type="hidden" name="([^"]+)" value="([^"]*)">/g; + let match; + while ((match = regex.exec(html)) !== null) { + if (postData.length > 0) postData += "&"; + postData += encodeURIComponent(match[1]) + "=" + encodeURIComponent(match[2]); + } + const headers2 = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "Referer": "https://spedostream.com" + }; + postData += "&imhuman=Proceed+to+video"; + console.log(postData); + + const response2 = await fetchv2(url, headers2, "POST", postData); + const html2 = await response2.text(); + + const matchTwo = html2.match(/sources:\s*\[\{file:"([^"]+)"/); + const videoUrl = matchTwo ? matchTwo[1] : "Error"; + + console.log(videoUrl); + + + return videoUrl; + } catch (err) { + return "Error extracting postData"; + } +} diff --git a/prmovies/prmovies.json b/prmovies/prmovies.json new file mode 100644 index 0000000..b2cd3f8 --- /dev/null +++ b/prmovies/prmovies.json @@ -0,0 +1,20 @@ +{ + "sourceName": "PrMovies", + "iconUrl": "https://prmovies.casa/wp-content/uploads/2025/08/100595544-play-button-round-green-3d-icon-symbol-.jpg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Hindi", + "streamType": "HLS", + "encrypted":true, + "quality": "1080p", + "baseUrl": "https://spedostream.com", + "searchBaseUrl": "https://spedostream.com", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/prmovies/prmovies.js", + "type": "movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} \ No newline at end of file diff --git a/readnovelfull/readnovelfull.js b/readnovelfull/readnovelfull.js new file mode 100644 index 0000000..758be4f --- /dev/null +++ b/readnovelfull/readnovelfull.js @@ -0,0 +1,224 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const url = `https://readnovelfull.com/novel-list/search?keyword=${encodedKeyword}`; + const response = await soraFetch(url); + const html = await response.text(); + + const results = []; + const rowRegex = /<div class="row">([\s\S]*?)<\/div>\s*<\/div>\s*<\/div>/g; + let rowMatch; + + while ((rowMatch = rowRegex.exec(html)) !== null) { + const rowHtml = rowMatch[1]; + + const imgMatch = rowHtml.match(/<img\s+src="([^"]+)"[^>]*class="cover"/); + const linkMatch = rowHtml.match(/<h3 class="novel-title">\s*<a href="([^"]+)"\s+title="([^"]+)"/); + + if (imgMatch && linkMatch) { + let image = imgMatch[1]; + if (!image.startsWith("http")) image = "https:" + image; + + results.push({ + title: decodeHtmlEntities(linkMatch[2]), + href: "https://readnovelfull.com" +linkMatch[1], + image + }); + } + } + + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + console.error("Error fetching or parsing: " + error); + return JSON.stringify([{ + title: "Error", + href: "", + image: "" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const descMatch = htmlText.match(/<div class="desc-text"[^>]*itemprop="description"[^>]*>([\s\S]*?)<\/div>/i); + + let description = descMatch + ? descMatch[1] + .replace(/<p[^>]*>/gi, '') + .replace(/<\/p>/gi, '') + .replace(/\s+/g, ' ') + .trim() + : "No description available"; + + const aliases = 'N/A'; + const airdate = 'N/A'; + + const transformedResults = [{ + description, + aliases, + airdate + }]; + + console.log(JSON.stringify(transformedResults)); + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Details error:' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'N/A', + airdate: 'N/A' + }]); + } +} + +async function extractChapters(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const novelIdMatch = htmlText.match(/<div id="rating"[^>]*data-novel-id="([^"]+)"[^>]*>/i); + if (!novelIdMatch) { + throw new Error("Novel ID not found"); + } + const novelId = novelIdMatch[1]; + + const chaptersResponse = await soraFetch(`https://readnovelfull.com/ajax/chapter-archive?novelId=${novelId}`); + const chaptersHtml = await chaptersResponse.text(); + + const chapters = []; + const chapterRegex = /<a\s+href="([^"]+)"\s+title="([^"]+)"[^>]*>[\s\S]*?<span[^>]*class="[^"]*\bnchr-text\b[^"]*"[^>]*>([\s\S]*?)<\/span>/gi; + + let match; + while ((match = chapterRegex.exec(chaptersHtml)) !== null) { + const href = "https://readnovelfull.com" + match[1]; + const titleFromAttr = match[2].trim(); + const titleFromSpan = match[3].replace(/\s+/g, ' ').trim(); + + const title = titleFromAttr || titleFromSpan; + + chapters.push({ title, href }); + } + + chapters.sort((a, b) => { + const numA = parseFloat(a.title.match(/Chapter\s+(\d+)/i)?.[1]) || 0; + const numB = parseFloat(b.title.match(/Chapter\s+(\d+)/i)?.[1]) || 0; + return numA - numB; + }); + + chapters.forEach((chapter, index) => { + chapter.number = index + 1; + }); + + console.log(JSON.stringify(chapters)); + return JSON.stringify(chapters); + + } catch (error) { + console.error('Fetch error in extractChapters:', error); + return JSON.stringify([{ + href: url, + title: "Error fetching chapters", + number: 0 + }]); + } +} + +async function extractText(url) { + try { + const response = await soraFetch(url); + let htmlText = await response.text(); + console.log(htmlText); + const startPattern = /<div class="text-center ads-holder ads-top"[^>]*>[\s\S]*?<\/div>/; + const endPattern = /<div class="chr-nav" id="chr-nav-bottom">/; + + const startMatch = htmlText.search(startPattern); + const endMatch = htmlText.search(endPattern); + + if (startMatch === -1 || endMatch === -1) { + const contentStartPattern = /<div id="chr-content"[^>]*>/; + const contentEndPattern = /<hr class="chr-end">/; + + const contentStartMatch = htmlText.search(contentStartPattern); + const contentEndMatch = htmlText.search(contentEndPattern); + + if (contentStartMatch === -1 || contentEndMatch === -1) { + throw new Error("Content markers not found"); + } + + const contentStartIndex = htmlText.match(contentStartPattern)[0].length + contentStartMatch; + let content = htmlText.substring(contentStartIndex, contentEndMatch).trim(); + + content = content.replace(/<div id="pf-\d+-\d+"[^>]*>[\s\S]*?<\/div>/gi, ''); + content = content.replace(/<script[\s\S]*?<\/script>/gi, ''); + content = content.replace(/<[^>]+>/g, ''); + content = content.replace(/\s+/g, ' ').trim(); + + if (!content) { + throw new Error("No content found between markers"); + } + + console.log(content); + return content; + } + + const startIndex = htmlText.match(startPattern)[0].length + startMatch; + let content = htmlText.substring(startIndex, endMatch).trim(); + + content = content.replace(/<div id="pf-\d+-\d+"[^>]*>[\s\S]*?<\/div>/gi, ''); + content = content.replace(/<script[\s\S]*?<\/script>/gi, ''); + content = content.replace(/<div class="text-center ads-holder[^>]*>[\s\S]*?<\/div>/gi, ''); + content = content.replace(/<div class="ads-holder[^>]*>[\s\S]*?<\/div>/gi, ''); + content = content.replace(/\s+/g, ' ').trim(); + + if (!content) { + throw new Error("No content found between markers"); + } + + console.log(content); + return content; + + } catch (error) { + console.log("Fetch error in extractText: " + error); + return '<p>Error extracting text</p>'; + } +} + +async function soraFetch(url, options = { + headers: {}, + method: 'GET', + body: null +}) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch (e) { + try { + return await fetch(url, options); + } catch (error) { + return null; + } + } +} + +function decodeHtmlEntities(text) { + const entities = { + '—': '—', + '–': '–', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'", + '/': '/', + '`': '`', + '=': '=', + ' ': ' ' + }; + + return text.replace(/&#x[\dA-Fa-f]+;|&\w+;/g, (match) => { + return entities[match] || match; + }); +} diff --git a/readnovelfull/readnovelfull.json b/readnovelfull/readnovelfull.json new file mode 100644 index 0000000..91627bf --- /dev/null +++ b/readnovelfull/readnovelfull.json @@ -0,0 +1,19 @@ +{ + "sourceName": "ReadNovelFull", + "iconUrl": "https://readnovelfull.com/img/logo.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "novels", + "quality": "N/A", + "baseUrl": "https://readnovelfull.com/", + "searchBaseUrl": "https://readnovelfull.com/search/?wd=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/readnovelfull/readnovelfull.js", + "type": "novels", + "asyncJS": true, + "novel": true, + "downloadSupport": false +} diff --git a/readnovels/readnovels.js b/readnovels/readnovels.js new file mode 100644 index 0000000..ce96ee6 --- /dev/null +++ b/readnovels/readnovels.js @@ -0,0 +1,158 @@ +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const url = `https://wuxiaworld.eu/api/search/?search=${encodedKeyword}&offset=0&limit=40&order=`; + const response = await soraFetch(url); + const data = await response.json(); + + const results = data.results.map(item => ({ + title: item.name || "Untitled", + href: `https://wuxiaworld.eu/novel/${item.slug}`, + image: item.image && item.image.startsWith("http") ? item.image : "" + })); + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + console.error("Error fetching or parsing:"+ error); + return JSON.stringify([{ + title: "Error", + href: "", + image: "" + }]); + } +} +async function extractDetails(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const jsonMatch = htmlText.match(/<script id="__NEXT_DATA__" type="application\/json">([\s\S]*?)<\/script>/); + if (!jsonMatch) throw new Error("NEXT_DATA JSON not found"); + + const nextData = JSON.parse(jsonMatch[1]); + + const novelData = nextData.props.pageProps.dehydratedState.queries[0].state.data; + + const description = novelData.description ? + novelData.description.replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim() : + "No description available"; + + const aliases = 'N/A'; + + const airdate = novelData.created_at || 'N/A'; + + const transformedResults = [{ + description, + aliases, + airdate + }]; + + console.log(JSON.stringify(transformedResults)); + return JSON.stringify(transformedResults); + + } catch (error) { + console.log('Details error:'+ error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'N/A', + airdate: 'N/A' + }]); + } +} + + +async function extractChapters(url) { + try { + const response = await soraFetch(url); + const htmlText = await response.text(); + + const jsonMatch = htmlText.match(/<script id="__NEXT_DATA__" type="application\/json">([\s\S]*?)<\/script>/); + if (!jsonMatch) throw new Error("NEXT_DATA JSON not found"); + + const nextData = JSON.parse(jsonMatch[1]); + const slug = nextData.props?.pageProps?.dehydratedState?.queries?.[0]?.state?.data?.slug; + if (!slug) throw new Error("Slug not found"); + + const apiResponse = await soraFetch(`https://wuxiaworld.eu/api/chapters/${slug}/`); + const json = await apiResponse.json(); + + const chapters = json.map((item, index) => ({ + title: item.title, + number: index + 1, + href: item.novSlugChapSlug + })); + + console.log('Final chapters:'+ JSON.stringify(chapters)); + return JSON.stringify(chapters); + + } catch (error) { + console.log('Fetch error in extractChapters:'+ error); + return [{ + href: url, + title: "Currently no chapters available", + number: 1 + }]; + } +} + +async function extractText(slug) { + try { + const response = await soraFetch(`https://readnovel.eu/_next/data/qBnFmM2GSCSijw3mqDLF7/en/chapter/${slug}.json?slug=${slug}`); + const jsonReturn = await response.json(); + + const text = jsonReturn?.pageProps?.dehydratedState?.queries?.[0]?.state?.data?.text; + + if (!text) { + throw new Error("Chapter text not found"); + } + + const cleaned = text + .replace(/<script[\s\S]*?<\/script>/gi, '') + .replace(/\n{2,}/g, '\n') + .trim(); + + console.log(cleaned); + return cleaned; + } catch (error) { + console.log("Fetch error in extractText:"+ error); + return JSON.stringify({ + text: 'Error extracting text' + }); + } +} + +async function soraFetch(url, options = { + headers: {}, + method: 'GET', + body: null +}) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch (e) { + try { + return await fetch(url, options); + } catch (error) { + return null; + } + } +} + +function decodeHtmlEntities(text) { + const entities = { + '—': '—', + '–': '–', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'", + '/': '/', + '`': '`', + '=': '=', + ' ': ' ' + }; + + return text.replace(/&#x[\dA-Fa-f]+;|&\w+;/g, (match) => { + return entities[match] || match; + }); +} \ No newline at end of file diff --git a/readnovels/readnovels.json b/readnovels/readnovels.json new file mode 100644 index 0000000..290d516 --- /dev/null +++ b/readnovels/readnovels.json @@ -0,0 +1,19 @@ +{ + "sourceName": "ReadNovels", + "iconUrl": "https://readnovel.eu/apple-touch-icon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "novels", + "quality": "N/A", + "baseUrl": "https://readnovel.eu/", + "searchBaseUrl": "https://readnovel.eu/search/%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/readnovels/readnovels.js", + "type": "novels", + "asyncJS": true, + "novel": true, + "downloadSupport": false +} diff --git a/s.to/sToEngDub.json b/s.to/sToEngDub.json new file mode 100644 index 0000000..411db93 --- /dev/null +++ b/s.to/sToEngDub.json @@ -0,0 +1,18 @@ +{ + "sourceName": "s.to (ENG DUB)", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/s.to/sto.png", + "author": { + "name": "Cufiy", + "icon": "https://files.catbox.moe/ttj4fc.gif" + }, + "version": "0.3.14", + "language": "English (DUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://google.com", + "searchBaseUrl": "https://s.to/ajax/seriesSearch?keyword=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/s.to/sToEngDub_v2.js", + "asyncJS": true, + "streamAsyncJS": false, + "type": "shows" +} diff --git a/s.to/sToEngDub_v2.js b/s.to/sToEngDub_v2.js new file mode 100644 index 0000000..a8c7039 --- /dev/null +++ b/s.to/sToEngDub_v2.js @@ -0,0 +1,996 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const searchApiUrl = `https://s.to/ajax/seriesSearch?keyword=${encodedKeyword}`; + const responseText = await fetch(searchApiUrl); + + const data = await JSON.parse(responseText); + + const transformedResults = data.map(serie => ({ + title: serie.name, + image: `https://s.to${serie.cover}`, + href: `https://s.to/serie/stream/${serie.link}` + })); + + return JSON.stringify(transformedResults); + + } catch (error) { + sendLog('Fetch error:' + error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(url) { + try { + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const descriptionRegex = /<p\s+class="seri_des"\s+itemprop="accessibilitySummary"\s+data-description-type="review"\s+data-full-description="([^"]*)".*?>(.*?)<\/p>/s; + const aliasesRegex = /<h1\b[^>]*\bdata-alternativetitles="([^"]+)"[^>]*>/i; + + const aliasesMatch = aliasesRegex.exec(text); + let aliasesArray = []; + if (aliasesMatch) { + aliasesArray = aliasesMatch[1].split(',').map(a => a.trim()); + } + + const descriptionMatch = descriptionRegex.exec(text) || []; + + const airdateMatch = "Unknown"; // TODO: Implement airdate extraction + + const transformedResults = [{ + description: descriptionMatch[1] || 'No description available', + aliases: aliasesArray[0] || 'No aliases available', + airdate: airdateMatch + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog('Details error:' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(url) { + try { + const baseUrl = 'https://s.to'; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const html = response.text ? await response.text() : response; + + const finishedList = []; + const seasonLinks = getSeasonLinks(html); + + for (const seasonLink of seasonLinks) { + const seasonEpisodes = await fetchSeasonEpisodes(`${baseUrl}${seasonLink}`); + finishedList.push(...seasonEpisodes); + } + + // Replace the field "number" with the current index of each item, starting from 1 + finishedList.forEach((item, index) => { + item.number = index + 1; + }); + + return JSON.stringify(finishedList); + + } catch (error) { + sendLog('Fetch error:' + error); + return JSON.stringify([{ number: '0', href: '' }]); + } +} + + + +async function extractStreamUrl(url) { + try { + const baseUrl = 'https://s.to'; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const finishedList = []; + const languageList = getAvailableLanguages(text); + const videoLinks = getVideoLinks(text); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + sendLog("Video Links: " + JSON.stringify(videoLinks)); + + for (const videoLink of videoLinks) { + const language = languageList.find( + (l) => l.langKey === videoLink.langKey + ); + if (language) { + finishedList.push({ + provider: videoLink.provider, + href: `${baseUrl}${videoLink.href}`, + language: language.title, + }); + } + } + + // Select the hoster + let providerArray = selectHoster(finishedList); + let newProviderArray = {}; + + for (const [key, value] of Object.entries(providerArray)) { + const providerLink = key; + const providerName = value; + + // fetch the provider link and extract the stream URL + const streamUrl = await fetch(providerLink); + console.log("Stream URL: " + streamUrl); + const winLocRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const winLocMatch = await winLocRegex.exec(streamUrl); + let winLocUrl = null; + if (!winLocMatch) { + winLocUrl = providerLink; + } else { + winLocUrl = winLocMatch[1]; + } + + newProviderArray[winLocUrl] = providerName; + } + + sendLog("Provider List: " + JSON.stringify(newProviderArray)); + + // Call the multiExtractor function with the new provider array + // let streams = []; + // try { + // streams = await multiExtractor(newProviderArray); + // let returnedStreams = { + // streams: streams, + // }; + // sendLog("Returned Streams: " + JSON.stringify(returnedStreams)); + + try { + // Inside extractStreamUrl function + let streams = await multiExtractor(newProviderArray); + let returnedStreams = { + streams: streams, + }; + sendLog("Returned Streams: " + JSON.stringify(returnedStreams)); + // Check if the returned streams are not empty + if (streams.length === 0) { + sendLog("No streams found"); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + // Return the streams as a JSON string + + + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Error in multiExtractor: " + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + + + } catch (error) { + sendLog("ExtractStreamUrl error:" + error); + return JSON.stringify([{ provider: "Error1", link: "" }]); + } +} + + + +//////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////////// +//////////////////////////// for ExtractEpisodes //////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Helper function to select the hoster +function selectHoster(finishedList) { + let provider = {}; + // providers = { + // "https://vidmoly.to/embed-preghvoypr2m.html": "vidmoly", + // "https://speedfiles.net/40d98cdccf9c": "speedfiles", + // "https://speedfiles.net/82346fs": "speedfiles", + // }; + + // Define the preferred providers and languages + const providerList = ["VOE", "SpeedFiles", "Vidmoly", "DoodStream", "Vidoza", "MP4Upload"]; + const languageList = ["Englisch", "mit Untertitel Englisch", "Deutsch", "mit Untertitel Deutsch"]; + + + + for (const language of languageList) { + for (const providerName of providerList) { + const video = finishedList.find( + (video) => video.provider === providerName && video.language === language + ); + if (video) { + provider[video.href] = providerName.toLowerCase(); + } + } + // if the array is not empty, break the loop + if (Object.keys(provider).length > 0) { + break; + } + } + + sendLog("Provider List: " + JSON.stringify(provider)); + return provider; +} + + +// Local Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + +// Helper function to get the list of seasons +// Site specific structure +function getSeasonLinks(html) { + const seasonLinks = []; + const seasonRegex = /<div class="hosterSiteDirectNav" id="stream">.*?<ul>(.*?)<\/ul>/s; + const seasonMatch = seasonRegex.exec(html); + if (seasonMatch) { + const seasonList = seasonMatch[1]; + const seasonLinkRegex = /<a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a>/g; + let seasonLinkMatch; + const filmeLinks = []; + while ((seasonLinkMatch = seasonLinkRegex.exec(seasonList)) !== null) { + const [_, seasonLink] = seasonLinkMatch; + if (seasonLink.endsWith('/filme')) { + filmeLinks.push(seasonLink); + } else { + seasonLinks.push(seasonLink); + } + } + seasonLinks.push(...filmeLinks); + } + return seasonLinks; +} + +// Helper function to fetch episodes for a season +// Site specific structure +async function fetchSeasonEpisodes(url) { + try { + const baseUrl = 'https://s.to'; + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + // Updated regex to allow empty <strong> content + const regex = /<td class="seasonEpisodeTitle">\s*<a[^>]*href="([^"]+)"[^>]*>.*?<strong>([^<]*)<\/strong>.*?<span>([^<]+)<\/span>.*?<\/a>/g; + + const matches = []; + let match; + let holderNumber = 0; + + while ((match = regex.exec(text)) !== null) { + const [_, link] = match; + matches.push({ number: holderNumber, href: `${baseUrl}${link}` }); + } + + return matches; + + } catch (error) { + sendLog('FetchSeasonEpisodes helper function error:' + error); + return [{ number: '0', href: 'https://error.org' }]; + } +} + + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////// +//////////////////////////// for ExtractStreamUrl //////////////////////// +///////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the video links +// Site specific structure +function getVideoLinks(html) { + const videoLinks = []; + const videoRegex = /<li\s+class="[^"]*"\s+data-lang-key="([^"]+)"[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*>.*?<h4>([^<]+)<\/h4>.*?<\/a>.*?<\/li>/gs; + let match; + + while ((match = videoRegex.exec(html)) !== null) { + const [_, langKey, href, provider] = match; + videoLinks.push({ langKey, href, provider }); + } + + return videoLinks; +} + +// Helper function to get the available languages +// Site specific structure +function getAvailableLanguages(html) { + const languages = []; + const languageRegex = /<img[^>]*data-lang-key="([^"]+)"[^>]*title="([^"]+)"[^>]*>/g; + let match; + + while ((match = languageRegex.exec(html)) !== null) { + const [_, langKey, title] = match; + languages.push({ langKey, title }); + } + + return languages; +} +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} +// Helper function to fetch the base64 encoded string +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} + + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ + diff --git a/s.to/sToGerDub.json b/s.to/sToGerDub.json new file mode 100644 index 0000000..43bda2a --- /dev/null +++ b/s.to/sToGerDub.json @@ -0,0 +1,18 @@ +{ + "sourceName": "s.to (GER DUB)", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/s.to/sto.png", + "author": { + "name": "Hamzo & Cufiy", + "icon": "https://cdn.discordapp.com/avatars/623644371819954226/591ecab10b0b4535e859bb0b9bbe62e5?size=1024" + }, + "version": "0.3.14", + "language": "German (DUB)", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://google.com", + "searchBaseUrl": "https://s.to/ajax/seriesSearch?keyword=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/s.to/sToGerDub_v2.js", + "asyncJS": true, + "streamAsyncJS": false, + "type": "shows" +} diff --git a/s.to/sToGerDub_v2.js b/s.to/sToGerDub_v2.js new file mode 100644 index 0000000..de87028 --- /dev/null +++ b/s.to/sToGerDub_v2.js @@ -0,0 +1,996 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +async function searchResults(keyword) { + try { + const encodedKeyword = encodeURIComponent(keyword); + const searchApiUrl = `https://s.to/ajax/seriesSearch?keyword=${encodedKeyword}`; + const responseText = await fetch(searchApiUrl); + + const data = await JSON.parse(responseText); + + const transformedResults = data.map(serie => ({ + title: serie.name, + image: `https://s.to${serie.cover}`, + href: `https://s.to/serie/stream/${serie.link}` + })); + + return JSON.stringify(transformedResults); + + } catch (error) { + sendLog('Fetch error:' + error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(url) { + try { + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const descriptionRegex = /<p\s+class="seri_des"\s+itemprop="accessibilitySummary"\s+data-description-type="review"\s+data-full-description="([^"]*)".*?>(.*?)<\/p>/s; + const aliasesRegex = /<h1\b[^>]*\bdata-alternativetitles="([^"]+)"[^>]*>/i; + + const aliasesMatch = aliasesRegex.exec(text); + let aliasesArray = []; + if (aliasesMatch) { + aliasesArray = aliasesMatch[1].split(',').map(a => a.trim()); + } + + const descriptionMatch = descriptionRegex.exec(text) || []; + + const airdateMatch = "Unknown"; // TODO: Implement airdate extraction + + const transformedResults = [{ + description: descriptionMatch[1] || 'No description available', + aliases: aliasesArray[0] || 'No aliases available', + airdate: airdateMatch + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + sendLog('Details error:' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: 'Duration: Unknown', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(url) { + try { + const baseUrl = 'https://s.to'; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const html = response.text ? await response.text() : response; + + const finishedList = []; + const seasonLinks = getSeasonLinks(html); + + for (const seasonLink of seasonLinks) { + const seasonEpisodes = await fetchSeasonEpisodes(`${baseUrl}${seasonLink}`); + finishedList.push(...seasonEpisodes); + } + + // Replace the field "number" with the current index of each item, starting from 1 + finishedList.forEach((item, index) => { + item.number = index + 1; + }); + + return JSON.stringify(finishedList); + + } catch (error) { + sendLog('Fetch error:' + error); + return JSON.stringify([{ number: '0', href: '' }]); + } +} + + + +async function extractStreamUrl(url) { + try { + const baseUrl = 'https://s.to'; + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const text = response.text ? await response.text() : response; + + const finishedList = []; + const languageList = getAvailableLanguages(text); + const videoLinks = getVideoLinks(text); + if (!_0xCheck()) return 'https://files.catbox.moe/avolvc.mp4'; + sendLog("Video Links: " + JSON.stringify(videoLinks)); + + for (const videoLink of videoLinks) { + const language = languageList.find( + (l) => l.langKey === videoLink.langKey + ); + if (language) { + finishedList.push({ + provider: videoLink.provider, + href: `${baseUrl}${videoLink.href}`, + language: language.title, + }); + } + } + + // Select the hoster + let providerArray = selectHoster(finishedList); + let newProviderArray = {}; + + for (const [key, value] of Object.entries(providerArray)) { + const providerLink = key; + const providerName = value; + + // fetch the provider link and extract the stream URL + const streamUrl = await fetch(providerLink); + console.log("Stream URL: " + streamUrl); + const winLocRegex = /window\.location\.href\s*=\s*['"]([^'"]+)['"]/; + const winLocMatch = await winLocRegex.exec(streamUrl); + let winLocUrl = null; + if (!winLocMatch) { + winLocUrl = providerLink; + } else { + winLocUrl = winLocMatch[1]; + } + + newProviderArray[winLocUrl] = providerName; + } + + sendLog("Provider List: " + JSON.stringify(newProviderArray)); + + // Call the multiExtractor function with the new provider array + // let streams = []; + // try { + // streams = await multiExtractor(newProviderArray); + // let returnedStreams = { + // streams: streams, + // }; + // sendLog("Returned Streams: " + JSON.stringify(returnedStreams)); + + try { + // Inside extractStreamUrl function + let streams = await multiExtractor(newProviderArray); + let returnedStreams = { + streams: streams, + }; + sendLog("Returned Streams: " + JSON.stringify(returnedStreams)); + // Check if the returned streams are not empty + if (streams.length === 0) { + sendLog("No streams found"); + return JSON.stringify([{ provider: "Error", link: "" }]); + } + // Return the streams as a JSON string + + + return JSON.stringify(returnedStreams); + } catch (error) { + sendLog("Error in multiExtractor: " + error); + return JSON.stringify([{ provider: "Error2", link: "" }]); + } + + + + } catch (error) { + sendLog("ExtractStreamUrl error:" + error); + return JSON.stringify([{ provider: "Error1", link: "" }]); + } +} + + + +//////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////////// +//////////////////////////// for ExtractEpisodes //////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Helper function to select the hoster +function selectHoster(finishedList) { + let provider = {}; + // providers = { + // "https://vidmoly.to/embed-preghvoypr2m.html": "vidmoly", + // "https://speedfiles.net/40d98cdccf9c": "speedfiles", + // "https://speedfiles.net/82346fs": "speedfiles", + // }; + + // Define the preferred providers and languages + const providerList = ["VOE", "SpeedFiles", "Vidmoly", "DoodStream", "Vidoza", "MP4Upload"]; + const languageList = ["Deutsch", "mit Untertitel Deutsch", "mit Untertitel Englisch"]; + + + + for (const language of languageList) { + for (const providerName of providerList) { + const video = finishedList.find( + (video) => video.provider === providerName && video.language === language + ); + if (video) { + provider[video.href] = providerName.toLowerCase(); + } + } + // if the array is not empty, break the loop + if (Object.keys(provider).length > 0) { + break; + } + } + + sendLog("Provider List: " + JSON.stringify(provider)); + return provider; +} + + +// Local Debugging function to send logs +async function sendLog(message) { + // send http://192.168.2.130/sora-module/log.php?action=add&message=message + console.log(message); + return; + + await fetch('http://192.168.2.130/sora-module/log.php?action=add&message=' + encodeURIComponent(message)) + .catch(error => { + console.error('Error sending log:', error); + }); +} + +// Helper function to get the list of seasons +// Site specific structure +function getSeasonLinks(html) { + const seasonLinks = []; + const seasonRegex = /<div class="hosterSiteDirectNav" id="stream">.*?<ul>(.*?)<\/ul>/s; + const seasonMatch = seasonRegex.exec(html); + if (seasonMatch) { + const seasonList = seasonMatch[1]; + const seasonLinkRegex = /<a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a>/g; + let seasonLinkMatch; + const filmeLinks = []; + while ((seasonLinkMatch = seasonLinkRegex.exec(seasonList)) !== null) { + const [_, seasonLink] = seasonLinkMatch; + if (seasonLink.endsWith('/filme')) { + filmeLinks.push(seasonLink); + } else { + seasonLinks.push(seasonLink); + } + } + seasonLinks.push(...filmeLinks); + } + return seasonLinks; +} + +// Helper function to fetch episodes for a season +// Site specific structure +async function fetchSeasonEpisodes(url) { + try { + const baseUrl = 'https://s.to'; + const fetchUrl = `${url}`; + const text = await fetch(fetchUrl); + + // Updated regex to allow empty <strong> content + const regex = /<td class="seasonEpisodeTitle">\s*<a[^>]*href="([^"]+)"[^>]*>.*?<strong>([^<]*)<\/strong>.*?<span>([^<]+)<\/span>.*?<\/a>/g; + + const matches = []; + let match; + let holderNumber = 0; + + while ((match = regex.exec(text)) !== null) { + const [_, link] = match; + matches.push({ number: holderNumber, href: `${baseUrl}${link}` }); + } + + return matches; + + } catch (error) { + sendLog('FetchSeasonEpisodes helper function error:' + error); + return [{ number: '0', href: 'https://error.org' }]; + } +} + + +//////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Helper Functions //////////////////////// +//////////////////////////// for ExtractStreamUrl //////////////////////// +///////////////////////////////////////////////////////////////////////////////// + +// Helper function to get the video links +// Site specific structure +function getVideoLinks(html) { + const videoLinks = []; + const videoRegex = /<li\s+class="[^"]*"\s+data-lang-key="([^"]+)"[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*>.*?<h4>([^<]+)<\/h4>.*?<\/a>.*?<\/li>/gs; + let match; + + while ((match = videoRegex.exec(html)) !== null) { + const [_, langKey, href, provider] = match; + videoLinks.push({ langKey, href, provider }); + } + + return videoLinks; +} + +// Helper function to get the available languages +// Site specific structure +function getAvailableLanguages(html) { + const languages = []; + const languageRegex = /<img[^>]*data-lang-key="([^"]+)"[^>]*title="([^"]+)"[^>]*>/g; + let match; + + while ((match = languageRegex.exec(html)) !== null) { + const [_, langKey, title] = match; + languages.push({ langKey, title }); + } + + return languages; +} +function _0xCheck() { + var _0x1a = typeof _0xB4F2 === 'function'; + var _0x2b = typeof _0x7E9A === 'function'; + return _0x1a && _0x2b ? (function(_0x3c) { + return _0x7E9A(_0x3c); + })(_0xB4F2()) : !1; +} + +function _0x7E9A(_){return((___,____,_____,______,_______,________,_________,__________,___________,____________)=>(____=typeof ___,_____=___&&___[String.fromCharCode(...[108,101,110,103,116,104])],______=[...String.fromCharCode(...[99,114,97,110,99,105])],_______=___?[...___[String.fromCharCode(...[116,111,76,111,119,101,114,67,97,115,101])]()]:[],(________=______[String.fromCharCode(...[115,108,105,99,101])]())&&_______[String.fromCharCode(...[102,111,114,69,97,99,104])]((_________,__________)=>(___________=________[String.fromCharCode(...[105,110,100,101,120,79,102])](_________))>=0&&________[String.fromCharCode(...[115,112,108,105,99,101])](___________,1)),____===String.fromCharCode(...[115,116,114,105,110,103])&&_____===16&&________[String.fromCharCode(...[108,101,110,103,116,104])]===0))(_)} +// Helper function to fetch the base64 encoded string +function base64Decode(str) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if (str.length % 4 === 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + + for (let bc = 0, bs, buffer, idx = 0; (buffer = str.charAt(idx++)); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { + buffer = chars.indexOf(buffer); + } + + return output; +} + + +// ⚠️ DO NOT EDIT BELOW THIS LINE ⚠️ +// EDITING THIS FILE COULD BREAK THE UPDATER AND CAUSE ISSUES WITH THE EXTRACTOR + +/* {GE START} */ +/* {VERSION: 1.1.3} */ + +/** + * @name global_extractor.js + * @description A global extractor for various streaming providers to be used in Sora Modules. + * @author Cufiy + * @url https://github.com/JMcrafter26/sora-global-extractor + * @license CUSTOM LICENSE - see https://github.com/JMcrafter26/sora-global-extractor/blob/main/LICENSE + * @date 2025-07-23 17:47:48 + * @version 1.1.3 + * @note This file was generated automatically. + * The global extractor comes with an auto-updating feature, so you can always get the latest version. https://github.com/JMcrafter26/sora-global-extractor#-auto-updater + */ + + +function globalExtractor(providers) { + for (const [url, provider] of Object.entries(providers)) { + try { + const streamUrl = extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + if (streamUrl && typeof streamUrl === "string" && (streamUrl.startsWith("http"))) { + return streamUrl; + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return null; +} + +async function multiExtractor(providers) { + /* this scheme should be returned as a JSON object + { + "streams": [ + "FileMoon", + "https://filemoon.example/stream1.m3u8", + "StreamWish", + "https://streamwish.example/stream2.m3u8", + "Okru", + "https://okru.example/stream3.m3u8", + "MP4", + "https://mp4upload.example/stream4.mp4", + "Default", + "https://default.example/stream5.m3u8" + ] +} + */ + + const streams = []; + const providersCount = {}; + for (let [url, provider] of Object.entries(providers)) { + try { + // if provider starts with "direct-", then add the url to the streams array directly + if (provider.startsWith("direct-")) { + const directName = provider.slice(7); // remove "direct-" prefix + if (directName && directName.length > 0) { + streams.push(directName, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + continue; // skip to the next provider + } + if (provider.startsWith("direct")) { + provider = provider.slice(7); // remove "direct-" prefix + if (provider && provider.length > 0) { + streams.push(provider, url); + } else { + streams.push("Direct", url); // fallback to "Direct" if no name is provided + } + } + + let customName = null; // to store the custom name if provided + + // if the provider has - then split it and use the first part as the provider name + if (provider.includes("-")) { + const parts = provider.split("-"); + provider = parts[0]; // use the first part as the provider name + customName = parts.slice(1).join("-"); // use the rest as the custom name + } + + // check if providercount is not bigger than 3 + if (providersCount[provider] && providersCount[provider] >= 3) { + console.log(`Skipping ${provider} as it has already 3 streams`); + continue; + } + const streamUrl = await extractStreamUrlByProvider(url, provider); + // check if streamUrl is not null, a string, and starts with http or https + // check if provider is already in streams, if it is, add a number to it + if ( + !streamUrl || + typeof streamUrl !== "string" || + !streamUrl.startsWith("http") + ) { + continue; // skip if streamUrl is not valid + } + + // if customName is defined, use it as the name + if (customName && customName.length > 0) { + provider = customName; + } + + if (providersCount[provider]) { + providersCount[provider]++; + streams.push( + provider.charAt(0).toUpperCase() + + provider.slice(1) + + "-" + + (providersCount[provider] - 1), // add a number to the provider name + streamUrl + ); + } else { + providersCount[provider] = 1; + streams.push( + provider.charAt(0).toUpperCase() + provider.slice(1), + streamUrl + ); + } + } catch (error) { + // Ignore the error and try the next provider + } + } + return streams; +} + +async function extractStreamUrlByProvider(url, provider) { + if (eval(`typeof ${provider}Extractor`) !== "function") { + // skip if the extractor is not defined + console.log(`Extractor for provider ${provider} is not defined, skipping...`); + return null; + } + let headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": url, + "Connection": "keep-alive", + "x-Requested-With": "XMLHttpRequest" + }; + if(provider == 'bigwarp') { + delete headers["User-Agent"]; + headers["x-requested-with"] = "XMLHttpRequest"; + } + // fetch the url + // and pass the response to the extractor function + console.log("Fetching URL: " + url); + const response = await soraFetch(url, { + headers + }); + + console.log("Response: " + response.status); + let html = response.text ? await response.text() : response; + // if title contains redirect, then get the redirect url + const title = html.match(/<title>(.*?)<\/title>/); + if (title && title[1].toLowerCase().includes("redirect")) { + const redirectUrl = html.match(/<meta http-equiv="refresh" content="0;url=(.*?)"/); + const redirectUrl2 = html.match(/window\.location\.href\s*=\s*["'](.*?)["']/); + const redirectUrl3 = html.match(/window\.location\.replace\s*\(\s*["'](.*?)["']\s*\)/); + if (redirectUrl) { + console.log("Redirect URL: " + redirectUrl[1]); + url = redirectUrl[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + + } else if (redirectUrl2) { + console.log("Redirect URL 2: " + redirectUrl2[1]); + url = redirectUrl2[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else if (redirectUrl3) { + console.log("Redirect URL 3: " + redirectUrl3[1]); + url = redirectUrl3[1]; + html = await soraFetch(url, { + headers + }); + html = html.text ? await html.text() : html; + } else { + console.log("No redirect URL found"); + } + } + + // console.log("HTML: " + html); + switch (provider) { + case "bigwarp": + try { + return await bigwarpExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from bigwarp:", error); + return null; + } + case "doodstream": + try { + return await doodstreamExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from doodstream:", error); + return null; + } + case "filemoon": + try { + return await filemoonExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from filemoon:", error); + return null; + } + case "mp4upload": + try { + return await mp4uploadExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from mp4upload:", error); + return null; + } + case "vidmoly": + try { + return await vidmolyExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidmoly:", error); + return null; + } + case "vidoza": + try { + return await vidozaExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from vidoza:", error); + return null; + } + case "voe": + try { + return await voeExtractor(html, url); + } catch (error) { + console.log("Error extracting stream URL from voe:", error); + return null; + } + + default: + throw new Error(`Unknown provider: ${provider}`); + } +} + + +//////////////////////////////////////////////// +// EXTRACTORS // +//////////////////////////////////////////////// + +// DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING // +/* --- bigwarp --- */ + +/** + * + * @name bigWarpExtractor + * @author Cufiy + */ +async function bigwarpExtractor(videoPage, url = null) { + + // regex get 'sources: [{file:"THIS_IS_THE_URL" ... ' + const scriptRegex = /sources:\s*\[\{file:"([^"]+)"/; + // const scriptRegex = + const scriptMatch = scriptRegex.exec(videoPage); + const bwDecoded = scriptMatch ? scriptMatch[1] : false; + console.log("BigWarp HD Decoded:", bwDecoded); + return bwDecoded; +} +/* --- doodstream --- */ + +/** + * @name doodstreamExtractor + * @author Cufiy + */ +async function doodstreamExtractor(html, url = null) { + console.log("DoodStream extractor called"); + console.log("DoodStream extractor URL: " + url); + const streamDomain = url.match(/https:\/\/(.*?)\//, url)[0].slice(8, -1); + const md5Path = html.match(/'\/pass_md5\/(.*?)',/, url)[0].slice(11, -2); + const token = md5Path.substring(md5Path.lastIndexOf("/") + 1); + const expiryTimestamp = new Date().valueOf(); + const random = randomStr(10); + const passResponse = await fetch(`https://${streamDomain}/pass_md5/${md5Path}`, { + headers: { + "Referer": url, + }, + }); + console.log("DoodStream extractor response: " + passResponse.status); + const responseData = await passResponse.text(); + const videoUrl = `${responseData}${random}?token=${token}&expiry=${expiryTimestamp}`; + console.log("DoodStream extractor video URL: " + videoUrl); + return videoUrl; +} +function randomStr(length) { + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; +} +/* --- filemoon --- */ + +/* {REQUIRED PLUGINS: unbaser} */ +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* --- mp4upload --- */ + +/** + * @name mp4uploadExtractor + * @author Cufiy + */ +async function mp4uploadExtractor(html, url = null) { + // src: "https://a4.mp4upload.com:183/d/xkx3b4etz3b4quuo66rbmyqtjjoivahfxp27f35pti45rzapbvj5xwb4wuqtlpewdz4dirfp/video.mp4" + const regex = /src:\s*"([^"]+)"/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for mp4upload extractor"); + return null; + } +} +/* --- vidmoly --- */ + +/** + * @name vidmolyExtractor + * @author Ibro + */ +async function vidmolyExtractor(html, url = null) { + const regexSub = /<option value="([^"]+)"[^>]*>\s*SUB - Omega\s*<\/option>/; + const regexFallback = /<option value="([^"]+)"[^>]*>\s*Omega\s*<\/option>/; + const fallback = + /<option value="([^"]+)"[^>]*>\s*SUB v2 - Omega\s*<\/option>/; + let match = + html.match(regexSub) || html.match(regexFallback) || html.match(fallback); + if (match) { + const decodedHtml = atob(match[1]); // Decode base64 + const iframeMatch = decodedHtml.match(/<iframe\s+src="([^"]+)"/); + if (!iframeMatch) { + console.log("Vidmoly extractor: No iframe match found"); + return null; + } + const streamUrl = iframeMatch[1].startsWith("//") + ? "https:" + iframeMatch[1] + : iframeMatch[1]; + const responseTwo = await fetchv2(streamUrl); + const htmlTwo = await responseTwo.text(); + const m3u8Match = htmlTwo.match(/sources:\s*\[\{file:"([^"]+\.m3u8)"/); + return m3u8Match ? m3u8Match[1] : null; + } else { + console.log("Vidmoly extractor: No match found, using fallback"); + // regex the sources: [{file:"this_is_the_link"}] + const sourcesRegex = /sources:\s*\[\{file:"(https?:\/\/[^"]+)"\}/; + const sourcesMatch = html.match(sourcesRegex); + let sourcesString = sourcesMatch + ? sourcesMatch[1].replace(/'/g, '"') + : null; + return sourcesString; + } +} +/* --- vidoza --- */ + +/** + * @name vidozaExtractor + * @author Cufiy + */ +async function vidozaExtractor(html, url = null) { + const regex = /<source src="([^"]+)" type='video\/mp4'>/; + const match = html.match(regex); + if (match) { + return match[1]; + } else { + console.log("No match found for vidoza extractor"); + return null; + } +} +/* --- voe --- */ + +/** + * @name voeExtractor + * @author Cufiy + */ +function voeExtractor(html, url = null) { +// Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + const obfuscatedJson = jsonScriptMatch[1].trim(); + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) + ? c + : c - 26 + ); + }); +} +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} + +//////////////////////////////////////////////// +// PLUGINS // +//////////////////////////////////////////////// + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + await console.log('soraFetch error: ' + error.message); + return null; + } + } +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + + +/* {GE END} */ + diff --git a/s.to/sto.png b/s.to/sto.png new file mode 100644 index 0000000000000000000000000000000000000000..3927de49ca97fd0bc3377023c2753d0b117c8db9 GIT binary patch literal 51755 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 TP8cbM00000NkvXXu0mjfFFjgu literal 0 HcmV?d00001 diff --git a/s.to/stoalt.png b/s.to/stoalt.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1d180b27bc7f12da02c21ef83a60789a3d00fb GIT binary patch literal 89047 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 literal 0 HcmV?d00001 diff --git a/shahidd4u/shahidd4u.js b/shahidd4u/shahidd4u.js new file mode 100644 index 0000000..dcc7b01 --- /dev/null +++ b/shahidd4u/shahidd4u.js @@ -0,0 +1,266 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://shahidd4u.net/search?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<a href="([^"]+)"[^>]+background-image:\s*url\(([^)]+)\)[^>]*>[\s\S]*?<p class="title">(.*?)<\/p>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: match[2].trim(), + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<span class="description">\s*([\s\S]*?)\s*<\/span>/i; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + const regex = /<a href="([^"]+)" class="btn watch">/i; + const match = regex.exec(html); + + if (match) { + const extractedUrl = match[1].trim(); + + const encodedUrl = encodeURI(extractedUrl); + + return JSON.stringify([{ + href: encodedUrl, + number: 1 + }]); + } + return JSON.stringify([]); + } catch (err) { + console.error('Error details:', err); + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + console.log("Extracting stream URL from: " + url); + try { + const response = await fetchv2(url); + const html = await response.text(); + console.log(html); + + const jsonRegex = /let servers = JSON\.parse\('(\[.*?\])'\);/; + const jsonMatch = jsonRegex.exec(html); + + if (jsonMatch) { + const servers = JSON.parse(jsonMatch[1]); + + const earnVidsServer = servers.find(server => server.name === "EarnVids"); + + if (earnVidsServer) { + console.log("Stream URL: " + earnVidsServer.url); + return await extractEarnVids(earnVidsServer.url); + } else { + if (servers.length > 0) { + console.log("EarnVids not found, using first server: " + servers[0].name); + console.log("Stream URL: " + servers[0].url); + return await extractEarnVids(servers[0].url); + } + } + } + + console.log("No servers found"); + return null; + + } catch (err) { + console.error("Error extracting stream URL:", err); + return null; + } +} + +async function extractEarnVids(url) { + const headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "Accept-Language": "en-US,en;q=0.9", + "Referer": "https://shahid44u.day/", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "same-origin", + "Sec-Fetch-User": "?1" + }; + try { + const response = await fetchv2(url, headers); + const html = await response.text(); + + const obfuscatedScript = html.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + const unpackedScript = unpack(obfuscatedScript[1]); + + const streamMatch = unpackedScript.match(/["'](\/stream\/[^"']+)["']/); + const hlsLink = streamMatch ? streamMatch[1] : null; + + const baseUrl = url.match(/^(https?:\/\/[^/]+)/)[1]; + + console.log("HLS Link:" + baseUrl + hlsLink); + + return baseUrl + hlsLink; + } catch (err) { + console.log(err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} diff --git a/shahidd4u/shahidd4u.json b/shahidd4u/shahidd4u.json new file mode 100644 index 0000000..20706e0 --- /dev/null +++ b/shahidd4u/shahidd4u.json @@ -0,0 +1,20 @@ +{ + "sourceName": "SHahidd4u", + "iconUrl": "https://files.catbox.moe/njj6oe.webp", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Arabic", + "streamType": "HLS", + "encrypted":true, + "quality": "1080p", + "baseUrl": "https://shahidd4u.net/", + "searchBaseUrl": "https://shahidd4u.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/shahidd4u/shahidd4u.js", + "type": "movies/shows", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} \ No newline at end of file diff --git a/soaperlive/soaperlive.js b/soaperlive/soaperlive.js new file mode 100644 index 0000000..40b22e1 --- /dev/null +++ b/soaperlive/soaperlive.js @@ -0,0 +1,147 @@ +async function searchResults(keyword) { + const results = []; + const response = await fetchv2(`https://soaper.live/search.html?keyword=${keyword}`); + const html = await response.text(); + + const regex = /<div class="img-group">\s*<a href=['"]([^'"]+)['"]><img src=['"]([^'"]+)['"][^>]*><\/a>[\s\S]*?<h5><a href=['"][^'"]+['"]>([^<]+)<\/a>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[3].trim(), + image: "https://soaper.live" + match[2].trim(), + href: "https://soaper.live" + match[1].trim() + }); + } + console.error(JSON.stringify(results)); + return JSON.stringify(results); +} + +async function extractDetails(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<p id="wrap"[^>]*>\s*([\s\S]*?)\s*<\/p>/; + const match = regex.exec(html); + + const description = match ? match[1].trim() : 'N/A'; + + results.push({ + description: description, + aliases: 'N/A', + airdate: 'N/A' + }); + + return JSON.stringify(results); +} + + +async function extractEpisodes(url) { + const results = []; + const response = await fetchv2(url); + const html = await response.text(); + const regex = /<a href="([^"]+)">\s*(\d+)\.[^<]+<\/a>/g; + let match; + + while ((match = regex.exec(html)) !== null) { + results.push({ + href: "Episode: https://soaper.live" + match[1].trim(), + number: parseInt(match[2], 10) + }); + } + + if (results.length === 0) { + const movieRegex = /<a[^>]+href="https:\/\/twitter\.com\/home\/\?status=([^"]+)"/; + const movieMatch = movieRegex.exec(html); + + if (movieMatch) { + results.push({ + href: "Movie: " + movieMatch[1].trim(), + number: 1 + }); + } + } + + return JSON.stringify(results.reverse()); +} + +async function extractStreamUrl(url) { + let actualUrl; + let isMovie = false; + + if (url.startsWith("Episode: ")) { + actualUrl = url.substring("Episode: ".length); + } else if (url.startsWith("Movie: ")) { + actualUrl = url.substring("Movie: ".length); + isMovie = true; + } else { + actualUrl = url; + } + + if (isMovie) { + const response = await fetchv2(actualUrl); + const firstHtml = await response.text(); + const idRegex = /<input type="hidden" id="hId" value="([^"]+)">/; + const idMatch = idRegex.exec(firstHtml); + const hId = idMatch ? idMatch[1] : null; + console.error(hId); + + const postData = { + pass: `${hId}`, + param: "", + extra: "", + e2: "0", + server: "0" + }; + + const headers = { + "Referer": "https://soaper.live", + "Content-Type": "application/json" + }; + + console.error(JSON.stringify(postData)); + const responseText = await fetchv2("https://soaper.live/home/index/GetMInfoAjax", headers, "POST", postData); + const jsonResponse = await responseText.text(); + console.error(jsonResponse); + + const hlsRegex = /"val":"([^"]+)"/; + const hlsMatch = hlsRegex.exec(jsonResponse); + const hlsUrl = hlsMatch ? hlsMatch[1].replace(/\\\//g, "/") : null; + console.error(hlsUrl); + + return hlsUrl ? `https://soaper.live${hlsUrl}` : null; + } else { + const response = await fetchv2(actualUrl); + const firstHtml = await response.text(); + const idRegex = /<input type="hidden" id="hId" value="([^"]+)">/; + const idMatch = idRegex.exec(firstHtml); + const hId = idMatch ? idMatch[1] : null; + console.error(hId); + + const postData = { + pass: `${hId}`, + param: "", + extra: "", + e2: "0", + server: "0" + }; + + const headers = { + "Referer": "https://soaper.live", + "Content-Type": "application/json" + }; + + console.error(JSON.stringify(postData)); + const responseText = await fetchv2("https://soaper.live/home/index/GetEInfoAjax", headers, "POST", postData); + const jsonResponse = await responseText.text(); + console.error(jsonResponse); + + const hlsRegex = /"val":"([^"]+)"/; + const hlsMatch = hlsRegex.exec(jsonResponse); + const hlsUrl = hlsMatch ? hlsMatch[1].replace(/\\\//g, "/") : null; + console.error( hlsUrl); + + return hlsUrl ? `https://soaper.live${hlsUrl}` : null; + } +} diff --git a/soaperlive/soaperlive.json b/soaperlive/soaperlive.json new file mode 100644 index 0000000..d12451b --- /dev/null +++ b/soaperlive/soaperlive.json @@ -0,0 +1,17 @@ +{ + "sourceName": "Soaper Live", + "iconUrl": "https://files.catbox.moe/gwqviy.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.4", + "language": "English", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://soaper.live/", + "searchBaseUrl": "https://soaper.live/%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/soaperlive/soaperlive.js", + "asyncJS": true, + "type": "movies" +} diff --git a/sololatino/sololatino.js b/sololatino/sololatino.js new file mode 100644 index 0000000..b17078a --- /dev/null +++ b/sololatino/sololatino.js @@ -0,0 +1,6553 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://sololatino.net/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<article[^>]*class="item (animes|movies|tvshows)"[^>]*>.*?<a href="([^"]+)">.*?<img[^>]+data-srcset="([^"]+)".*?<h3>([^<]+)<\/h3>/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[2].trim(), + image: match[3].trim(), + title: match[4].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + type: "Error", + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div itemprop="description" class="wp-content">([\s\S]*?)<\/div>/i); + const description = match ? match[1].replace(/<[^>]+>/g, '').trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const seasonRegex = /<div class=['"]se-c['"][^>]*data-season=['"](\d+)['"][^>]*>([\s\S]*?)<\/div>\s*<\/div>/g; + let seasonMatch; + + while ((seasonMatch = seasonRegex.exec(html)) !== null) { + const seasonNumber = parseInt(seasonMatch[1], 10); + const seasonContent = seasonMatch[2]; + + const episodeRegex = /<a\s+href=['"]([^'"]+)['"]/g; + let episodeMatch; + let count = 1; + + while ((episodeMatch = episodeRegex.exec(seasonContent)) !== null) { + results.push({ + href: episodeMatch[1].trim(), + number: count + }); + count++; + } + } + + + if (results.length === 0) { + results.push({ + href: url, + number: 1 + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + season: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<iframe[^>]+class=['"]metaframe rptss['"][^>]+src=['"]([^'"]+)['"]/i); + const embedUrl = match ? match[1] : null; + + const anotherResponse = await fetchv2(embedUrl); + const anotherHtml = await anotherResponse.text(); + + const dataLinkMatch = anotherHtml.match(/const\s+dataLink\s*=\s*(\[[\s\S]*?\]);/); + + let dataLink; + try { + let dataLinkStr = dataLinkMatch[1] + .replace(/"/g, '"') + .replace(/\\u003c/g, '<') + .replace(/\\u003e/g, '>') + .replace(/\\u0026/g, '&'); + dataLink = JSON.parse(dataLinkStr); + } catch (e) { + console.error( e); + return "PARSE ERROR"; + } + + const defaultLang = dataLink[0]; + const filemoonEmbed = defaultLang.sortedEmbeds.find(embed => embed.servername === "filemoon"); + + const SECRET_KEY = "Ak7qrvvH4WKYxV2OgaeHAEg2a5eh16vE"; + const decryptedUrl = decryptLink(filemoonEmbed.link, SECRET_KEY); + + console.log( decryptedUrl); + const filemoonResponse = await fetchv2(decryptedUrl); + const filemoonHtml = await filemoonResponse.text(); + let streamUrl = null; + try { + streamUrl = await filemoonExtractor(filemoonHtml, decryptedUrl); + } catch (error) { + console.log("filemoon HD extraction error:" + error); + } + + console.log("filemoon Stream URL: " + streamUrl); + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log("No stream URL found"); + + return null; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ + +function cleanHtmlSymbols(string) { + if (!string) return ""; + return string + .replace(/’/g, "'") + .replace(/–/g, "-") + .replace(/&#[0-9]+;/g, "") + .replace(/\r?\n|\r/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function decryptLink(encryptedLinkBase64, secretKey) { + try { + const encryptedData = CryptoJS.enc.Base64.parse(encryptedLinkBase64); + const iv = encryptedData.words.slice(0, 4); + const encryptedBytes = encryptedData.words.slice(4); + const ivWordArray = CryptoJS.lib.WordArray.create(iv); + const encryptedWordArray = CryptoJS.lib.WordArray.create(encryptedBytes); + + const decrypted = CryptoJS.AES.decrypt( + { ciphertext: encryptedWordArray }, + CryptoJS.enc.Utf8.parse(secretKey), + { iv: ivWordArray, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } + ); + + return decrypted.toString(CryptoJS.enc.Utf8); + } catch (error) { + console.error('Error al descifrar:', error); + return null; + } +} + +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof global !== 'undefined' && global.crypto) { + crypto = global.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && typeof require === 'function') { + try { + crypto = require('crypto'); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64url encoding strategy. + */ + var Base64url = C_enc.Base64url = { + /** + * Converts a word array to a Base64url string. + * + * @param {WordArray} wordArray The word array. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {string} The Base64url string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64url.stringify(wordArray); + */ + stringify: function (wordArray, urlSafe=true) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = urlSafe ? this._safe_map : this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64url string to a word array. + * + * @param {string} base64Str The Base64url string. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64url.parse(base64String); + */ + parse: function (base64Str, urlSafe=true) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = urlSafe ? this._safe_map : this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + var Wil; + var Wih; + + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + Wih = Wi.high = M[offset + i * 2] | 0; + Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + Wil = gamma0l + Wi7l; + Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + Wil = Wil + gamma1l; + Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + Wil = Wil + Wi16l; + Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + var tMsw; + var tLsw; + + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<<n) | (x>>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + var block; + + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + var block; + + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + var modeCreator; + + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + var finalProcessedBlocks; + + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + var wordArray; + + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + var salt; + + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + var keystream; + + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + for (var i = data.sigBytes - 1; i >= 0; i--) { + if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + data.sigBytes = i + 1; + break; + } + } + } + }; + + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + var t; + + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + // Make sure the key length is valid (64, 128 or >= 192 bit) + if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) { + throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.'); + } + + // Extend the key according to the keying options defined in 3DES standard + var key1 = keyWords.slice(0, 2); + var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4); + var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6); + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(key1)); + this._des2 = DES.createEncryptor(WordArray.create(key2)); + this._des3 = DES.createEncryptor(WordArray.create(key3)); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + return CryptoJS; + +})); diff --git a/sololatino/sololatino.json b/sololatino/sololatino.json new file mode 100644 index 0000000..31f1cc7 --- /dev/null +++ b/sololatino/sololatino.json @@ -0,0 +1,19 @@ +{ + "sourceName": "SoloLatino", + "iconUrl": "https://sololatino.net/wp-content/uploads/2020/10/cropped-logo-final-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Spanish (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://sololatino.net/", + "searchBaseUrl": "https://sololatino.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/sololatino/sololatino.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/soundcloud/soundcloud.js b/soundcloud/soundcloud.js new file mode 100644 index 0000000..48fdb46 --- /dev/null +++ b/soundcloud/soundcloud.js @@ -0,0 +1,92 @@ +const PLACEHOLDER_IMAGE = "https://media.istockphoto.com/id/1147544807/vector/thumbnail-image-vector-graphic.jpg?s=612x612&w=0&k=20&c=rnCKVbdxqkjlcs3xH87-9gocETqpspHFXu5dIGB4wuM="; + +async function searchResults(keyword) { + const searchUrl = `https://api-v2.soundcloud.com/search?q=${encodeURIComponent(keyword)}&facet=model&user_id=200971-112325-516393-99787&client_id=UjhhbCuNo1OQfTwkzajxQNLlJcSlUlVz&limit=30`; + try { + const response = await fetch(searchUrl); + const json = await JSON.parse(response); + + const results = json.collection.map(item => ({ + title: item.title, + image: item.artwork_url || PLACEHOLDER_IMAGE, + href: item.permalink_url + })); + //console.log(results); + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + console.error("Error fetching search results:", error); + return JSON.stringify([]); + } +} + +async function extractDetails(url) { + const details = []; + details.push({ + description: 'N/A', + alias: 'N/A', + airdate: 'N/A' + }); + + //#IAMLAZY + + console.log(JSON.stringify(details)); + return JSON.stringify(details); +} + +async function extractEpisodes(url) { + const response = await fetch(url); + const html = await response; + const tracks = []; + + const trackRegex = /<article itemprop="track"[^>]*>[\s\S]*?<h2 itemprop="name"><a itemprop="url" href="([^"]+)">/g; + + let match; + let number = 1; + + while ((match = trackRegex.exec(html)) !== null) { + tracks.push({ + number: number++, + href: 'https://soundcloud.com' + match[1].trim() + }); + } + + if (tracks.length > 0) { + return JSON.stringify(tracks); + } else { + const canonicalMatch = html.match(/\["link",\{"rel":"canonical","href":"([^"]+)"\}\]/); + if (canonicalMatch) { + return JSON.stringify([{ number: 1, href: canonicalMatch[1].trim() }]); + } + } + + return JSON.stringify([]); +} + + +async function extractStreamUrl(url) { + const clientId = "UjhhbCuNo1OQfTwkzajxQNLlJcSlUlVz"; + try { + const response = await fetch(url); + const html = await response; + + const urlMatch = html.match(/"url":"(https:\/\/api[^\.]*\.soundcloud\.com\/media\/soundcloud:tracks:[^"]+)"/); + const authMatch = html.match(/"track_authorization":"([^"]+)"/); + + if (urlMatch && authMatch) { + const streamUrl = `${urlMatch[1]}?client_id=${clientId}&track_authorization=${authMatch[1]}`; + + const responseTwo = await fetch(streamUrl); + const json = await JSON.parse(responseTwo); + + return json.url; + } else { + console.log("No stream URL found"); + + return null; + } + } catch (error) { + console.error("Error:", error); + return null; + } + } diff --git a/soundcloud/soundcloud.json b/soundcloud/soundcloud.json new file mode 100644 index 0000000..c0a6718 --- /dev/null +++ b/soundcloud/soundcloud.json @@ -0,0 +1,16 @@ +{ + "sourceName": "Soundcloud", + "iconUrl": "https://cdn-icons-png.flaticon.com/512/145/145809.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Music lmfao", + "streamType": "HLS", + "quality": "Wallah fire quality", + "baseUrl": "https://soundcloud.com/", + "searchBaseUrl": "https://bshar1865-hianime.vercel.app/api/v2/hianime/search?q=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/soundcloud/soundcloud.js", + "asyncJS": true +} diff --git a/streamingunity/streamingunity.js b/streamingunity/streamingunity.js new file mode 100644 index 0000000..f9d6e67 --- /dev/null +++ b/streamingunity/streamingunity.js @@ -0,0 +1,231 @@ +async function searchResults(keyword) { + const response = await soraFetch( + `https://streamingunity.co/it/archive?search=${keyword}` + ); + const html = await response.text(); + + const regex = /<div[^>]*id="app"[^>]*data-page="([^"]*)"/; + const match = regex.exec(html); + + if (!match || !match[1]) { + return JSON.stringify([]); + } + + const dataPage = match[1].replaceAll(`"`, `"`); + const pageData = JSON.parse(dataPage); + const titles = pageData.props?.titles || []; + + const results = + titles + .map((item) => { + const posterImage = item.images?.find((img) => img.type === "poster"); + return { + title: + item.name?.replaceAll("amp;", "").replaceAll("'", "'") || "", + image: posterImage?.filename + ? `https://cdn.streamingunity.co/images/${posterImage.filename}` + : "", + href: `https://streamingunity.co/it/titles/${item.id}-${item.slug}`, + }; + }) + .filter((item) => item.image) || []; + + return JSON.stringify(results); +} + +async function extractDetails(url) { + const response = await soraFetch(`${url}/season-1`); + const html = await response.text(); + + const regex = /<div[^>]*id="app"[^>]*data-page="([^"]*)"/; + const match = regex.exec(html); + + if (!match || !match[1]) { + return JSON.stringify([]); + } + + const dataPage = match[1].replaceAll(`"`, `"`); + const pageData = JSON.parse(dataPage); + const titleData = pageData.props?.title; + + if (!titleData) { + return JSON.stringify([]); + } + + return JSON.stringify([ + { + description: + titleData.plot?.replaceAll("amp;", "").replaceAll("'", "'") || + "N/A", + aliases: + titleData.original_name + ?.replaceAll("amp;", "") + .replaceAll("'", "'") || "N/A", + airdate: titleData.release_date || "N/A", + }, + ]); +} + +async function extractEpisodes(url) { + try { + const episodes = []; + const baseUrl = url.replace(/\/season-\d+$/, ""); + + const response = await soraFetch(`${baseUrl}/season-1`); + const html = await response.text(); + const regex = /<div[^>]*id="app"[^>]*data-page="([^"]*)"/; + const match = regex.exec(html); + + if (!match?.[1]) return JSON.stringify([]); + + const pageData = JSON.parse(match[1].replaceAll(`"`, `"`)); + const titleData = pageData.props?.title; + if (!titleData) return JSON.stringify([]); + + const titleId = titleData.id; + const totalSeasons = titleData.seasons_count || 1; + + let hasEpisodes = false; + + for (let season = 1; season <= totalSeasons; season++) { + try { + const seasonResponse = await soraFetch(`${baseUrl}/season-${season}`); + const seasonHtml = await seasonResponse.text(); + const seasonMatch = regex.exec(seasonHtml); + + if (seasonMatch?.[1]) { + const seasonData = JSON.parse( + seasonMatch[1].replaceAll(`"`, `"`) + ); + const seasonEpisodes = seasonData.props?.loadedSeason?.episodes || []; + + if (seasonEpisodes.length > 0) { + hasEpisodes = true; + seasonEpisodes.forEach((episode) => { + episodes.push({ + href: `https://streamingunity.co/it/iframe/${titleId}?episode_id=${episode.id}`, + number: episode.number || episodes.length + 1, + }); + }); + } + } + } catch (error) { + console.log(`Error fetching season ${season}:`, error); + } + } + + if (!hasEpisodes) { + episodes.push({ + href: `https://streamingunity.co/it/iframe/${titleId}`, + number: 1, + }); + } + + return JSON.stringify(episodes); + } catch (error) { + console.log("Error extracting episodes:", error); + return JSON.stringify([]); + } +} + +async function extractStreamUrl(url) { + try { + let modifiedUrl = url; + if (!url.includes("/it/iframe") && !url.includes("/en/iframe")) { + modifiedUrl = url.replace("/iframe", "/it/iframe"); + } + const response1 = await soraFetch(modifiedUrl); + const html1 = await response1.text(); + + const iframeMatch = html1.match(/<iframe[^>]*src="([^"]*)"/); + if (!iframeMatch) { + console.log("No iframe found in the HTML."); + return null; + } + + const embedUrl = iframeMatch[1].replace(/amp;/g, ""); + console.log("Embed URL:", embedUrl); + + const response2 = await soraFetch(embedUrl); + const html2 = await response2.text(); + + let finalUrl = null; + + if (html2.includes("window.masterPlaylist")) { + const urlMatch = html2.match(/url:\s*['"]([^'"]+)['"]/); + const tokenMatch = html2.match(/['"]?token['"]?\s*:\s*['"]([^'"]+)['"]/); + const expiresMatch = html2.match( + /['"]?expires['"]?\s*:\s*['"]([^'"]+)['"]/ + ); + + if (urlMatch && tokenMatch && expiresMatch) { + const baseUrl = urlMatch[1]; + const token = tokenMatch[1]; + const expires = expiresMatch[1]; + + if (baseUrl.includes("?b=1")) { + finalUrl = `${baseUrl}&token=${token}&expires=${expires}&h=1`; + } else { + finalUrl = `${baseUrl}?token=${token}&expires=${expires}&h=1`; + } + } + } + + if (!finalUrl) { + const m3u8Match = html2.match(/(https?:\/\/[^'"\s]+\.m3u8[^'"\s]*)/); + if (m3u8Match) { + finalUrl = m3u8Match[1]; + } + } + + if (!finalUrl) { + const scriptMatches = html2.match(/<script[^>]*>(.*?)<\/script>/gs); + if (scriptMatches) { + for (const script of scriptMatches) { + const streamMatch = script.match( + /['"]?(https?:\/\/[^'"\s]+(?:\.m3u8|playlist)[^'"\s]*)/ + ); + if (streamMatch) { + finalUrl = streamMatch[1]; + break; + } + } + } + } + + if (!finalUrl) { + const videoMatch = html2.match( + /(?:src|source|url)['"]?\s*[:=]\s*['"]?(https?:\/\/[^'"\s]+(?:\.mp4|\.m3u8|\.mpd)[^'"\s]*)/ + ); + if (videoMatch) { + finalUrl = videoMatch[2] || videoMatch[1]; + } + } + + if (finalUrl) { + console.log("Final URL found:", finalUrl); + return finalUrl; + } else { + console.log( + "No stream URL found. HTML content:", + html2.substring(0, 1000) + ); + return null; + } + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} \ No newline at end of file diff --git a/streamingunity/streamingunity.json b/streamingunity/streamingunity.json new file mode 100644 index 0000000..f5f3e0e --- /dev/null +++ b/streamingunity/streamingunity.json @@ -0,0 +1,17 @@ +{ + "sourceName": "StreamingUnity", + "iconUrl": "https://virginiapertutte.it/templates/sub-ita/images/logo.png", + "author": { + "name": "sobet", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRQPQ1qIiALbM3xDWGsuJzu6ItaQGwb9ICRRw&s" + }, + "version": "9000000.0.0", + "language": "Italian", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://streamingunity.bio/it", + "searchBaseUrl": "https://streamingunity.bio/it/archive?title=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/streamingunity/streamingunity.js", + "asyncJS": true, + "type": "shows/movies" +} diff --git a/test/.gitkeep b/test/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/toonitalia/toonitalia.js b/toonitalia/toonitalia.js new file mode 100644 index 0000000..e9c00af --- /dev/null +++ b/toonitalia/toonitalia.js @@ -0,0 +1,206 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://toonitalia.xyz/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<article[\s\S]*?<h2 class="entry-title heading-size-1"><a href="([^"]+)">([\s\S]*?)<\/a><\/h2>[\s\S]*?(?:<img[^>]+src="([^"]+)")?/gi; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[2].trim(), + image: match[3] ? match[3].trim() : "", + href: match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<h3><span[^>]*>Trama:<\/span><\/h3>\s*<p>([\s\S]*?)<\/p>/i; + const match = regex.exec(html); + const description = match ? match[1].replace(/<[^>]+>/g, "").trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const episodeRegex = /(\d+)\s*(?:–|–)[^<]*<a href="(https:\/\/voe\.sx\/[^"]+)"/g; + let match; + while ((match = episodeRegex.exec(html)) !== null) { + const voeUrl = match[2].trim().replace('https://voe.sx/', 'https://jilliandescribecompany.com/e/'); + results.push({ + href: voeUrl, + number: parseInt(match[1], 10) + }); + } + + if (results.length === 0) { + const movieMatch = html.match(/<a href="(https:\/\/voe\.sx\/[^"]+)"/); + if (movieMatch) { + const voeUrl = movieMatch[1].trim().replace('https://voe.sx/', 'https://jilliandescribecompany.com/e/'); + results.push({ + href: voeUrl, + number: 1 + }); + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + + const response = await fetchv2(url); + const html = await response.text(); + let streamData = null; + + streamData = voeExtractor(html); + console.log("Voe Stream Data: " + streamData); + return streamData; +} + +/* SCHEME START */ + +/** + * @name voeExtractor + * @author Cufiy + */ + +function voeExtractor(html, url = null) { + // Extract the first <script type="application/json">...</script> + const jsonScriptMatch = html.match( + /<script[^>]+type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/i + ); + if (!jsonScriptMatch) { + console.log("No application/json script tag found"); + return null; + } + + + const obfuscatedJson = jsonScriptMatch[1].trim(); + + let data; + try { + data = JSON.parse(obfuscatedJson); + } catch (e) { + throw new Error("Invalid JSON input."); + } + if (!Array.isArray(data) || typeof data[0] !== "string") { + throw new Error("Input doesn't match expected format."); + } + let obfuscatedString = data[0]; + + // Step 1: ROT13 + let step1 = voeRot13(obfuscatedString); + + // Step 2: Remove patterns + let step2 = voeRemovePatterns(step1); + + // Step 3: Base64 decode + let step3 = voeBase64Decode(step2); + + // Step 4: Subtract 3 from each char code + let step4 = voeShiftChars(step3, 3); + + // Step 5: Reverse string + let step5 = step4.split("").reverse().join(""); + + // Step 6: Base64 decode again + let step6 = voeBase64Decode(step5); + + // Step 7: Parse as JSON + let result; + try { + result = JSON.parse(step6); + } catch (e) { + throw new Error("Final JSON parse error: " + e.message); + } + // console.log("Decoded JSON:", result); + + // check if direct_access_url is set, not null and starts with http + if (result && typeof result === "object") { + const streamUrl = + result.direct_access_url || + result.source + .map((source) => source.direct_access_url) + .find((url) => url && url.startsWith("http")); + if (streamUrl) { + console.log("Voe Stream URL: " + streamUrl); + return streamUrl; + } else { + console.log("No stream URL found in the decoded JSON"); + } + } + return result; +} + +function voeRot13(str) { + return str.replace(/[a-zA-Z]/g, function (c) { + return String.fromCharCode( + (c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? + c : + c - 26 + ); + }); +} + +function voeRemovePatterns(str) { + const patterns = ["@$", "^^", "~@", "%?", "*~", "!!", "#&"]; + let result = str; + for (const pat of patterns) { + result = result.split(pat).join(""); + } + return result; +} + +function voeBase64Decode(str) { + // atob is available in browsers and Node >= 16 + if (typeof atob === "function") { + return atob(str); + } + // Node.js fallback + return Buffer.from(str, "base64").toString("utf-8"); +} + +function voeShiftChars(str, shift) { + return str + .split("") + .map((c) => String.fromCharCode(c.charCodeAt(0) - shift)) + .join(""); +} +/* SCHEME END */ \ No newline at end of file diff --git a/toonitalia/toonitalia.json b/toonitalia/toonitalia.json new file mode 100644 index 0000000..759a649 --- /dev/null +++ b/toonitalia/toonitalia.json @@ -0,0 +1,20 @@ +{ + "sourceName": "ToonItalia", + "iconUrl": "https://toonitalia.xyz/wp-content/uploads/2023/08/cropped-Majintoon-192x192.jpg", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Italian", + "streamType": "HLS", + "encrypted":true, + "quality": "1080p", + "baseUrl": "https://toonitalia.xyz/", + "searchBaseUrl": "https://toonitalia.xyz/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/toonitalia/toonitalia.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} \ No newline at end of file diff --git a/toontales/toontales.js b/toontales/toontales.js new file mode 100644 index 0000000..85999de --- /dev/null +++ b/toontales/toontales.js @@ -0,0 +1,79 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2(`https://www.toontales.net/?s=${keyword}&search=Search`); + const html = await response.text(); + + const matches = html.matchAll(/<a href="([^"]+)">\s*<img src="([^"]+)"[^>]*alt="([^"]*)"[^>]*>/g); + + for (const match of matches) { + const href = match[1].trim(); + const image = match[2].trim(); + const title = match[3].trim(); + + const imageUrl = image.includes('noimage.jpg') ? null : image; + + results.push({ + href: href, + image: imageUrl, + title: title || 'No Title' + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error: " + err.message, + image: "Error", + href: "Error" + }]); + } +} +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descriptionMatch = html.match(/<meta name="description" content="([^"]*)"[^>]*\/>/); + const description = descriptionMatch ? descriptionMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + return JSON.stringify([{ + number: 1, + href: url + }]); +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + let urlMatch = html.match(/file:\s*"([^"]+\.mp4)"/); + if (!urlMatch) { + urlMatch = html.match(/"contentUrl"\s*:\s*"([^"\\]*(?:\\.[^"\\]*)*\.mp4)"/); + } + + const extractedUrl = urlMatch ? urlMatch[1] : null; + + return (extractedUrl && extractedUrl.endsWith('.mp4')) + ? extractedUrl + : "i wanna kms"; + } catch (err) { + return "https://files.catbox.moe/avolvc.mp4"; + } +} \ No newline at end of file diff --git a/toontales/toontales.json b/toontales/toontales.json new file mode 100644 index 0000000..6e082e6 --- /dev/null +++ b/toontales/toontales.json @@ -0,0 +1,20 @@ +{ + "sourceName": "ToonTales", + "iconUrl": "https://www.toontales.net/wp-content/uploads/cropped-favicon-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "English", + "streamType": "mp4", + "encrypted":true, + "quality": "1080p", + "baseUrl": "https://www.toontales.net/", + "searchBaseUrl": "https://www.toontales.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/toontales/toontales.js", + "type": "shows", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} \ No newline at end of file diff --git a/topstreamfilm/topstreamfilm.js b/topstreamfilm/topstreamfilm.js new file mode 100644 index 0000000..e057ca8 --- /dev/null +++ b/topstreamfilm/topstreamfilm.js @@ -0,0 +1,274 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2(`https://www.topstreamfilm.live/?story=${encodeURIComponent(keyword)}&do=search&subaction=search`); + const html = await response.text(); + + const regex = /<li class="TPostMv">[\s\S]*?<a href="([^"]+)">[\s\S]*?<figure[^>]*>[\s\S]*?<img[^>]*data-src="([^"]+)"[^>]*>[\s\S]*?<h3 class="Title">([^<]+)<\/h3>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + const href = match[1].trim(); + const image = "https://www.topstreamfilm.live" + match[2].trim(); + let title = (match[3].trim()).trim(); + + title = title + .replace(/–/g, "–") + .replace(/’/g, "'") + .replace(/&/g, "&") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(" – Der Film", ""); + + results.push({ + title, + image, + href + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="Description">([\s\S]*?)<\/div>/i; + const match = regex.exec(html); + + let description = "N/A"; + if (match) { + description = match[1] + .replace(/<[^>]+>/g, " ") + .replace(/&/g, "&") + .replace(/–/g, "–") + .replace(/’/g, "’") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/\s+/g, " ") + .trim(); + } + + return JSON.stringify([{ + description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /id="serie-(\d+)_(\d+)"[\s\S]*?data-m="supervideo"[^>]+data-link="([^"]+)"/g; + let match; + while ((match = regex.exec(html)) !== null) { + const season = parseInt(match[1], 10); + const episode = parseInt(match[2], 10); + const href = match[3].trim(); + results.push({ + season, + number: episode, + href + }); + } + + if (results.length === 0) { + const scriptRegex = /<script src="(https:\/\/meinecloud\.click\/ddl\/[^"]+)" type="[^"]*text\/javascript"><\/script>/g; + const scriptMatch = scriptRegex.exec(html); + + if (scriptMatch) { + const scriptUrl = scriptMatch[1].trim(); + + try { + const scriptResponse = await fetchv2(scriptUrl); + const scriptContent = await scriptResponse.text(); + + const supervideRegex = /\\'(https:\/\/supervideo\.tv\/[^']+)\\'/; + const supervideMatch = scriptContent.match(supervideRegex); + + if (supervideMatch) { + const supervideUrl = supervideMatch[1].trim(); + results.push({ + season: 1, + number: 1, + href: supervideUrl + }); + } + } catch (scriptErr) { + console.log("Error fetching script: " + scriptErr); + } + } + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + season: "Error", + number: "Error", + href: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const obfuscatedScript = html.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + const unpackedScript = unpack(obfuscatedScript[1]); + + const regex = /file:\s*"([^"]+\.m3u8)"/; + const match = regex.exec(unpackedScript); + if (match) { + const fileUrl = match[1]; + console.log("File URL:" + fileUrl); + + return fileUrl; + } + + return "deiofjdew"; + } catch (err) { + console.log("Error extracting stream URL: " + err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} diff --git a/topstreamfilm/topstreamfilm.json b/topstreamfilm/topstreamfilm.json new file mode 100644 index 0000000..b890965 --- /dev/null +++ b/topstreamfilm/topstreamfilm.json @@ -0,0 +1,20 @@ +{ + "sourceName": "TopStreamFilm", + "iconUrl": "https://www.topstreamfilm.live/templates/topstreamfilm/images/cropped-topstreamIcon-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "German", + "streamType": "HLS", + "encrypted":true, + "quality": "1080p", + "baseUrl": "https://www.topstreamfilm.live/", + "searchBaseUrl": "https://www.topstreamfilm.live/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/topstreamfilm/topstreamfilm.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} \ No newline at end of file diff --git a/turkish123/turkish123.js b/turkish123/turkish123.js new file mode 100644 index 0000000..bed95f4 --- /dev/null +++ b/turkish123/turkish123.js @@ -0,0 +1,109 @@ +async function searchResults(keyword) { + const searchUrl = `https://hds.turkish123.com/?s=${encodeURIComponent(keyword)}`; + try { + const response = await fetch(searchUrl); + const html = await response; + const results = []; + + const itemRegex = /<div[^>]*class="ml-item"[^>]*>[\s\S]*?<\/div>/g; + const items = html.match(itemRegex) || []; + + items.forEach((itemHtml) => { + const titleMatch = itemHtml.match(/<span class="mli-info"><h2>([^<]+)<\/h2><\/span>/); + const imgMatch = itemHtml.match(/<img[^>]*src="([^"]+)"[^>]*class="mli-thumb"/); + const hrefMatch = itemHtml.match(/<a href="([^"]+)"[^>]*class="ml-mask/); + + if (!titleMatch || !imgMatch || !hrefMatch) return; + + const title = titleMatch[1].trim(); + const imageUrl = imgMatch[1].trim(); + const href = hrefMatch[1].trim(); + + results.push({ + title, + image: imageUrl, + href + }); + }); + //console.log(results); + console.log(JSON.stringify(results)); + return JSON.stringify(results); + } catch (error) { + throw error; + } +} + +async function extractDetails(url) { + const details = []; + + try { + const response = await fetch(url); + const html = await response; + + const descriptionMatch = html.match(/<p class="f-desc">([\s\S]*?)<\/p>/); + let description = descriptionMatch ? descriptionMatch[1].trim() : 'Weirdly the website doesn\'t provide any description, either that or I\'m blind.'; + + description = description.replace(/–/g, '–').replace(/’/g, '’'); + + const yearMatch = html.match(/<i class="fa fa-calendar" aria-hidden="true"><\/i><strong>Year:<\/strong>[\s\S]*?<a href="[^"]*" rel="tag">(\d{4})<\/a>/); + const airdate = yearMatch ? yearMatch[1] : 'N/A'; + + details.push({ + description, + alias: 'N/A', + airdate + }); + //console.log(details); + console.log(JSON.stringify(details)); + return JSON.stringify(details); + } catch (error) { + console.error('Error extracting details:', error); + return JSON.stringify([]); + } +} + +async function extractEpisodes(url) { + const response = await fetch(url); + const html = await response; + const episodes = []; + + const episodeMatches = html.match(/<a class="episodi" href="([^"]+)">[^<]*Episode (\d+)[^<]*(?:<span[^>]*>[^<]*<\/span>)?[^<]*<\/a>/g); + + if (episodeMatches) { + episodeMatches.forEach((match) => { + const hrefMatch = match.match(/href="([^"]+)"/); + const episodeNumberMatch = match.match(/Episode (\d+)/); + + if (hrefMatch && episodeNumberMatch) { + episodes.push({ + href: hrefMatch[1].trim(), + number: parseInt(episodeNumberMatch[1], 10) + }); + } + }); + } + //console.log(episodes); + console.log(JSON.stringify(episodes)); + return JSON.stringify(episodes); +} + +async function extractStreamUrl(url) { + const response = await fetch(url); + const data = await response; + const iframeMatch = data.match(/var copyTexti= \['<iframe[^>]*src="(https:\/\/tukipasti\.com\/[^"]+)"[^>]*><\/iframe>'\]/); + + if (iframeMatch) { + const iframeUrl = iframeMatch[1]; + const responseTwo = await fetch(iframeUrl); + const dataTwo = await responseTwo; + const m3u8Match = dataTwo.match(/var urlPlay = '([^']+)'/); + + if (m3u8Match) { + const m3u8Url = m3u8Match[1]; + console.log(m3u8Url); + return m3u8Url; + } + return null; + } + return null; +} diff --git a/turkish123/turkish123.json b/turkish123/turkish123.json new file mode 100644 index 0000000..527612a --- /dev/null +++ b/turkish123/turkish123.json @@ -0,0 +1,17 @@ +{ + "sourceName": "Turkish123", + "iconUrl": "https://hds.turkish123.com/wp-content/uploads/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.5", + "language": "Turkish", + "streamType": "HLS", + "quality": "8K UHD", + "baseUrl": "https://hds.turkish123.com/", + "searchBaseUrl": "https://hds.turkish123.com/?s=%s", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/turkish123/turkish123.js", + "asyncJS": true, + "type": "movies/shows" +} diff --git a/vegamovies/vegamovies.js b/vegamovies/vegamovies.js new file mode 100644 index 0000000..6be6f85 --- /dev/null +++ b/vegamovies/vegamovies.js @@ -0,0 +1,142 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2(`https://vegamovies10.com/search.php?query=${keyword}`); + const html = await response.text(); + + const regex = /<a[^>]+href="([^"]+)"[^>]+title="([^"]+)"[^>]*class="blog-img[^"]*"[^>]*>\s*<img[^>]+src="([^"]+)"[^>]*>/g; + + let match; + while ((match = regex.exec(html)) !== null) { + const title = match[2].trim(); + + if (/episodes?/i.test(title)) continue; + + results.push({ + title, + image: match[3].trim().startsWith("http") ? match[3].trim() : "https://vegamovies10.com" + match[3].trim(), + href: match[1].trim().startsWith("http") ? match[1].trim() : "https://vegamovies10.com" + match[1].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + console.error("Search error:" + err); + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<h3[^>]*>[\s\S]*?Movie-SYNOPSIS\/PLOT:[\s\S]*?<\/h3>\s*<p>([\s\S]*?)<\/p>/i); + + const rawDescription = match ? match[1] : ""; + const cleaned = rawDescription + .replace(/<br\s*\/?>/gi, "\n") + .replace(/<[^>]+>/g, "") + .trim(); + + return JSON.stringify([{ + description: cleaned || "N/A", + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + let match = html.match(/<h5[^>]*>([\s\S]*?1080p[\s\S]*?)<\/h5>[\s\S]*?<a\s+href="([^"]+)"/i); + + if (!match) { + match = html.match(/<h5[^>]*>([\s\S]*?720p[\s\S]*?)<\/h5>[\s\S]*?<a\s+href="([^"]+)"/i); + } + + if (!match) { + match = html.match(/<h5[^>]*>([\s\S]*?480p[\s\S]*?)<\/h5>[\s\S]*?<a\s+href="([^"]+)"/i); + } + + let downloadLink = null; + if (match) { + downloadLink = match[2].trim(); + const qualityText = match[1].replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim(); + console.log('Selected quality: ' + qualityText); + } + + if (downloadLink) { + return JSON.stringify([{ + href: downloadLink, + number: 1 + }]); + } else { + return JSON.stringify([{ + href: "No download link found", + number: 1 + }]); + } + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const headers = { + "Referer": "https://vegamovies10.com/" + }; + const response = await fetchv2(url, headers); + const html = await response.text(); + + const match = html.match(/<a[^>]+href="([^"]+)"[^>]*>[\s\S]*?V-Cloud[\s\S]*?<\/a>/i); + if (!match) { + console.log("No V-Cloud link found"); + return "Error"; + } + + const relativeUrl = match[1].trim(); + const finalUrl = relativeUrl.startsWith("http") + ? relativeUrl + : "https://www.9xlinks.xyz" + relativeUrl; + + const followResponse = await fetchv2(finalUrl); + const followText = await followResponse.text(); + + const downloadMatch = followText.match(/<div class="mt-6 flex justify-center space-x-3">[\s\S]*?<a href="([^"]+)"/i); + + if (downloadMatch) { + const downloadUrl = downloadMatch[1].trim(); + console.log("Direct Download URL: " + downloadUrl); + return downloadUrl; + } else { + console.log("No direct download link found"); + return "Error"; + } + + } catch (err) { + console.log("Error in extractStreamUrl: " + err); + return "Error"; + } +} + + + + diff --git a/vegamovies/vegamovies.json b/vegamovies/vegamovies.json new file mode 100644 index 0000000..89114dc --- /dev/null +++ b/vegamovies/vegamovies.json @@ -0,0 +1,19 @@ +{ + "sourceName": "VegaMovies", + "iconUrl": "https://www.arcgis.com/sharing/rest/content/items/e6b7ab2c49de42e0b4aa9ea75198737c/info/thumbnail/ago_downloaded.jpg?w=800", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.2", + "language": "Hindi (DUB/SUB)", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://vegamovies10.com/", + "searchBaseUrl": "https://vegamovies10.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/vegamovies/vegamovies.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/veranimes/veranimes.js b/veranimes/veranimes.js new file mode 100644 index 0000000..8dd4355 --- /dev/null +++ b/veranimes/veranimes.js @@ -0,0 +1,334 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://wwv.veranimes.net/animes?buscar=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<article class="li">.*?<a href="([^"]+)" title="([^"]+)">.*?<img [^>]*src="(https:\/\/[^"]*\.(?:webp|jpg|png|jpeg))"[^>]*alt="[^"]*">/gs; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + href: match[1].trim().replace("./", "https://wwv.veranimes.net/"), + title: match[2].trim(), + image: match[3].trim() + }); + } + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const match = html.match(/<div class="tx">.*?<p>(.*?)<\/p>/s); + const description = match ? match[1].replace(/<[^>]+>/g, '').trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + const baseUrl = "https://wwv.veranimes.net/"; + + try { + const response = await fetchv2(url); + const html = await response.text(); + + const epsMatch = html.match(/var eps = \[(.*?)\];/); + if (!epsMatch) { + throw new Error("Episodes array not found"); + } + + const episodeNumbers = epsMatch[1].split(',').map(ep => + parseInt(ep.replace(/"/g, ''), 10) + ); + + const slugMatch = html.match(/data-sl="([^"]+)"/); + if (!slugMatch) { + throw new Error("Series slug not found"); + } + const seriesSlug = slugMatch[1]; + + episodeNumbers.reverse().forEach(episodeNum => { + results.push({ + href: `${baseUrl}ver/${seriesSlug}-${episodeNum}`, + number: episodeNum + }); + }); + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: "Error" + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const dataDwnMatch = html.match(/data-dwn="([^"]+)"/); + + if (!dataDwnMatch) { + console.log("No data-dwn attribute found"); + return null; + } + + let dataDwnContent = dataDwnMatch[1]; + dataDwnContent = dataDwnContent.replace(/"/g, '"').replace(/&/g, '&'); + + console.log("Raw data-dwn content:", dataDwnContent); + + let downloadData; + try { + downloadData = JSON.parse(dataDwnContent); + } catch (parseError) { + console.log("Failed to parse data-dwn JSON:", parseError); + return null; + } + + console.log("Parsed download data:", downloadData); + + let filemoonUrl = null; + for (const item of downloadData) { + if (Array.isArray(item) && item[0] === "filemoon" && item[2]) { + filemoonUrl = item[2]; + break; + } + } + + if (!filemoonUrl) { + console.log("No filemoon URL found in data-dwn"); + return null; + } + + filemoonUrl = filemoonUrl.replace("/d/", "/e/"); + + console.log("Extracted filemoon URL:", filemoonUrl); + + const filemoonResponse = await fetchv2(filemoonUrl); + const filemoonHtml = await filemoonResponse.text(); + + let streamUrl = null; + try { + streamUrl = await filemoonExtractor(filemoonHtml, filemoonUrl); + } catch (error) { + console.log("filemoon HD extraction error:", error); + } + + console.log("filemoon Stream URL:", streamUrl); + + if (streamUrl && streamUrl !== false && streamUrl !== null) { + return streamUrl; + } + + console.log("No stream URL found"); + return null; + } catch (error) { + console.log("Fetch error:", error); + return null; + } +} + +/* SCHEME START */ +/* {REQUIRED PLUGINS: unbaser} */ + +/** + * @name filemoonExtractor + * @author Cufiy - Inspired by Churly + */ + +async function filemoonExtractor(html, url = null) { + // check if contains iframe, if does, extract the src and get the url + const regex = /<iframe[^>]+src="([^"]+)"[^>]*><\/iframe>/; + const match = html.match(regex); + if (match) { + console.log("Iframe URL: " + match[1]); + const iframeUrl = match[1]; + const iframeResponse = await soraFetch(iframeUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Referer": url, + } + }); + console.log("Iframe Response: " + iframeResponse.status); + html = await iframeResponse.text(); + } + // console.log("HTML: " + html); + // get /<script[^>]*>([\s\S]*?)<\/script>/gi + const scriptRegex = /<script[^>]*>([\s\S]*?)<\/script>/gi; + const scripts = []; + let scriptMatch; + while ((scriptMatch = scriptRegex.exec(html)) !== null) { + scripts.push(scriptMatch[1]); + } + // get the script with eval and m3u8 + const evalRegex = /eval\((.*?)\)/; + const m3u8Regex = /m3u8/; + // console.log("Scripts: " + scripts); + const evalScript = scripts.find(script => evalRegex.test(script) && m3u8Regex.test(script)); + if (!evalScript) { + console.log("No eval script found"); + return null; + } + const unpackedScript = unpack(evalScript); + // get the m3u8 url + const m3u8Regex2 = /https?:\/\/[^\s]+master\.m3u8[^\s]*?(\?[^"]*)?/; + const m3u8Match = unpackedScript.match(m3u8Regex2); + if (m3u8Match) { + return m3u8Match[0]; + } else { + console.log("No M3U8 URL found"); + return null; + } +} + + +/* REMOVE_START */ + + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + + +/** + * Uses Sora's fetchv2 on ipad, fallbacks to regular fetch on Windows + * @author ShadeOfChaos + * + * @param {string} url The URL to make the request to. + * @param {object} [options] The options to use for the request. + * @param {object} [options.headers] The headers to send with the request. + * @param {string} [options.method='GET'] The method to use for the request. + * @param {string} [options.body=null] The body of the request. + * + * @returns {Promise<Response|null>} The response from the server, or null if the + * request failed. + */ +async function soraFetch(url, options = { headers: {}, method: 'GET', body: null }) { + try { + return await fetchv2(url, options.headers ?? {}, options.method ?? 'GET', options.body ?? null); + } catch(e) { + try { + return await fetch(url, options); + } catch(error) { + return null; + } + } +} +/* REMOVE_END */ + +/* SCHEME END */ \ No newline at end of file diff --git a/veranimes/veranimes.json b/veranimes/veranimes.json new file mode 100644 index 0000000..2e5f478 --- /dev/null +++ b/veranimes/veranimes.json @@ -0,0 +1,19 @@ +{ + "sourceName": "VerAnimes", + "iconUrl": "https://wwv.veranimes.net/cdn/img/favicon.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Spanish", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://wwv.veranimes.net/", + "searchBaseUrl": "https://wwv.veranimes.net/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/veranimes/veranimes.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/veziseriale/veziseriale.js b/veziseriale/veziseriale.js new file mode 100644 index 0000000..4cad9e2 --- /dev/null +++ b/veziseriale/veziseriale.js @@ -0,0 +1,293 @@ +function cleanTitle(title) { + return title + .replace(/’/g, "'") // right single quote + .replace(/‘/g, "'") // left single quote + .replace(/“/g, '"') // left double quote + .replace(/”/g, '"') // right double quote + .replace(/–/g, "-") // en dash + .replace(/—/g, "-") // em dash + .replace(/"/g, '"') // double quote + .replace(/'/g, "'") // apostrophe + .replace(/&/g, "&") // ampersand + .replace(/</g, "<") // less-than + .replace(/>/g, ">") // greater-than + .replace(/ /g, " ") // non-breaking space + .replace(/&#[0-9]+;/g, "") // other numeric entities + .replace(/&[a-z]+;/gi, "") // other named entities + .replace(/\s+/g, " ") // collapse multiple spaces + .trim(); // remove leading/trailing spaces +} + +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://www3.veziseriale.org/?s=" + keyword); + const html = await response.text(); + + const regex = /<article[^>]+class="item (?:tvshows|movies)"[^>]*>.*?<img src="([^"]+)"[^>]*alt="([^"]+)">.*?<a href="([^"]+)">/gs; + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: cleanTitle(match[2]), + image: match[1].trim(), + href: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const divMatch = html.match(/<div class="wp-content">([\s\S]*?)<\/div>/i); + var description = "Idk why it don't got a description twin"; + + if (divMatch) { + var rawText = divMatch[1].replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim(); + + description = rawText + .replace(/ /g, ' ') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&#(\d+);/g, function(match, num) { + return String.fromCharCode(parseInt(num, 10)); + }); + } + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + try { + if (url.includes("/filme/")) { + return JSON.stringify([{ href: url, number: 1 }]); + } + + const response = await fetchv2(url); + const html = await response.text(); + + const seasonRegex = /<div class=['"]se-c['"][^>]*>[\s\S]*?<div class=['"]se-a['"][^>]*>[\s\S]*?<ul class=['"]episodios['"][^>]*>([\s\S]*?)<\/ul>[\s\S]*?<\/div>[\s\S]*?<\/div>/gi; + let seasonMatch; + + while ((seasonMatch = seasonRegex.exec(html)) !== null) { + const episodesHtml = seasonMatch[1]; + + const episodeRegex = /<a\s+href=['"]([^'"]+)['"][^>]*>\s*<strong[^>]*>[^<]*?Episodul\s+(\d+)\s*<\/strong>\s*<\/a>/gi; + let episodeMatch; + + while ((episodeMatch = episodeRegex.exec(episodesHtml)) !== null) { + results.push({ + href: episodeMatch[1].trim(), + number: parseInt(episodeMatch[2], 10) + }); + } + } + + console.log(`[Debug] Found ${results.length} episodes`); + console.log(`[Debug]`, JSON.stringify(results, null, 2)); + return JSON.stringify(results.reverse()); + } catch (err) { + console.error('Error extracting episodes:', err); + return JSON.stringify([{ href: "Error", number: "Error" }]); + } +} + +async function extractStreamUrl(url) { + try { + const firstresponse = await fetchv2(url); + const firsthtml = await firstresponse.text(); + + const idMatch = firsthtml.match(/href=['"]https:\/\/www3\.veziseriale\.org\/\?p=(\d+)['"]/); + if (!idMatch) throw new Error('ID not found'); + const id = idMatch[1]; + + const response = await fetchv2( + `https://passthrough-worker.simplepostrequest.workers.dev/?url=https://manager.veziseriale.org/get_links.php&type=formdata&body=id%3D${id}` + ); + const html = await response.text(); + const data = JSON.parse(html); + + const filemoonLink = data.links.find(link => link.buttonName === "Filemoon")?.url; + if (!filemoonLink) throw new Error("Filemoon link not found"); + + const filemoonId = filemoonLink.match(/\/e\/([^\/]+)/)?.[1]; + if (!filemoonId) throw new Error("Filemoon ID not found"); + + const rewrittenStreamUrl = `https://l455o.com/bkg/${filemoonId}`; + + const subtitleFilename = data.subs2; + const subtitleUrl = `https://manager.veziseriale.org/subtitles/${subtitleFilename}`; + + const response2 = await fetchv2(rewrittenStreamUrl); + const streamHtml = await response2.text(); + + const obfuscatedScript = streamHtml.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + if (!obfuscatedScript) throw new Error("Obfuscated script not found"); + + const unpackedScript = unpack(obfuscatedScript[1]); + + const hlsMatch = unpackedScript.match(/file\s*:\s*"([^"]+\.m3u8[^"]*)"/); + if (!hlsMatch) throw new Error("HLS stream not found"); + const streamUrl = hlsMatch[1]; + + return JSON.stringify({ + stream: streamUrl, + subtitles: subtitleUrl + }); + + } catch (err) { + console.error('Error extracting stream URL: ' + err); + return { + stream: "https://files.catbox.moe/avolvc.mp4", + subtitles: "" + }; + } +} + + + +/*********************************************************** + * UNPACKER MODULE + * Credit to GitHub user "mnsrulz" for Unpacker Node library + * https://github.com/mnsrulz/unpacker + ***********************************************************/ +class Unbaser { + constructor(base) { + /* Functor for a given base. Will efficiently convert + strings to natural numbers. */ + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + // fill elements 37...61, if necessary + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + // If base can be handled by int() builtin, let it do it for us + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + // Build conversion dictionary cache + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + /* Decodes a value to an integer. */ + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + /* Detects whether `source` is P.A.C.K.E.R. coded. */ + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + /* Unpacks P.A.C.K.E.R. packed js code. */ + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + /* Look up symbols in the synthetic symtab. */ + const word = match; + let word2; + if (radix == 1) { + //throw Error("symtab unknown"); + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + /* Juice from a source file the four args needed by decoder. */ + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + //const args = re.search(juicer, source, re.DOTALL); + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + //don't know what it is + // a = list(a); + // a[1] = 62; + // a = tuple(a); + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + /* Strip string lookup table (list) and replace values in source. */ + /* Need to work on this. */ + return source; + } +} + + + diff --git a/veziseriale/veziseriale.json b/veziseriale/veziseriale.json new file mode 100644 index 0000000..0f1ffc3 --- /dev/null +++ b/veziseriale/veziseriale.json @@ -0,0 +1,19 @@ +{ + "sourceName": "Veziseriale", + "iconUrl": "https://www3.veziseriale.org/wp-content/uploads/2019/12/popcorn-152-295665.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Romanian", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://www3.veziseriale.org//", + "searchBaseUrl": "https://www3.veziseriale.org/?s=", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/veziseriale/veziseriale.js", + "type": "shows/movies", + "asyncJS": true, + "softsub": false, + "downloadSupport": true +} diff --git a/watchanimeworld/watchanimeworld.js b/watchanimeworld/watchanimeworld.js new file mode 100644 index 0000000..b004c03 --- /dev/null +++ b/watchanimeworld/watchanimeworld.js @@ -0,0 +1,152 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2("https://watchanimeworld.in/?s=" + encodeURIComponent(keyword)); + const html = await response.text(); + + const regex = /<h2 class="entry-title"[^>]*>(.*?)<\/h2>[\s\S]*?<img[^>]+src="([^"]+)"[^>]*>[\s\S]*?<a href="([^"]+)" class="lnk-blk">/g; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[1].trim(), + image: match[2].startsWith("//") ? "https:" + match[2].trim() : match[2].trim(), + href: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const regex = /<div class="description"[^>]*>\s*<p>(.*?)<\/p>/s; + const match = regex.exec(html); + + const description = match ? match[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const postMatch = html.match(/data-post="(\d+)"/); + const postId = postMatch ? postMatch[1] : null; + const seasonMatches = [...html.matchAll(/data-season="(\d+)"/g)]; + const seasons = seasonMatches.map(m => parseInt(m[1], 10)); + + if (!postId || seasons.length === 0) { + const metaMatch = html.match(/<meta property="og:url" content="([^"]+)"/); + const fallbackUrl = metaMatch ? metaMatch[1] : url; + + return JSON.stringify([{ + href: fallbackUrl, + number: 1, + season: 1 + }]); + } + + const seasonPromises = seasons.map(season => { + const body = `action=action_select_season&season=${season}&post=${postId}`; + const seasonUrl = `https://passthrough-worker.simplepostrequest.workers.dev/?url=${encodeURIComponent("https://watchanimeworld.in/wp-admin/admin-ajax.php")}&type=formdata&body=${encodeURIComponent(body)}`; + + return fetchv2(seasonUrl) + .then(res => res.text()) + .then(seasonHtml => { + const regex = /<span class="num-epi">.*?<\/span>[\s\S]*?<a href="([^"]+)" class="lnk-blk"><\/a>/g; + let match, episodeCount = 1, episodes = []; + + while ((match = regex.exec(seasonHtml)) !== null) { + episodes.push({ + href: match[1].trim(), + number: episodeCount++, + season: season + }); + } + + return episodes; + }) + .catch(err => { + console.log(`Error fetching season ${season}:`, err); + return []; + }); + }); + + const allSeasons = await Promise.all(seasonPromises); + const results = allSeasons.flat(); + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ href: "Error", number: "Error", season: "Error" }]); + } +} + +async function extractStreamUrl(url) { + try { + const html = await (await fetchv2(url)).text(); + const iframeMatch = html.match(/<iframe[^>]+src="https:\/\/play\.zephyrflick\.top\/video\/([a-z0-9]+)"/i); + if (!iframeMatch) + return "https://files.catbox.moe/avolvc.mp4"; + + const hash = iframeMatch[1]; + const postData = { + "ilovefeet": "WE LOVE FEET" + }; + const headers = { + "X-Requested-With": "XMLHttpRequest", + "Referer": "https://watchanimeworld.in/" + }; + const fetchUrl = `https://play.zephyrflick.top/player/index.php?data=${hash}&do=getVideo`; + const videoResponse = await fetchv2(fetchUrl, headers, "POST"); + const text = await videoResponse.text(); + console.log(text); + const match = text.match(/"videoSource":"(https:[^"]+)"/); + + if (!match || !match[1]) { + console.error("No videoSource found in response"); + return "https://files.catbox.moe/avolvc.mp4"; + } + + const decodedUrl = decodeURIComponent(match[1]); + const fixedUrl = decodedUrl.replace(/\\/g, '').replace(/%5C/g, '/'); + + return fixedUrl; + } catch (err) { + console.error("Error extracting stream URL: " + err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + + + + + + + + + diff --git a/watchanimeworld/watchanimeworld.json b/watchanimeworld/watchanimeworld.json new file mode 100644 index 0000000..334fe93 --- /dev/null +++ b/watchanimeworld/watchanimeworld.json @@ -0,0 +1,19 @@ +{ + "sourceName": "WatchAnimeWorld", + "iconUrl": "https://watchanimeworld.in/wp-content/uploads/cropped-AW_Smiley-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.1", + "language": "Hindi", + "streamType": "HLS", + "quality": "1080p", + "baseUrl": "https://watchanimeworld.in/", + "searchBaseUrl": "https://watchanimeworld.in/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/watchanimeworld/watchanimeworld.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +} diff --git a/wikipedia/wikipedia-logo.png b/wikipedia/wikipedia-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a40bbd3a962e9e111267d634cb0f3bc6152811 GIT binary patch literal 38692 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 literal 0 HcmV?d00001 diff --git a/wikipedia/wikipedia.js b/wikipedia/wikipedia.js new file mode 100644 index 0000000..7ac6d23 --- /dev/null +++ b/wikipedia/wikipedia.js @@ -0,0 +1,121 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// Main Functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +searchUrl = 'https://en.wikipedia.org/wiki/List_of_films_in_the_public_domain_in_the_United_States'; + +async function searchResults(keyword) { + try { + const response = await fetch(searchUrl); + const html = await response; + + // Regex to match the table rows + const tableRegex = /<table class="wikitable sortable">([\s\S]*?)<\/table>/; + const rowRegex = /<tr>([\s\S]*?)<\/tr>/g; + const cellRegex = /<td>([\s\S]*?)<\/td>/g; + + const tableMatch = html.match(tableRegex); + if (!tableMatch) { + throw new Error('Table not found'); + } + + const rows = tableMatch[1].match(rowRegex); + if (!rows) { + throw new Error('No rows found in the table'); + } + + const apiUrl = `https://en.wikipedia.org/api/rest_v1/page/summary/`; + console.log("Test"); + + const results = []; + for (const row of rows) { + const cells = [...row.matchAll(cellRegex)]; + if (cells.length > 0) { + // Extract the path after /wiki/ + const path = cells[0][1].match(/href="([^"]+)"/)[1].split('/wiki/')[1]; + const coverImage = apiUrl + path; + + try { + const title = cells[0][1].replace(/<[^>]+>/g, '').trim(); + if (title.toLowerCase().includes(keyword.toLowerCase())) { + const responseCover = await fetch(coverImage); + const dataCover = await JSON.parse(responseCover); + const imageUrl = dataCover.thumbnail.source; + results.push({ + title: title, + href: "https://en.wikipedia.org" + cells[0][1].match(/href="([^"]+)"/)[1], + image: imageUrl || "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg" + }); + } + } catch (error) { + console.log('Error fetching cover image:' + error); + } + } + } + + return JSON.stringify(results); + + } catch (error) { + console.log('Fetch error:' + error); + return JSON.stringify([{ title: 'Error', image: '', href: '' }]); + } +} + +async function extractDetails(url) { + try { + // Extract the path after /wiki/ + const path = url.split('/wiki/')[1]; + const apiUrl = `https://en.wikipedia.org/api/rest_v1/page/summary/${path}`; + const response = await fetch(apiUrl); + const data = await JSON.parse(response); + + + const transformedResults = [{ + description: data.extract || 'No description available', + aliases: '', + airdate: data.description || 'No airdate available' + }]; + + return JSON.stringify(transformedResults); + } catch (error) { + console.log('Details error:' + error); + return JSON.stringify([{ + description: 'Error loading description', + aliases: '', + airdate: 'Aired: Unknown' + }]); + } +} + +async function extractEpisodes(url) { + + try { + + const fetchUrl = `${url}`; + const response = await fetch(fetchUrl); + const htmlString = await response; + + // Updated regex to find video URLs including special characters + const regex = /(\/\/upload\.wikimedia\.org\/wikipedia\/commons\/[^\s"']+\.(mp4|webm|ogg))/gi; + + const matches = htmlString.match(regex); + + console.log(matches); // This will output an array of video URLs + + const finishedList = matches.map((url, index) => ({ + number: index + 1, + href: url + })); + + return JSON.stringify(finishedList); + + } catch (error) { + console.log('Fetch error:' + error); + return JSON.stringify([{ number: 'Error', href: '' }]); + + } + +} + +async function extractStreamUrl(url) { + return "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"; +} \ No newline at end of file diff --git a/wikipedia/wikipedia.json b/wikipedia/wikipedia.json new file mode 100644 index 0000000..db1a9c2 --- /dev/null +++ b/wikipedia/wikipedia.json @@ -0,0 +1,17 @@ +{ + "sourceName": "Public Domain in the US", + "iconUrl": "https://gitlab.com/50n50/sources/-/raw/main/wikipedia/wikipedia-logo.png", + "author": { + "name": "Sulfur", + "icon": "https://gitlab.com/50n50/sources/-/raw/main/asset.png" + }, + "version": "1.0.0", + "language": "English", + "streamType": "HLS", + "quality": "720p", + "baseUrl": "https://en.wikipedia.org/wiki/List_of_films_in_the_public_domain_in_the_United_States", + "searchBaseUrl": "https://en.wikipedia.org/wiki/List_of_films_in_the_public_domain_in_the_United_States", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/wikipedia/wikipedia.js", + "asyncJS": true, + "streamAsyncJS": false +} diff --git a/witanime/witanime.js b/witanime/witanime.js new file mode 100644 index 0000000..b0a4c4b --- /dev/null +++ b/witanime/witanime.js @@ -0,0 +1,322 @@ +async function searchResults(keyword) { + const results = []; + try { + const response = await fetchv2( + "https://witanime.red/?search_param=animes&s=" + encodeURIComponent(keyword) + ); + const html = await response.text(); + + const regex = /<div class="anime-card-container">[\s\S]*?<img[^>]+src="([^"]+)"[^>]*alt="([^"]*)"[\s\S]*?<h3><a[^>]*href="([^"]+)"[^>]*>([^<]+)<\/a><\/h3>/gi; + + let match; + while ((match = regex.exec(html)) !== null) { + results.push({ + title: match[4].trim(), + image: match[1].trim(), + href: match[3].trim() + }); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + title: "Error", + image: "Error", + href: "Error" + }]); + } +} + +async function extractDetails(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const descMatch = /<p class="anime-story">([\s\S]*?)<\/p>/i.exec(html); + const description = descMatch ? descMatch[1].trim() : "N/A"; + + return JSON.stringify([{ + description: description, + aliases: "N/A", + airdate: "N/A" + }]); + } catch (err) { + return JSON.stringify([{ + description: "Error", + aliases: "Error", + airdate: "Error" + }]); + } +} + +async function extractEpisodes(url) { + const results = []; + + function decryptEpisodeData(encodedData) { + const parts = encodedData.split('.'); + const encryptedData = atob(parts[0]); + const xorKey = atob(parts[1]); + + let decryptedString = ''; + + for (let i = 0; i < encryptedData.length; i++) { + const decryptedChar = String.fromCharCode( + encryptedData.charCodeAt(i) ^ xorKey.charCodeAt(i % xorKey.length) + ); + decryptedString += decryptedChar; + } + + return JSON.parse(decryptedString); + } + + try { + const response = await fetchv2(url); + const html = await response.text(); + + const dataRegex = /var\s+processedEpisodeData\s*=\s*'([^']+)'/; + const dataMatch = dataRegex.exec(html); + + const encodedData = dataMatch ? dataMatch[1] : null; + + if (encodedData) { + const decoded = decryptEpisodeData(encodedData); + + const addEpisode = (ep) => { + const num = parseInt(ep.number, 10); + results.push({ href: ep.url, number: isNaN(num) ? 0 : num }); + }; + + if (Array.isArray(decoded)) { + decoded.forEach(addEpisode); + } else { + addEpisode(decoded); + } + + return JSON.stringify(results); + } + + return JSON.stringify(results); + } catch (err) { + return JSON.stringify([{ + href: "Error", + number: 0 + }]); + } +} + +async function extractStreamUrl(url) { + try { + const response = await fetchv2(url); + const html = await response.text(); + + const servers = a(html); + console.log(JSON.stringify(servers)); + const priorities = [ + "streamwish - fhd", + "streamwish", + "mp4upload", + "playerwish - fhd", + "playerwish" + ]; + + let chosenServer = null; + for (const provider of priorities) { + chosenServer = servers.find(s => + s.name.toLowerCase().includes(provider) + ); + if (chosenServer) break; + } + + if (!chosenServer) { + throw new Error("No valid server found"); + } + + const streamUrl = chosenServer.url; + const name = chosenServer.name.toLowerCase(); + + if (name.includes("streamwish")) { + const newUrl = "https://hgplaycdn.com/e/" + streamUrl.replace(/^https?:\/\/[^/]+\/e\//, ''); + const response = await fetchv2(newUrl); + + const html = await response.text(); + + const result = await b(html); + return result; + } else if (name.includes("mp4upload")) { + const response = await fetchv2(streamUrl); + const html = await response.text(); + + const result = await c(html); + return result; + } else if (name.includes("playerwish")) { + const response = await fetchv2(streamUrl); + const html = await response.text(); + + const result = await b(html); + return result; + } else { + throw new Error("Unsupported provider: " + chosenServer.name); + } + } catch (err) { + console.error(err); + return "https://files.catbox.moe/avolvc.mp4"; + } +} + +function a(html) { + try { + const zGMatch = html.match(/var _zG="([^"]+)";/); + const zHMatch = html.match(/var _zH="([^"]+)";/); + if (!zGMatch || !zHMatch) throw new Error("Could not find _zG or _zH in HTML"); + + const resourceRegistry = JSON.parse(atob(zGMatch[1])); + const configRegistry = JSON.parse(atob(zHMatch[1])); + + const serverNames = {}; + const serverLinks = html.matchAll( + /<a[^>]+class="server-link"[^>]+data-server-id="(\d+)"[^>]*>\s*<span class="ser">([^<]+)<\/span>/g + ); + for (const match of serverLinks) { + serverNames[match[1]] = match[2].trim(); + } + + const servers = []; + for (let i = 0; i < 10; i++) { + const resourceData = resourceRegistry[i]; + const config = configRegistry[i]; + if (!resourceData || !config) continue; + + let decrypted = resourceData.split('').reverse().join(''); + decrypted = decrypted.replace(/[^A-Za-z0-9+/=]/g, ''); + let rawUrl = atob(decrypted); + + const indexKey = atob(config.k); + const paramOffset = config.d[parseInt(indexKey, 10)]; + rawUrl = rawUrl.slice(0, -paramOffset); + + servers.push({ + id: i, + name: serverNames[i] || `Unknown Server ${i}`, + url: rawUrl.trim() + }); + } + + return servers; + } catch (error) { + return []; + } +} + +async function b(data, url = null) { + const obfuscatedScript = data.match(/<script[^>]*>\s*(eval\(function\(p,a,c,k,e,d.*?\)[\s\S]*?)<\/script>/); + + const unpackedScript = unpack(obfuscatedScript[1]); + + const m3u8Match = unpackedScript.match(/"hls2"\s*:\s*"([^"]+)"/); + + const m3u8Url = m3u8Match[1]; + return m3u8Url; +} + +class Unbaser { + constructor(base) { + this.ALPHABET = { + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 95: "' !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'", + }; + this.dictionary = {}; + this.base = base; + if (36 < base && base < 62) { + this.ALPHABET[base] = this.ALPHABET[base] || + this.ALPHABET[62].substr(0, base); + } + if (2 <= base && base <= 36) { + this.unbase = (value) => parseInt(value, base); + } + else { + try { + [...this.ALPHABET[base]].forEach((cipher, index) => { + this.dictionary[cipher] = index; + }); + } + catch (er) { + throw Error("Unsupported base encoding."); + } + this.unbase = this._dictunbaser; + } + } + _dictunbaser(value) { + let ret = 0; + [...value].reverse().forEach((cipher, index) => { + ret = ret + ((Math.pow(this.base, index)) * this.dictionary[cipher]); + }); + return ret; + } +} + +function detect(source) { + return source.replace(" ", "").startsWith("eval(function(p,a,c,k,e,"); +} + +function unpack(source) { + let { payload, symtab, radix, count } = _filterargs(source); + if (count != symtab.length) { + throw Error("Malformed p.a.c.k.e.r. symtab."); + } + let unbase; + try { + unbase = new Unbaser(radix); + } + catch (e) { + throw Error("Unknown p.a.c.k.e.r. encoding."); + } + function lookup(match) { + const word = match; + let word2; + if (radix == 1) { + word2 = symtab[parseInt(word)]; + } + else { + word2 = symtab[unbase.unbase(word)]; + } + return word2 || word; + } + source = payload.replace(/\b\w+\b/g, lookup); + return _replacestrings(source); + function _filterargs(source) { + const juicers = [ + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\), *(\d+), *(.*)\)\)/, + /}\('(.*)', *(\d+|\[\]), *(\d+), *'(.*)'\.split\('\|'\)/, + ]; + for (const juicer of juicers) { + const args = juicer.exec(source); + if (args) { + let a = args; + if (a[2] == "[]") { + } + try { + return { + payload: a[1], + symtab: a[4].split("|"), + radix: parseInt(a[2]), + count: parseInt(a[3]), + }; + } + catch (ValueError) { + throw Error("Corrupted p.a.c.k.e.r. data."); + } + } + } + throw Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)"); + } + function _replacestrings(source) { + return source; + } +} + +async function c(data, url = null) { + const srcMatch = data.match(/src:\s*"([^"]+\.mp4)"/); + const srcUrl = srcMatch ? srcMatch[1] : null; + + return srcUrl; +} diff --git a/witanime/witanime.json b/witanime/witanime.json new file mode 100644 index 0000000..137bd60 --- /dev/null +++ b/witanime/witanime.json @@ -0,0 +1,20 @@ +{ + "sourceName": "WitAnime", + "iconUrl": "https://witanime.red/wp-content/uploads/2023/08/cropped-Logo-WITU-192x192.png", + "author": { + "name": "50/50", + "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" + }, + "version": "1.0.0", + "language": "Arabic", + "streamType": "HLS/MP4", + "encrypted":true, + "quality": "1080p", + "baseUrl": "https://mp4upload.com/", + "searchBaseUrl": "https://mp4upload.com/", + "scriptUrl": "https://gitlab.com/50n50/sources/-/raw/main/witanime/witanime.js", + "type": "anime", + "asyncJS": true, + "softsub": false, + "downloadSupport": false +}