Furaffinity-Request-Helper

Library to simplify requests to Furaffinity

Verzia zo dňa 12.01.2025. Pozri najnovšiu verziu.

Tento skript by nemal byť nainštalovaný priamo. Je to knižnica pre ďalšie skripty, ktorú by mali používať cez meta príkaz // @require https://update.greatest.deepsurf.us/scripts/483952/1519487/Furaffinity-Request-Helper.js

// ==UserScript==
// @name        Furaffinity-Request-Helper
// @namespace   Violentmonkey Scripts
// @grant       none
// @version     1.2.0
// @author      Midori Dragon
// @description Library to simplify requests to Furaffinity
// @icon        https://www.furaffinity.net/themes/beta/img/banners/fa_logo.png
// @license     MIT
// ==/UserScript==
// jshint esversion: 8
(() => {
    "use strict";
    class Semaphore {
        constructor(maxConcurrency) {
            this.maxConcurrency = maxConcurrency, this.currentConcurrency = 0, this.waitingQueue = [];
        }
        acquire() {
            return new Promise((resolve => {
                this.currentConcurrency < this.maxConcurrency ? (this.currentConcurrency++, resolve()) : this.waitingQueue.push(resolve);
            }));
        }
        release() {
            if (this.waitingQueue.length > 0) {
                const nextResolve = this.waitingQueue.shift();
                null != nextResolve && nextResolve();
            } else this.currentConcurrency--;
        }
    }
    class PercentHelper {
        constructor() {
            throw new Error("The PercentHelper class is static and cannot be instantiated.");
        }
        static setPercentValue(id, value) {
            return !(!value || !PercentHelper._percentAll.hasOwnProperty(id)) && (PercentHelper._percentAll[id] = value, 
            !0);
        }
        static getPercentValue(id, decimalPlaces = 2) {
            if (null == id) return -1;
            const percent = PercentHelper._percentAll[id];
            return percent ? parseFloat(percent.toFixed(decimalPlaces)) : -1;
        }
        static createPercentValue(uniqueId) {
            PercentHelper._percentAll[uniqueId] = 0;
        }
        static deletePercentValue(id) {
            PercentHelper._percentAll.hasOwnProperty(id) && delete PercentHelper._percentAll[id];
        }
        static updatePercentValue(id, value, totalValue) {
            if (null != id && "" !== id && -1 !== id) {
                const progress = value / totalValue * 100;
                PercentHelper.setPercentValue(id, progress);
            }
        }
    }
    PercentHelper._percentAll = {};
    var __awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class WaitAndCallAction {
        constructor(action, delay) {
            this.delay = 10, this._running = !1, this._action = action, null != delay && (this.delay = delay);
        }
        start() {
            if (null != this._action && !1 === this._running) return this._running = !0, this._intervalId = setInterval((() => {
                var _a;
                this._action(PercentHelper.getPercentValue(null === (_a = this._intervalId) || void 0 === _a ? void 0 : _a.toString()));
            }), this.delay), PercentHelper.createPercentValue(this._intervalId.toString()), 
            this._intervalId;
        }
        stop() {
            this._running && (this._running = !1, clearInterval(this._intervalId), null != this._intervalId && PercentHelper.deletePercentValue(this._intervalId.toString()));
        }
        static callFunctionAsync(functionToCall_1, params_1, action_1, delay_1) {
            return __awaiter(this, arguments, void 0, (function*(functionToCall, params, action, delay, usePercent = !1) {
                if (null == action) return yield functionToCall(...params);
                const waitAndCallAction = new WaitAndCallAction(action, delay), percentId = waitAndCallAction.start();
                usePercent && params.push(percentId);
                const result = yield functionToCall(...params);
                return waitAndCallAction.stop(), result;
            }));
        }
        static callFunction(functionToCall, params, action, delay, usePercent = !1) {
            if (null == action) return functionToCall(...params);
            const waitAndCallAction = new WaitAndCallAction(action, delay), percentId = waitAndCallAction.start();
            usePercent && params.push(percentId);
            const result = functionToCall(...params);
            return waitAndCallAction.stop(), result;
        }
    }
    class Logger {
        constructor() {
            throw new Error("The Logger class is static and cannot be instantiated.");
        }
        static logMessage(message) {
            FuraffinityRequests.logLevel >= 3 && console.log(message);
        }
        static logWarning(message) {
            FuraffinityRequests.logLevel >= 2 && console.warn(message);
        }
        static logError(message) {
            FuraffinityRequests.logLevel >= 1 && console.error(message);
        }
        static setLogLevel(level) {
            FuraffinityRequests.logLevel = level;
        }
    }
    class IdArray {
        constructor() {
            throw new Error("The IdArray class is static and cannot be instantiated.");
        }
        static getTillId(collection, toId, attributeName = "id") {
            const result = [];
            toId = toId.toString();
            for (const elem of collection) {
                result.push(elem);
                const attribute = elem.getAttribute(attributeName);
                if (null != attribute && attribute.replace("sid-", "") === toId) break;
            }
            return result;
        }
        static getSinceId(collection, fromId, attributeName = "id") {
            const array = collection;
            array.reverse();
            const result = [];
            fromId = fromId.toString();
            for (const elem of array) {
                result.push(elem);
                const attribute = elem.getAttribute(attributeName);
                if (null != attribute && attribute.replace("sid-", "") === fromId) break;
            }
            return result.reverse(), result;
        }
        static getBetweenIds(collection, fromId, toId, attributeName = "id") {
            const array = collection;
            let startIndex = -1, endIndex = -1;
            fromId = fromId.toString(), toId = toId.toString();
            for (let i = 0; i < array.length; i++) {
                const attribute = array[i].getAttribute(attributeName);
                if (null != attribute && attribute.replace("sid-", "") === fromId && (startIndex = i), 
                null != attribute && attribute.replace("sid-", "") === toId && (endIndex = i), -1 !== startIndex && -1 !== endIndex) break;
            }
            if (-1 === startIndex && -1 === endIndex) return array;
            -1 === startIndex && (startIndex = 0), -1 === endIndex && (endIndex = array.length - 1);
            const result = [];
            for (let i = startIndex; i <= endIndex; i++) result.push(array[i]);
            return result;
        }
        static containsId(collection, id, attributeName = "id") {
            id = id.toString();
            for (const elem of collection) {
                const attribute = elem.getAttribute(attributeName);
                if (null != attribute && attribute.replace("sid-", "") === id) return !0;
            }
            return !1;
        }
    }
    function convertToNumber(value) {
        if (null == value) return;
        const number = parseInt(value.toString());
        return isNaN(number) ? void 0 : number;
    }
    var Scraps_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class Scraps {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLink() {
            return FuraffinityRequests.fullUrl + "/scraps/";
        }
        getFiguresBetweenIds(username_1, fromId_1, toId_1, action_1) {
            return Scraps_awaiter(this, arguments, void 0, (function*(username, fromId, toId, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillId, [ username, void 0, toId, void 0, GalleryType.SCRAPS, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSinceId, [ username, void 0, fromId, void 0, GalleryType.SCRAPS, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenIds, [ username, void 0, fromId, toId, void 0, void 0, GalleryType.SCRAPS, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenIdsBetweenPages(username_1, fromId_1, toId_1, fromPageNumber_1, toPageNumber_1, action_1) {
            return Scraps_awaiter(this, arguments, void 0, (function*(username, fromId, toId, fromPageNumber, toPageNumber, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), fromPageNumber = convertToNumber(fromPageNumber), 
                toPageNumber = convertToNumber(toPageNumber), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillId, [ username, void 0, toId, fromPageNumber, GalleryType.SCRAPS, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSinceId, [ username, void 0, fromId, toPageNumber, GalleryType.SCRAPS, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenIds, [ username, void 0, fromId, toId, fromPageNumber, toPageNumber, GalleryType.SCRAPS, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenPages(username_1, fromPageNumber_1, toPageNumber_1, action_1) {
            return Scraps_awaiter(this, arguments, void 0, (function*(username, fromPageNumber, toPageNumber, action, delay = 100) {
                return fromPageNumber = convertToNumber(fromPageNumber), toPageNumber = convertToNumber(toPageNumber), 
                null == fromPageNumber || fromPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillPage, [ username, void 0, toPageNumber, GalleryType.SCRAPS, this._semaphore ], action, delay, !0) : null == toPageNumber || toPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSincePage, [ username, void 0, fromPageNumber, GalleryType.SCRAPS, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenPages, [ username, void 0, fromPageNumber, toPageNumber, GalleryType.SCRAPS, this._semaphore ], action, delay, !0);
            }));
        }
        getFigures(username_1, pageNumber_1, action_1) {
            return Scraps_awaiter(this, arguments, void 0, (function*(username, pageNumber, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFigures, [ username, void 0, pageNumber, GalleryType.SCRAPS, this._semaphore ], action, delay);
            }));
        }
        getPage(username_1, pageNumber_1, action_1) {
            return Scraps_awaiter(this, arguments, void 0, (function*(username, pageNumber, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(Page.getGalleryPage, [ username, void 0, pageNumber, GalleryType.SCRAPS, this._semaphore ], action, delay);
            }));
        }
    }
    var Favorites_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class Favorites {
        constructor(semaphore) {
            this.semaphore = semaphore;
        }
        static get hardLink() {
            return FuraffinityRequests.fullUrl + "/favorites/";
        }
        getFiguresBetweenIds(username_1, fromId_1, toId_1, action_1) {
            return Favorites_awaiter(this, arguments, void 0, (function*(username, fromId, toId, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresTillId, [ username, toId, void 0, this.semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresSinceId, [ username, fromId, void 0, this.semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresBetweenIds, [ username, fromId, toId, void 0, void 0, this.semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenIdsBetweenPages(username_1, fromId_1, toId_1, fromDataFavId_1, toDataFavId_1, action_1) {
            return Favorites_awaiter(this, arguments, void 0, (function*(username, fromId, toId, fromDataFavId, toDataFavId, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), fromDataFavId = convertToNumber(fromDataFavId), 
                toDataFavId = convertToNumber(toDataFavId), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresTillId, [ username, toId, fromDataFavId, this.semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresSinceId, [ username, fromId, toDataFavId, this.semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresBetweenIds, [ username, fromId, toId, fromDataFavId, toDataFavId, this.semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenPages(username_1, fromDataFavId_1, toDataFavId_1, action_1) {
            return Favorites_awaiter(this, arguments, void 0, (function*(username, fromDataFavId, toDataFavId, action, delay = 100) {
                return fromDataFavId = convertToNumber(fromDataFavId), toDataFavId = convertToNumber(toDataFavId), 
                null == fromDataFavId || fromDataFavId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresTillPage, [ username, toDataFavId, this.semaphore ], action, delay, !0) : null == toDataFavId || toDataFavId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresSincePage, [ username, fromDataFavId, this.semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(getFavoritesFiguresBetweenPages, [ username, fromDataFavId, toDataFavId, this.semaphore ], action, delay, !0);
            }));
        }
        getFigures(username_1, fromDataFavId_1, direction_1, action_1) {
            return Favorites_awaiter(this, arguments, void 0, (function*(username, fromDataFavId, direction, action, delay = 100) {
                return fromDataFavId = convertToNumber(fromDataFavId), direction = convertToNumber(direction), 
                yield WaitAndCallAction.callFunctionAsync(getFavoritesFigures, [ username, fromDataFavId, direction, this.semaphore ], action, delay);
            }));
        }
        getPage(username_1, fromDataFavId_1, direction_1, action_1) {
            return Favorites_awaiter(this, arguments, void 0, (function*(username, fromDataFavId, direction, action, delay = 100) {
                return fromDataFavId = convertToNumber(fromDataFavId), direction = convertToNumber(direction), 
                yield WaitAndCallAction.callFunctionAsync(Page.getFavoritesPage, [ username, fromDataFavId, direction, this.semaphore ], action, delay);
            }));
        }
    }
    function getFavoritesFiguresTillId(username, toId, fromDataFavId, semaphore) {
        return Favorites_awaiter(this, void 0, void 0, (function*() {
            if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
            (null == fromDataFavId || fromDataFavId <= 0) && (Logger.logWarning("No fromDataFavId given. Using default 1 instead."), 
            fromDataFavId = -1);
            let running = !0, dataFavId = fromDataFavId;
            const allFigures = [];
            for (;running; ) {
                const figures = yield getFavoritesFigures(username, dataFavId, 1, semaphore);
                let currFigureId;
                if (0 !== figures.length) {
                    currFigureId = figures[0].id;
                    const dataFavIdString = figures[figures.length - 1].getAttribute("data-fav-id");
                    if (null == dataFavIdString) {
                        running = !1;
                        break;
                    }
                    dataFavId = parseInt(dataFavIdString);
                }
                undefined === currFigureId ? running = !1 : IdArray.containsId(figures, toId) ? (allFigures.push(IdArray.getTillId(figures, toId)), 
                running = !1) : allFigures.push(figures);
            }
            return allFigures;
        }));
    }
    function getFavoritesFiguresSinceId(username, fromId, toDataFavId, semaphore) {
        return Favorites_awaiter(this, void 0, void 0, (function*() {
            if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
            (null == toDataFavId || toDataFavId <= 0) && (Logger.logWarning("No toDataFavId given. Using default 1 instead."), 
            toDataFavId = -1);
            let dataFavId = toDataFavId >= 0 ? toDataFavId : -1;
            const direction = toDataFavId >= 0 ? -1 : 1;
            let running = !0;
            if (toDataFavId < 0) {
                for (;running; ) {
                    const figures = yield getFavoritesFigures(username, dataFavId, direction, semaphore);
                    let currFigureId;
                    if (0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId) running = !1; else if (IdArray.containsId(figures, fromId)) {
                        running = !1;
                        const dataFavIdString = figures[figures.length - 1].getAttribute("data-fav-id");
                        if (null == dataFavIdString) {
                            running = !1;
                            break;
                        }
                        dataFavId = parseInt(dataFavIdString);
                    }
                }
                running = !0;
            }
            const allFigures = [];
            for (;running; ) {
                const figures = yield getFavoritesFigures(username, dataFavId, direction, semaphore);
                let currFigureId;
                if (0 !== figures.length) {
                    currFigureId = figures[0].id;
                    const dataFavIdString = direction >= 0 ? figures[figures.length - 1].getAttribute("data-fav-id") : figures[0].getAttribute("data-fav-id");
                    if (null == dataFavIdString) {
                        running = !1;
                        break;
                    }
                    dataFavId = parseInt(dataFavIdString);
                }
                undefined === currFigureId ? running = !1 : direction < 0 ? IdArray.containsId(figures, fromId) ? (allFigures.push(IdArray.getSinceId(figures, fromId).reverse()), 
                running = !1) : allFigures.push(Array.from(figures).reverse()) : IdArray.containsId(figures, toDataFavId, "data-fav-id") ? (allFigures.push(IdArray.getTillId(figures, toDataFavId, "data-fav-id")), 
                running = !1) : allFigures.push(figures);
            }
            return direction < 0 && allFigures.reverse(), allFigures;
        }));
    }
    function getFavoritesFiguresBetweenIds(username, fromId, toId, fromDataFavId, toDataFavId, semaphore) {
        return Favorites_awaiter(this, void 0, void 0, (function*() {
            if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
            if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
            (null == fromDataFavId || fromDataFavId <= 0) && (Logger.logWarning("No fromDataFavId given. Using default 1 instead."), 
            fromDataFavId = -1), (null == toDataFavId || toDataFavId <= 0) && (Logger.logWarning("No toDataFavId given. Using default 1 instead."), 
            toDataFavId = -1);
            const direction = fromDataFavId >= 0 ? 1 : toDataFavId >= 0 ? -1 : 1;
            let lastFigureId, dataFavId = fromDataFavId >= 0 ? fromDataFavId : toDataFavId, running = !0;
            if (fromDataFavId < 0 && toDataFavId < 0) {
                for (;running; ) {
                    const figures = yield getFavoritesFigures(username, dataFavId, direction, semaphore);
                    let currFigureId = lastFigureId;
                    if (0 !== figures.length) {
                        currFigureId = figures[0].id;
                        const dataFavIdString = figures[figures.length - 1].getAttribute("data-fav-id");
                        if (null == dataFavIdString) {
                            running = !1;
                            break;
                        }
                        dataFavId = parseInt(dataFavIdString);
                    }
                    (currFigureId === lastFigureId || IdArray.containsId(figures, fromId)) && (running = !1);
                }
                running = !0;
            }
            const allFigures = [];
            for (lastFigureId = void 0; running; ) {
                const figures = yield getFavoritesFigures(username, dataFavId, direction, semaphore);
                let currFigureId = lastFigureId;
                if (0 !== figures.length) {
                    currFigureId = figures[0].id;
                    const dataFavIdString = direction >= 0 ? figures[figures.length - 1].getAttribute("data-fav-id") : figures[0].getAttribute("data-fav-id");
                    if (null == dataFavIdString) {
                        running = !1;
                        break;
                    }
                    dataFavId = parseInt(dataFavIdString);
                }
                currFigureId === lastFigureId ? running = !1 : direction < 0 ? IdArray.containsId(figures, fromId) ? (allFigures.push(IdArray.getSinceId(figures, fromId).reverse()), 
                running = !1) : IdArray.containsId(figures, toId) ? allFigures.push(IdArray.getTillId(figures, toId).reverse()) : allFigures.push(Array.from(figures).reverse()) : IdArray.containsId(figures, toId) ? (allFigures.push(IdArray.getTillId(figures, toId)), 
                running = !1) : IdArray.containsId(figures, fromId) ? allFigures.push(IdArray.getSinceId(figures, fromId)) : allFigures.push(figures);
            }
            return direction < 0 && allFigures.reverse(), allFigures;
        }));
    }
    function getFavoritesFiguresTillPage(username, toDataFavId, semaphore) {
        return Favorites_awaiter(this, void 0, void 0, (function*() {
            (null == toDataFavId || toDataFavId <= 0) && (Logger.logWarning("toDataFavId must be greater than 0. Using default 1 instead."), 
            toDataFavId = -1);
            let dataFavId = toDataFavId;
            const allFigures = [];
            let running = !0;
            for (;running; ) {
                const figures = yield getFavoritesFigures(username, dataFavId, 1, semaphore);
                let currFigureId;
                if (0 !== figures.length) {
                    currFigureId = figures[0].id;
                    const dataFavIdString = figures[figures.length - 1].getAttribute("data-fav-id");
                    if (null == dataFavIdString) {
                        running = !1;
                        break;
                    }
                    dataFavId = parseInt(dataFavIdString);
                }
                undefined === currFigureId ? running = !1 : IdArray.containsId(figures, toDataFavId, "data-fav-id") ? (allFigures.push(IdArray.getTillId(figures, toDataFavId, "data-fav-id")), 
                running = !1) : allFigures.push(figures);
            }
            return allFigures;
        }));
    }
    function getFavoritesFiguresSincePage(username, fromDataFavId, semaphore) {
        return Favorites_awaiter(this, void 0, void 0, (function*() {
            (null == fromDataFavId || fromDataFavId <= 0) && (Logger.logWarning("fromDataFavId must be greater than 0. Using default 1 instead."), 
            fromDataFavId = -1);
            let dataFavId = fromDataFavId;
            const allFigures = [];
            let running = !0;
            for (;running; ) {
                const figures = yield getFavoritesFigures(username, dataFavId, 1, semaphore);
                let currFigureId;
                if (0 !== figures.length) {
                    currFigureId = figures[0].id;
                    const dataFavIdString = figures[figures.length - 1].getAttribute("data-fav-id");
                    if (null == dataFavIdString) {
                        running = !1;
                        break;
                    }
                    dataFavId = parseInt(dataFavIdString);
                }
                undefined === currFigureId ? running = !1 : IdArray.containsId(figures, fromDataFavId, "data-fav-id") ? allFigures.push(IdArray.getSinceId(figures, fromDataFavId, "data-fav-id")) : allFigures.push(figures);
            }
            return allFigures;
        }));
    }
    function getFavoritesFiguresBetweenPages(username, fromDataFavId, toDataFavId, semaphore) {
        return Favorites_awaiter(this, void 0, void 0, (function*() {
            (null == fromDataFavId || fromDataFavId <= 0) && (Logger.logWarning("fromDataFavId must be greater than 0. Using default 1 instead."), 
            fromDataFavId = -1), (null == toDataFavId || toDataFavId <= 0) && (Logger.logError("toDataFavId must be greater than 0. Using default 1 instead."), 
            toDataFavId = -1);
            let dataFavId = fromDataFavId;
            const allFigures = [];
            let running = !0;
            for (;running; ) {
                const figures = yield getFavoritesFigures(username, dataFavId, 1, semaphore);
                let currFigureId;
                if (0 !== figures.length) {
                    currFigureId = figures[0].id;
                    const dataFavIdString = figures[figures.length - 1].getAttribute("data-fav-id");
                    if (null == dataFavIdString) {
                        running = !1;
                        break;
                    }
                    dataFavId = parseInt(dataFavIdString);
                }
                undefined === currFigureId ? running = !1 : IdArray.containsId(figures, fromDataFavId, "data-fav-id") ? allFigures.push(IdArray.getSinceId(figures, fromDataFavId, "data-fav-id")) : IdArray.containsId(figures, toDataFavId, "data-fav-id") ? (allFigures.push(IdArray.getTillId(figures, toDataFavId, "data-fav-id")), 
                running = !1) : allFigures.push(figures);
            }
            return allFigures;
        }));
    }
    function getFavoritesFigures(username, dataFavId, direction, semaphore) {
        return Favorites_awaiter(this, void 0, void 0, (function*() {
            const galleryDoc = yield Page.getFavoritesPage(username, dataFavId, direction, semaphore);
            if (!galleryDoc || !(galleryDoc instanceof Document) || galleryDoc.getElementById("no-images")) return Logger.logMessage(`No images found at favorites of "${username}" on page "${dataFavId}".`), 
            [];
            const figures = galleryDoc.getElementsByTagName("figure");
            return null == figures || 0 === figures.length ? (Logger.logMessage(`No figures found at favorites of "${username}" on page "${dataFavId}".`), 
            []) : Array.from(figures);
        }));
    }
    var Journals_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class Journals {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLink() {
            return FuraffinityRequests.fullUrl + "/journals/";
        }
        getFiguresBetweenIds(username_1, fromId_1, toId_1, action_1) {
            return Journals_awaiter(this, arguments, void 0, (function*(username, fromId, toId, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsTillId, [ username, toId, void 0, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsSinceId, [ username, fromId, void 0, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsBetweenIds, [ username, fromId, toId, void 0, void 0, this._semaphore ], action, delay);
            }));
        }
        getFiguresBetweenIdsBetweenPages(username_1, fromId_1, toId_1, fromPageNumber_1, toPageNumber_1, action_1) {
            return Journals_awaiter(this, arguments, void 0, (function*(username, fromId, toId, fromPageNumber, toPageNumber, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), fromPageNumber = convertToNumber(fromPageNumber), 
                toPageNumber = convertToNumber(toPageNumber), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsTillId, [ username, toId, fromPageNumber, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsSinceId, [ username, fromId, toPageNumber, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsBetweenIds, [ username, fromId, toId, fromPageNumber, toPageNumber, this._semaphore ], action, delay);
            }));
        }
        getSectionsBetweenPages(username_1, fromPageNumber_1, toPageNumber_1, action_1) {
            return Journals_awaiter(this, arguments, void 0, (function*(username, fromPageNumber, toPageNumber, action, delay = 100) {
                return fromPageNumber = convertToNumber(fromPageNumber), toPageNumber = convertToNumber(toPageNumber), 
                null == fromPageNumber || fromPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsTillPage, [ username, toPageNumber, this._semaphore ], action, delay, !0) : null == toPageNumber || toPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsSincePage, [ username, fromPageNumber, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(getJournalsSectionsBetweenPages, [ username, fromPageNumber, toPageNumber, this._semaphore ], action, delay, !0);
            }));
        }
        getSections(username_1, pageNumber_1, action_1) {
            return Journals_awaiter(this, arguments, void 0, (function*(username, pageNumber, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(getJournalsSections, [ username, pageNumber, this._semaphore ], action, delay);
            }));
        }
        getPage(username_1, pageNumber_1, action_1) {
            return Journals_awaiter(this, arguments, void 0, (function*(username, pageNumber, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(Page.getJournalsPage, [ username, pageNumber, this._semaphore ], action, delay);
            }));
        }
    }
    function getJournalsSectionsTillId(username, toId, fromPage, semaphore) {
        return Journals_awaiter(this, void 0, void 0, (function*() {
            if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
            const allSections = [];
            let running = !0, i = 1;
            for (null != fromPage && fromPage >= 1 && (i = fromPage); running; ) {
                const sections = yield getJournalsSections(username, i, semaphore);
                let currSectionId;
                0 !== sections.length && (currSectionId = sections[0].id), undefined === currSectionId ? running = !1 : IdArray.containsId(sections, toId) ? (allSections.push(IdArray.getTillId(sections, toId)), 
                running = !1) : (allSections.push(sections), i++);
            }
            return allSections;
        }));
    }
    function getJournalsSectionsSinceId(username, fromId, toPage, semaphore) {
        return Journals_awaiter(this, void 0, void 0, (function*() {
            if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
            const direction = null == toPage || toPage <= 0 ? -1 : 1;
            let lastSectionId, running = !0, i = null == toPage || toPage <= 0 ? 1 : toPage;
            if (null == toPage || toPage <= 0) for (;running; ) {
                const figures = yield getJournalsSections(username, i, semaphore);
                let currSectionId = lastSectionId;
                0 !== figures.length && (currSectionId = figures[0].id), currSectionId === lastSectionId || IdArray.containsId(figures, fromId) ? running = !1 : i++;
            }
            const allSections = [];
            for (lastSectionId = void 0, running = !0; running; ) {
                const figures = yield getJournalsSections(username, i, semaphore);
                let currSectionId = lastSectionId;
                if (0 !== figures.length && (currSectionId = figures[0].id), currSectionId === lastSectionId) running = !1; else {
                    if (IdArray.containsId(figures, fromId)) {
                        const figuresPush = IdArray.getSinceId(figures, fromId);
                        direction < 0 && (figuresPush.reverse(), running = !1), allSections.push(figuresPush);
                    } else direction < 0 && figures.reverse(), allSections.push(figures);
                    i += direction;
                }
            }
            return direction < 0 && allSections.reverse(), allSections;
        }));
    }
    function getJournalsSectionsBetweenIds(username, fromId, toId, fromPage, toPage, semaphore, percentId) {
        return Journals_awaiter(this, void 0, void 0, (function*() {
            if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
            if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
            (null == fromPage || fromPage <= 0 || null == toPage || toPage <= 1) && (Logger.logWarning("No fromPage or toPage given. Percentages can not be calculated."), 
            percentId = void 0);
            let i = 1;
            null != fromPage && fromPage >= 1 && (i = fromPage);
            const allSections = [];
            let running = !0, completedPages = 0;
            for (;running; ) {
                null != toPage && toPage >= 1 && i >= toPage && (running = !1);
                const sections = yield getJournalsSections(username, i, semaphore);
                let currSectionId;
                0 !== sections.length && (currSectionId = sections[0].id), undefined === currSectionId ? running = !1 : (IdArray.containsId(sections, fromId) && allSections.push(IdArray.getSinceId(sections, fromId)), 
                IdArray.containsId(sections, toId) ? (allSections.push(IdArray.getBetweenIds(sections, fromId, toId)), 
                running = !1) : (allSections.push(sections), i++)), completedPages++, null != toPage && toPage >= 1 && PercentHelper.updatePercentValue(percentId, completedPages, toPage);
            }
            return allSections;
        }));
    }
    function getJournalsSectionsTillPage(username, toPageNumber, semaphore, percentId) {
        return Journals_awaiter(this, void 0, void 0, (function*() {
            (null == toPageNumber || toPageNumber <= 0) && (Logger.logWarning("toPageNumber must be greater than 0. Using default 1 instead."), 
            toPageNumber = 1);
            const allSections = [];
            let completedPages = 0;
            for (let i = 1; i <= toPageNumber; i++) {
                const sections = yield getJournalsSections(username, i, semaphore);
                0 !== sections.length && allSections.push(sections), completedPages++, PercentHelper.updatePercentValue(percentId, completedPages, toPageNumber);
            }
            return allSections;
        }));
    }
    function getJournalsSectionsSincePage(username, fromPageNumber, semaphore) {
        return Journals_awaiter(this, void 0, void 0, (function*() {
            (null == fromPageNumber || fromPageNumber <= 0) && (Logger.logWarning("fromPageNumber must be greater than 0. Using default 1 instead."), 
            fromPageNumber = 1);
            const allSections = [];
            let running = !0, i = fromPageNumber;
            for (;running; ) {
                const sections = yield getJournalsSections(username, i, semaphore);
                let currSectionId;
                0 !== sections.length && (currSectionId = sections[0].id), undefined === currSectionId ? running = !1 : (allSections.push(sections), 
                i++);
            }
            return allSections;
        }));
    }
    function getJournalsSectionsBetweenPages(username, fromPageNumber, toPageNumber, semaphore, percentId) {
        return Journals_awaiter(this, void 0, void 0, (function*() {
            (null == fromPageNumber || fromPageNumber <= 0) && (Logger.logWarning("fromPageNumber must be greater than 0. Using default 1 instead."), 
            fromPageNumber = 1), (null == toPageNumber || toPageNumber <= 0) && (Logger.logError("toPageNumber must be greater than 0. Using default 1 instead."), 
            toPageNumber = 1);
            const allSections = [], direction = fromPageNumber < toPageNumber ? 1 : -1, totalPages = Math.abs(toPageNumber - fromPageNumber) + 1;
            let completedPages = 0;
            for (let i = fromPageNumber; i <= toPageNumber; i += direction) {
                const sections = yield getJournalsSections(username, i, semaphore);
                0 !== sections.length && allSections.push(sections), completedPages++, PercentHelper.updatePercentValue(percentId, completedPages, totalPages);
            }
            return allSections;
        }));
    }
    function getJournalsSections(username, pageNumber, semaphore) {
        return Journals_awaiter(this, void 0, void 0, (function*() {
            (null == pageNumber || pageNumber <= 0) && (Logger.logWarning("pageNumber must be greater than 0. Using default 1 instead."), 
            pageNumber = 1);
            const galleryDoc = yield Page.getJournalsPage(username, pageNumber, semaphore);
            if (!galleryDoc) return Logger.logWarning(`No journals found at "${username}" on page "${pageNumber}".`), 
            [];
            const columnPage = galleryDoc.getElementById("columnpage");
            if (!columnPage) return Logger.logWarning(`No column page found at "${username}" on page "${pageNumber}".`), 
            [];
            const sections = columnPage.getElementsByTagName("section");
            return null == sections || 0 === sections.length ? (Logger.logWarning(`No journals found at "${username}" on page "${pageNumber}".`), 
            []) : Array.from(sections);
        }));
    }
    var Search_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class Search {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLink() {
            return FuraffinityRequests.fullUrl + "/search/";
        }
        get newSearchOptions() {
            return new SearchOptions;
        }
        static get newSearchOptions() {
            return new SearchOptions;
        }
        get SearchOptions() {
            return SearchOptions;
        }
        static get SearchOptions() {
            return SearchOptions;
        }
        getFiguresBetweenIds(fromId_1, toId_1, searchOptions_1, action_1) {
            return Search_awaiter(this, arguments, void 0, (function*(fromId, toId, searchOptions, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresTillId, [ toId, void 0, searchOptions, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresSinceId, [ fromId, void 0, searchOptions, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresBetweenIds, [ fromId, toId, void 0, void 0, searchOptions, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenIdsBetweenPages(fromId_1, toId_1, fromPageNumber_1, toPageNumber_1, searchOptions_1, action_1) {
            return Search_awaiter(this, arguments, void 0, (function*(fromId, toId, fromPageNumber, toPageNumber, searchOptions, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), fromPageNumber = convertToNumber(fromPageNumber), 
                toPageNumber = convertToNumber(toPageNumber), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresTillId, [ toId, fromPageNumber, searchOptions, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresSinceId, [ fromId, toPageNumber, searchOptions, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresBetweenIds, [ fromId, toId, fromPageNumber, toPageNumber, searchOptions, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenPages(fromPageNumber_1, toPageNumber_1, searchOptions_1, action_1) {
            return Search_awaiter(this, arguments, void 0, (function*(fromPageNumber, toPageNumber, searchOptions, action, delay = 100) {
                return fromPageNumber = convertToNumber(fromPageNumber), toPageNumber = convertToNumber(toPageNumber), 
                null == fromPageNumber || fromPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresTillPage, [ toPageNumber, searchOptions, this._semaphore ], action, delay, !0) : null == toPageNumber || toPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresSincePage, [ fromPageNumber, searchOptions, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFiguresBetweenPages, [ fromPageNumber, toPageNumber, searchOptions, this._semaphore ], action, delay, !0);
            }));
        }
        getFigures(pageNumber_1, searchOptions_1, action_1) {
            return Search_awaiter(this, arguments, void 0, (function*(pageNumber, searchOptions, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(SearchRequests.getSearchFigures, [ pageNumber, searchOptions, this._semaphore ], action, delay);
            }));
        }
        getPage(pageNumber_1, searchOptions_1, action_1) {
            return Search_awaiter(this, arguments, void 0, (function*(pageNumber, searchOptions, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(Page.getSearchPage, [ pageNumber, searchOptions, this._semaphore ], action, delay);
            }));
        }
    }
    class SearchOptions {
        constructor() {
            this.input = "", this.orderBy = SearchOptions.orderBy.relevancy, this.orderDirection = SearchOptions.orderDirection.descending, 
            this.range = SearchOptions.range.alltime, this.rangeFrom = void 0, this.rangeTo = void 0, 
            this.ratingGeneral = !0, this.ratingMature = !0, this.ratingAdult = !0, this.typeArt = !0, 
            this.typeMusic = !0, this.typeFlash = !0, this.typeStory = !0, this.typePhotos = !0, 
            this.typePoetry = !0, this.matching = SearchOptions.matching.all;
        }
        static get orderBy() {
            return {
                relevancy: "relevancy",
                date: "date",
                popularity: "popularity"
            };
        }
        static get orderDirection() {
            return {
                ascending: "asc",
                descending: "desc"
            };
        }
        static get range() {
            return {
                "1day": "1day",
                "3days": "3days",
                "7days": "7days",
                "30days": "30days",
                "90days": "90days",
                "1year": "1year",
                "3years": "3years",
                "5years": "5years",
                alltime: "all",
                manual: "manual"
            };
        }
        static get matching() {
            return {
                all: "all",
                any: "any",
                extended: "extended"
            };
        }
    }
    var SearchRequests_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class SearchRequests {
        constructor(semaphore) {
            this._semaphore = semaphore, this.Browse = new Browse(this._semaphore), this.Search = new Search(this._semaphore);
        }
        static getBrowseFiguresTillId(toId, fromPage, browseOptions, semaphore) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
                let allFigures = [], running = !0, i = 1;
                for (null != fromPage && fromPage >= 1 && (i = fromPage); running; ) {
                    const figures = yield SearchRequests.getBrowseFigures(i, browseOptions, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : IdArray.containsId(figures, toId) ? (allFigures.push(IdArray.getTillId(figures, toId)), 
                    running = !1) : (allFigures.push(figures), i++);
                }
                return allFigures;
            }));
        }
        static getBrowseFiguresSinceId(fromId, toPage, browseOptions, semaphore) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
                const direction = null == toPage || toPage <= 0 ? -1 : 1;
                let lastFigureId, running = !0, i = null == toPage || toPage <= 0 ? 1 : toPage;
                if (null == toPage || toPage <= 0) for (;running; ) {
                    const figures = yield SearchRequests.getBrowseFigures(i, browseOptions, semaphore);
                    let currFigureId = lastFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), currFigureId === lastFigureId || IdArray.containsId(figures, fromId) ? running = !1 : i++;
                }
                let allFigures = [];
                for (lastFigureId = void 0, running = !0; running; ) {
                    const figures = yield SearchRequests.getBrowseFigures(i, browseOptions, semaphore);
                    let currFigureId = lastFigureId;
                    if (0 !== figures.length && (currFigureId = figures[0].id), currFigureId === lastFigureId) running = !1; else {
                        if (IdArray.containsId(figures, fromId)) {
                            const figuresPush = IdArray.getSinceId(figures, fromId);
                            direction < 0 && (figuresPush.reverse(), running = !1), allFigures.push(figuresPush);
                        } else direction < 0 && figures.reverse(), allFigures.push(figures);
                        i += direction;
                    }
                }
                return direction < 0 && allFigures.reverse(), allFigures;
            }));
        }
        static getBrowseFiguresBetweenIds(fromId, toId, fromPage, toPage, browseOptions, semaphore, percentId) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
                if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
                (null == fromPage || fromPage <= 0 || null == toPage || toPage <= 1) && (Logger.logWarning("No fromPage or toPage given. Percentages can not be calculated."), 
                percentId = void 0);
                let i = 1;
                null != fromPage && fromPage >= 1 && (i = fromPage);
                const allFigures = [];
                let running = !0, completedPages = 0;
                for (;running; ) {
                    null != toPage && toPage >= 1 && i >= toPage && (running = !1);
                    const figures = yield SearchRequests.getBrowseFigures(i, browseOptions, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : (IdArray.containsId(figures, fromId) && allFigures.push(IdArray.getSinceId(figures, fromId)), 
                    IdArray.containsId(figures, toId) ? (allFigures.push(IdArray.getBetweenIds(figures, fromId, toId)), 
                    running = !1) : (allFigures.push(figures), i++)), completedPages++, null != toPage && toPage >= 1 && PercentHelper.updatePercentValue(percentId, completedPages, toPage);
                }
                return allFigures;
            }));
        }
        static getBrowseFiguresTillPage(toPageNumber, browseOptions, semaphore, percentId) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                (null == toPageNumber || toPageNumber <= 0) && (Logger.logWarning("toPageNumber must be greater than 0. Using default 1 instead."), 
                toPageNumber = 1);
                const allFigures = [];
                let completedPages = 0;
                for (let i = 1; i <= toPageNumber; i++) {
                    const figures = yield SearchRequests.getBrowseFigures(i, browseOptions, semaphore);
                    0 !== figures.length && allFigures.push(figures), completedPages++, PercentHelper.updatePercentValue(percentId, completedPages, toPageNumber);
                }
                return allFigures;
            }));
        }
        static getBrowseFiguresSincePage(fromPageNumber, browseOptions, semaphore) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                (null == fromPageNumber || fromPageNumber <= 0) && (Logger.logWarning("fromPageNumber must be greater than 0. Using default 1 instead."), 
                fromPageNumber = 1);
                const allFigures = [];
                let running = !0, i = fromPageNumber;
                for (;running; ) {
                    const figures = yield SearchRequests.getBrowseFigures(i, browseOptions, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : (allFigures.push(figures), 
                    i++);
                }
                return allFigures;
            }));
        }
        static getBrowseFiguresBetweenPages(fromPageNumber, toPageNumber, browseOptions, semaphore, percentId) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                (null == fromPageNumber || fromPageNumber <= 0) && (Logger.logWarning("fromPageNumber must be greater than 0. Using default 1 instead."), 
                fromPageNumber = 1), (null == toPageNumber || toPageNumber <= 0) && (Logger.logError("toPageNumber must be greater than 0. Using default 1 instead."), 
                toPageNumber = 1);
                const allFigures = [], direction = fromPageNumber <= toPageNumber ? 1 : -1, totalPages = Math.abs(toPageNumber - fromPageNumber) + 1;
                for (let i = fromPageNumber; i <= toPageNumber; i += direction) {
                    const figures = yield SearchRequests.getBrowseFigures(i, browseOptions, semaphore);
                    0 !== figures.length && allFigures.push(figures), PercentHelper.updatePercentValue(percentId, 0, totalPages);
                }
                return allFigures;
            }));
        }
        static getBrowseFigures(pageNumber, browseOptions, semaphore) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                (null == pageNumber || pageNumber <= 0) && (Logger.logWarning("No pageNumber given. Using default value of 1."), 
                pageNumber = 1);
                const galleryDoc = yield Page.getBrowsePage(pageNumber, browseOptions, semaphore);
                if (!galleryDoc || !(galleryDoc instanceof Document) || galleryDoc.getElementById("no-images")) return Logger.logMessage(`No images found at browse on page "${pageNumber}".`), 
                [];
                const figures = galleryDoc.getElementsByTagName("figure");
                return null == figures || 0 === figures.length ? (Logger.logMessage(`No figures found at browse on page "${pageNumber}".`), 
                []) : Array.from(figures);
            }));
        }
        static getSearchFiguresTillId(toId, fromPage, searchOptions, semaphore) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
                let allFigures = [], running = !0, i = 1;
                for (null != fromPage && fromPage >= 1 && (i = fromPage); running; ) {
                    const figures = yield SearchRequests.getSearchFigures(i, searchOptions, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : IdArray.containsId(figures, toId) ? (allFigures.push(IdArray.getTillId(figures, toId)), 
                    running = !1) : (allFigures.push(figures), i++);
                }
                return allFigures;
            }));
        }
        static getSearchFiguresSinceId(fromId, toPage, searchOptions, semaphore) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
                const direction = null == toPage || toPage <= 0 ? -1 : 1;
                let lastFigureId, running = !0, i = null == toPage || toPage <= 0 ? 1 : toPage;
                if (null == toPage || toPage <= 0) for (;running; ) {
                    const figures = yield SearchRequests.getSearchFigures(i, searchOptions, semaphore);
                    let currFigureId = lastFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), currFigureId === lastFigureId || IdArray.containsId(figures, fromId) ? running = !1 : i++;
                }
                let allFigures = [];
                for (lastFigureId = void 0, running = !0; running; ) {
                    const figures = yield SearchRequests.getSearchFigures(i, searchOptions, semaphore);
                    let currFigureId = lastFigureId;
                    if (0 !== figures.length && (currFigureId = figures[0].id), currFigureId === lastFigureId) running = !1; else {
                        if (IdArray.containsId(figures, fromId)) {
                            const figuresPush = IdArray.getSinceId(figures, fromId);
                            direction < 0 && (figuresPush.reverse(), running = !1), allFigures.push(figuresPush);
                        } else direction < 0 && figures.reverse(), allFigures.push(figures);
                        i += direction;
                    }
                }
                return direction < 0 && allFigures.reverse(), allFigures;
            }));
        }
        static getSearchFiguresBetweenIds(fromId, toId, fromPage, toPage, searchOptions, semaphore, percentId) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
                if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
                (null == fromPage || fromPage <= 0 || null == toPage || toPage <= 1) && (Logger.logWarning("No fromPage or toPage given. Percentages can not be calculated."), 
                percentId = void 0);
                let i = 1;
                null != fromPage && fromPage >= 1 && (i = fromPage);
                const allFigures = [];
                let running = !0, completedPages = 0;
                for (;running; ) {
                    null != toPage && toPage >= 1 && i >= toPage && (running = !1);
                    const figures = yield SearchRequests.getSearchFigures(i, searchOptions, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : (IdArray.containsId(figures, fromId) && allFigures.push(IdArray.getSinceId(figures, fromId)), 
                    IdArray.containsId(figures, toId) ? (allFigures.push(IdArray.getBetweenIds(figures, fromId, toId)), 
                    running = !1) : (allFigures.push(figures), i++)), completedPages++, null != toPage && toPage >= 1 && PercentHelper.updatePercentValue(percentId, completedPages, toPage);
                }
                return allFigures;
            }));
        }
        static getSearchFiguresTillPage(toPageNumber, searchOptions, semaphore, percentId) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                (null == toPageNumber || toPageNumber <= 0) && (Logger.logWarning("toPageNumber must be greater than 0. Using default 1 instead."), 
                toPageNumber = 1);
                const allFigures = [];
                let completedPages = 0;
                for (let i = 1; i <= toPageNumber; i++) {
                    const figures = yield SearchRequests.getSearchFigures(i, searchOptions, semaphore);
                    0 !== figures.length && allFigures.push(figures), completedPages++, PercentHelper.updatePercentValue(percentId, completedPages, toPageNumber);
                }
                return allFigures;
            }));
        }
        static getSearchFiguresSincePage(fromPageNumber, searchOptions, semaphore) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                (null == fromPageNumber || fromPageNumber <= 0) && (Logger.logWarning("fromPageNumber must be greater than 0. Using default 1 instead."), 
                fromPageNumber = 1);
                const allFigures = [];
                let running = !0, i = fromPageNumber;
                for (;running; ) {
                    const figures = yield SearchRequests.getSearchFigures(i, searchOptions, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : (allFigures.push(figures), 
                    i++);
                }
                return allFigures;
            }));
        }
        static getSearchFiguresBetweenPages(fromPageNumber, toPageNumber, searchOptions, semaphore, percentId) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                (null == fromPageNumber || fromPageNumber <= 0) && (Logger.logWarning("fromPageNumber must be greater than 0. Using default 1 instead."), 
                fromPageNumber = 1), (null == toPageNumber || toPageNumber <= 0) && (Logger.logError("toPageNumber must be greater than 0. Using default 1 instead."), 
                toPageNumber = 1);
                const allFigures = [], direction = fromPageNumber <= toPageNumber ? 1 : -1, totalPages = Math.abs(toPageNumber - fromPageNumber) + 1;
                let completedPages = 0;
                for (let i = fromPageNumber; i <= toPageNumber; i += direction) {
                    const figures = yield SearchRequests.getSearchFigures(i, searchOptions, semaphore);
                    0 !== figures.length && allFigures.push(figures), completedPages++, PercentHelper.updatePercentValue(percentId, completedPages, totalPages);
                }
                return allFigures;
            }));
        }
        static getSearchFigures(pageNumber, searchOptions, semaphore) {
            return SearchRequests_awaiter(this, void 0, void 0, (function*() {
                (null == pageNumber || pageNumber <= 0) && (Logger.logWarning("No pageNumber given. Using default value of 1."), 
                pageNumber = 1);
                const galleryDoc = yield Page.getSearchPage(pageNumber, searchOptions, semaphore);
                if (!galleryDoc || !(galleryDoc instanceof Document) || galleryDoc.getElementById("no-images")) return Logger.logMessage(`No images found at search on page "${pageNumber}".`), 
                [];
                const figures = galleryDoc.getElementsByTagName("figure");
                return null == figures || 0 === figures.length ? (Logger.logMessage(`No figures found at search on page "${pageNumber}".`), 
                []) : Array.from(figures);
            }));
        }
    }
    var Browse_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class Browse {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLink() {
            return FuraffinityRequests.fullUrl + "/browse/";
        }
        get newBrowseOptions() {
            return new BrowseOptions;
        }
        static get newBrowseOptions() {
            return new BrowseOptions;
        }
        get BrowseOptions() {
            return BrowseOptions;
        }
        static get BrowseOptions() {
            return BrowseOptions;
        }
        getFiguresBetweenIds(fromId_1, toId_1, browseOptions_1, action_1) {
            return Browse_awaiter(this, arguments, void 0, (function*(fromId, toId, browseOptions, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresTillId, [ toId, void 0, browseOptions, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresSinceId, [ fromId, void 0, browseOptions, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresBetweenIds, [ fromId, toId, void 0, void 0, browseOptions, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenIdsBetweenPages(fromId_1, toId_1, fromPageNumber_1, toPageNumber_1, browseOptions_1, action_1) {
            return Browse_awaiter(this, arguments, void 0, (function*(fromId, toId, fromPageNumber, toPageNumber, browseOptions, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), fromPageNumber = convertToNumber(fromPageNumber), 
                toPageNumber = convertToNumber(toPageNumber), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresTillId, [ toId, fromPageNumber, browseOptions, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresSinceId, [ fromId, toPageNumber, browseOptions, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresBetweenIds, [ fromId, toId, fromPageNumber, toPageNumber, browseOptions, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenPages(fromPageNumber_1, toPageNumber_1, browseOptions_1, action_1) {
            return Browse_awaiter(this, arguments, void 0, (function*(fromPageNumber, toPageNumber, browseOptions, action, delay = 100) {
                return fromPageNumber = convertToNumber(fromPageNumber), toPageNumber = convertToNumber(toPageNumber), 
                null == fromPageNumber || fromPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresTillPage, [ toPageNumber, browseOptions, this._semaphore ], action, delay, !0) : null == toPageNumber || toPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresSincePage, [ fromPageNumber, browseOptions, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFiguresBetweenPages, [ fromPageNumber, toPageNumber, browseOptions, this._semaphore ], action, delay, !0);
            }));
        }
        getFigures(pageNumber_1, browseOptions_1, action_1) {
            return Browse_awaiter(this, arguments, void 0, (function*(pageNumber, browseOptions, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(SearchRequests.getBrowseFigures, [ pageNumber, browseOptions, this._semaphore ], action, delay);
            }));
        }
        getPage(pageNumber_1, browseOptions_1, action_1) {
            return Browse_awaiter(this, arguments, void 0, (function*(pageNumber, browseOptions, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(Page.getBrowsePage, [ pageNumber, browseOptions, this._semaphore ], action, delay);
            }));
        }
    }
    class BrowseOptions {
        constructor() {
            this.category = BrowseOptions.category.all, this.type = BrowseOptions.type.all, 
            this.species = BrowseOptions.species.any, this.gender = BrowseOptions.gender.any, 
            this.results = BrowseOptions.results[72], this.ratingGeneral = !0, this.ratingMature = !0, 
            this.ratingAdult = !0;
        }
        static get category() {
            return {
                all: 1,
                "artwork-digital": 2,
                "artwork-traditional": 3,
                "cel-shading": 4,
                crafting: 5,
                designs: 6,
                flash: 7,
                fursuiting: 8,
                icons: 9,
                mosaics: 10,
                photography: 11,
                "food-recipes": 32,
                sculpting: 12,
                story: 13,
                poetry: 14,
                prose: 15,
                music: 16,
                podcasts: 17,
                skins: 18,
                handhelds: 19,
                resources: 20,
                adoptables: 21,
                auctions: 22,
                contests: 23,
                "current-events": 24,
                desktops: 25,
                stockart: 26,
                screenshots: 27,
                scraps: 28,
                wallpaper: 29,
                "ych-sale": 30,
                other: 31
            };
        }
        static get type() {
            return {
                all: 1,
                abstract: 2,
                "animal-related-non-anthro": 3,
                anime: 4,
                comics: 5,
                doodle: 6,
                fanart: 7,
                fantasy: 8,
                human: 9,
                portraits: 10,
                scenery: 11,
                "still-life": 12,
                tutorials: 13,
                miscellaneous: 14,
                "baby-fur": 101,
                bondage: 102,
                digimon: 103,
                "fat-furs": 104,
                "fetish-other": 105,
                fursuit: 106,
                gore: 119,
                hyper: 107,
                hypnosis: 121,
                inflation: 108,
                micro: 109,
                muscle: 110,
                "my-little-pony": 111,
                paw: 112,
                pokemon: 113,
                pregnancy: 114,
                sonic: 115,
                transformation: 116,
                "tf-tg": 120,
                vore: 117,
                "water-sports": 118,
                "general-furry-art": 100,
                techno: 201,
                trance: 202,
                house: 203,
                "90s": 204,
                "80s": 205,
                "70s": 206,
                "60s": 207,
                "pre-60s": 208,
                classical: 209,
                "game-music": 210,
                rock: 211,
                pop: 212,
                rap: 213,
                industrial: 214,
                "other-music": 200
            };
        }
        static get species() {
            return {
                any: 1,
                "airborne-vehicle": 10001,
                alien: 5001,
                amphibian: 1e3,
                aquatic: 2e3,
                avian: 3e3,
                bear: 6002,
                bovine: 6007,
                canine: 6017,
                cervine: 6018,
                dog: 6010,
                dragon: 4e3,
                equine: 10009,
                exotic: 5e3,
                feline: 6030,
                fox: 6075,
                slime: 10007,
                "hybrid-species": 10002,
                inanimate: 10006,
                insect: 8003,
                "land-vehicle": 10003,
                mammal: 6e3,
                marsupial: 6042,
                mustelid: 6051,
                plant: 10008,
                primate: 6058,
                reptilian: 7e3,
                robot: 10004,
                rodent: 6067,
                "sea-vehicle": 10005,
                taur: 5025,
                vulpine: 6015,
                "original-species": 11014,
                character: 11015,
                aeromorph: 11001,
                "angel-dragon": 11002,
                avali: 11012,
                chakat: 5003,
                citra: 5005,
                crux: 5006,
                dracat: 5009,
                dutch: 11003,
                felkin: 11011,
                ferrin: 11004,
                jogauni: 11005,
                langurhali: 5014,
                nevrean: 11006,
                protogen: 11007,
                rexouium: 11016,
                sergal: 5021,
                synx: 11010,
                wickerbeast: 11013,
                yinglet: 11009,
                zorgoia: 11008,
                angel: 12001,
                centaur: 12002,
                cerberus: 12003,
                "shape-shifter": 12038,
                chimera: 12004,
                chupacabra: 12005,
                cockatrice: 12006,
                daemon: 5007,
                demon: 12007,
                "displacer-beast": 12008,
                dragonborn: 12009,
                drow: 12010,
                dwarf: 12011,
                "eastern-dragon": 4001,
                elf: 5011,
                gargoyle: 5012,
                goblin: 12012,
                golem: 12013,
                gryphon: 3007,
                harpy: 12014,
                hellhound: 12015,
                hippogriff: 12016,
                hobbit: 12017,
                hydra: 4002,
                imp: 12018,
                incubus: 12019,
                jackalope: 12020,
                kirin: 12021,
                kitsune: 12022,
                kobold: 12023,
                lamia: 12024,
                manticore: 12025,
                minotaur: 12026,
                naga: 5016,
                nephilim: 12027,
                orc: 5018,
                pegasus: 12028,
                peryton: 12029,
                phoenix: 3010,
                sasquatch: 12030,
                satyr: 5020,
                sphinx: 12031,
                succubus: 12032,
                tiefling: 12033,
                troll: 12034,
                unicorn: 5023,
                "water-dragon": 12035,
                werewolf: 12036,
                "western-dragon": 4004,
                wyvern: 4005,
                yokai: 12037,
                alicorn: 13001,
                argonian: 5002,
                asari: 13002,
                bangaa: 13003,
                "bubble-dragon": 13004,
                burmecian: 13005,
                charr: 13006,
                chiss: 13007,
                chocobo: 5004,
                deathclaw: 13008,
                digimon: 5008,
                draenei: 5010,
                drell: 13009,
                elcor: 13010,
                ewok: 13011,
                hanar: 13012,
                hrothgar: 13013,
                iksar: 5013,
                kaiju: 5015,
                kelpie: 13041,
                kemonomimi: 13014,
                khajiit: 13015,
                koopa: 13016,
                krogan: 13017,
                lombax: 13018,
                mimiga: 13019,
                mobian: 13020,
                moogle: 5017,
                neopet: 13021,
                "nu-mou": 13022,
                pokemon: 5019,
                "pony-mlp": 13023,
                protoss: 13024,
                quarian: 13025,
                ronso: 13026,
                salarian: 13027,
                sangheili: 13028,
                tauntaun: 13029,
                tauren: 13030,
                trandoshan: 13031,
                transformer: 13032,
                turian: 13033,
                twilek: 13034,
                viera: 13035,
                wookiee: 13036,
                xenomorph: 5024,
                yautja: 13037,
                yordle: 13038,
                yoshi: 13039,
                zerg: 13040,
                aardvark: 14001,
                aardwolf: 14002,
                "african-wild-dog": 14003,
                akita: 14004,
                albatross: 14005,
                crocodile: 7001,
                alpaca: 14006,
                anaconda: 14007,
                anteater: 14008,
                antelope: 6004,
                arachnid: 8e3,
                "arctic-fox": 14009,
                armadillo: 14010,
                axolotl: 14011,
                baboon: 14012,
                badger: 6045,
                bat: 6001,
                beaver: 6064,
                bee: 14013,
                binturong: 14014,
                bison: 14015,
                "blue-jay": 14016,
                "border-collie": 14017,
                "brown-bear": 14018,
                buffalo: 14019,
                "buffalo-bison": 14020,
                "bull-terrier": 14021,
                butterfly: 14022,
                caiman: 14023,
                camel: 6074,
                capybara: 14024,
                caribou: 14025,
                caterpillar: 14026,
                cephalopod: 2001,
                chameleon: 14027,
                cheetah: 6021,
                chicken: 14028,
                chimpanzee: 14029,
                chinchilla: 14030,
                chipmunk: 14031,
                civet: 14032,
                "clouded-leopard": 14033,
                coatimundi: 14034,
                cockatiel: 14035,
                corgi: 14036,
                corvid: 3001,
                cougar: 6022,
                cow: 6003,
                coyote: 6008,
                crab: 14037,
                crane: 14038,
                crayfish: 14039,
                crow: 3002,
                crustacean: 14040,
                dalmatian: 14041,
                deer: 14042,
                dhole: 14043,
                dingo: 6011,
                dinosaur: 8001,
                doberman: 6009,
                dolphin: 2002,
                donkey: 6019,
                duck: 3003,
                eagle: 3004,
                eel: 14044,
                elephant: 14045,
                falcon: 3005,
                fennec: 6072,
                ferret: 6046,
                finch: 14046,
                fish: 2005,
                flamingo: 14047,
                fossa: 14048,
                frog: 1001,
                gazelle: 6005,
                gecko: 7003,
                genet: 14049,
                "german-shepherd": 6012,
                gibbon: 14050,
                giraffe: 6031,
                goat: 6006,
                goose: 3006,
                gorilla: 6054,
                "gray-fox": 14051,
                "great-dane": 14052,
                "grizzly-bear": 14053,
                "guinea-pig": 14054,
                hamster: 14055,
                hawk: 3008,
                hedgehog: 6032,
                heron: 14056,
                hippopotamus: 6033,
                honeybee: 14057,
                horse: 6034,
                housecat: 6020,
                human: 6055,
                humanoid: 14058,
                hummingbird: 14059,
                husky: 6014,
                hyena: 6035,
                iguana: 7004,
                impala: 14060,
                jackal: 6013,
                jaguar: 6023,
                kangaroo: 6038,
                "kangaroo-mouse": 14061,
                "kangaroo-rat": 14062,
                kinkajou: 14063,
                "kit-fox": 14064,
                koala: 6039,
                "kodiak-bear": 14065,
                "komodo-dragon": 14066,
                labrador: 14067,
                lemur: 6056,
                leopard: 6024,
                liger: 14068,
                linsang: 14069,
                lion: 6025,
                lizard: 7005,
                llama: 6036,
                lobster: 14070,
                "longhair-cat": 14071,
                lynx: 6026,
                magpie: 14072,
                "maine-coon": 14073,
                malamute: 14074,
                "mammal-feline": 14075,
                "mammal-herd": 14076,
                "mammal-marsupial": 14077,
                "mammal-mustelid": 14078,
                "mammal-other predator": 14079,
                "mammal-prey": 14080,
                "mammal-primate": 14081,
                "mammal-rodent": 14082,
                manatee: 14083,
                mandrill: 14084,
                "maned-wolf": 14085,
                mantid: 8004,
                marmoset: 14086,
                marten: 14087,
                meerkat: 6043,
                mink: 6048,
                mole: 14088,
                mongoose: 6044,
                "monitor-lizard": 14089,
                monkey: 6057,
                moose: 14090,
                moth: 14091,
                mouse: 6065,
                "musk-deer": 14092,
                "musk-ox": 14093,
                newt: 1002,
                ocelot: 6027,
                octopus: 14094,
                okapi: 14095,
                olingo: 14096,
                opossum: 6037,
                orangutan: 14097,
                orca: 14098,
                oryx: 14099,
                ostrich: 14100,
                otter: 6047,
                owl: 3009,
                panda: 6052,
                pangolin: 14101,
                panther: 6028,
                parakeet: 14102,
                parrot: 14103,
                peacock: 14104,
                penguin: 14105,
                "persian-cat": 14106,
                pig: 6053,
                pigeon: 14107,
                pika: 14108,
                "pine-marten": 14109,
                platypus: 14110,
                "polar-bear": 14111,
                pony: 6073,
                poodle: 14112,
                porcupine: 14113,
                porpoise: 2004,
                procyonid: 14114,
                puffin: 14115,
                quoll: 6040,
                rabbit: 6059,
                raccoon: 6060,
                rat: 6061,
                ray: 14116,
                "red-fox": 14117,
                "red-panda": 6062,
                reindeer: 14118,
                reptillian: 14119,
                rhinoceros: 6063,
                robin: 14120,
                rottweiler: 14121,
                sabercats: 14122,
                sabertooth: 14123,
                salamander: 1003,
                scorpion: 8005,
                seagull: 14124,
                seahorse: 14125,
                seal: 6068,
                "secretary-bird": 14126,
                "serpent-dragon": 4003,
                serval: 14127,
                shark: 2006,
                sheep: 14128,
                "shiba-inu": 14129,
                "shorthair-cat": 14130,
                shrew: 14131,
                siamese: 14132,
                sifaka: 14133,
                "silver-fox": 14134,
                skunk: 6069,
                sloth: 14135,
                snail: 14136,
                "snake-serpent": 7006,
                "snow-leopard": 14137,
                sparrow: 14138,
                squid: 14139,
                squirrel: 6070,
                stoat: 14140,
                stork: 14141,
                "sugar-glider": 14142,
                "sun-bear": 14143,
                swan: 3011,
                "swift-fox": 14144,
                tanuki: 5022,
                tapir: 14145,
                "tasmanian-devil": 14146,
                thylacine: 14147,
                tiger: 6029,
                toucan: 14148,
                turtle: 7007,
                vulture: 14149,
                wallaby: 6041,
                walrus: 14150,
                wasp: 14151,
                weasel: 6049,
                whale: 2003,
                wolf: 6016,
                wolverine: 6050,
                zebra: 6071
            };
        }
        static get gender() {
            return {
                any: 0,
                male: 2,
                female: 3,
                herm: 4,
                intersex: 11,
                "trans-male": 8,
                "trans-female": 9,
                "non-binary": 10,
                multiple: 6,
                other: 7,
                "not-specified": 7
            };
        }
        static get results() {
            return {
                24: 24,
                48: 48,
                72: 72,
                96: 96,
                128: 128
            };
        }
    }
    function CheckTags(element) {
        var _a;
        if (!("1" === document.body.getAttribute("data-user-logged-in"))) return;
        const tagsHideMissingTags = "1" === document.body.getAttribute("data-tag-blocklist-hide-tagless"), tags = null === (_a = element.getAttribute("data-tags")) || void 0 === _a ? void 0 : _a.trim().split(/\s+/);
        let blockReason = "";
        if (null != tags && tags.length > 0 && "" !== tags[0]) {
            const blockedTags = function getBannedTags(tags) {
                var _a;
                const tagsBlocklist = null !== (_a = document.body.getAttribute("data-tag-blocklist")) && void 0 !== _a ? _a : [];
                let bTags = [];
                if (null == tags || 0 === tags.length) return [];
                for (const tag of tags) for (const blockedTag of tagsBlocklist) tag === blockedTag && bTags.push(blockedTag);
                return [ ...new Set(bTags) ];
            }(tags);
            if (blockedTags.length <= 0) setBlockedState(element, !1); else {
                setBlockedState(element, !0), blockReason = "Blocked tags:\n";
                for (const tag of blockedTags) blockReason += "• " + tag + "\n";
            }
        } else setBlockedState(element, tagsHideMissingTags), tagsHideMissingTags && (blockReason = "Content is missing tags.");
        "" !== blockReason && "submissionImg" !== element.id && element.setAttribute("title", blockReason);
    }
    function setBlockedState(element, isBlocked) {
        element.classList[isBlocked ? "add" : "remove"]("blocked-content");
    }
    function CheckTagsAll(doc) {
        if (null == doc) return;
        doc.querySelectorAll("img[data-tags]").forEach((element => CheckTags(element)));
    }
    var Page_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class Page {
        static getGalleryPage(username, folderId, pageNumber, galleryType, semaphore) {
            return Page_awaiter(this, void 0, void 0, (function*() {
                if (galleryType === GalleryType.FAVORITES) {
                    const dataFavId = null != folderId ? folderId : pageNumber;
                    return yield Page.getFavoritesPage(username, dataFavId, pageNumber, semaphore);
                }
                if (galleryType === GalleryType.JOURNALS) return yield Page.getJournalsPage(username, pageNumber, semaphore);
                if (galleryType === GalleryType.BROWSE) return yield Page.getBrowsePage(pageNumber, void 0, semaphore);
                if (galleryType === GalleryType.SEARCH) return yield Page.getSearchPage(pageNumber, void 0, semaphore);
                if (null == username) return void Logger.logError("No username given");
                let url;
                switch ((null == pageNumber || pageNumber <= 0) && (Logger.logWarning("No page number given. Using default value of 1."), 
                pageNumber = 1), username.endsWith("/") || (username += "/"), galleryType) {
                  case GalleryType.GALLERY:
                    url = Gallery.hardLink + username;
                    break;

                  case GalleryType.SCRAPS:
                    url = Scraps.hardLink + username;
                }
                null != folderId && -1 !== folderId && (url += `folder/${folderId}/`);
                const page = yield FuraffinityRequests.getHTML(url + pageNumber, semaphore);
                return CheckTagsAll(page), page;
            }));
        }
        static getFavoritesPage(username, dataFavId, direction, semaphore) {
            return Page_awaiter(this, void 0, void 0, (function*() {
                if (null == username) return void Logger.logError("No username given");
                null == direction && (Logger.logWarning("No direction given. Using default 1 instead."), 
                direction = 1), username.endsWith("/") || (username += "/");
                let url = Favorites.hardLink;
                null != dataFavId && dataFavId >= 0 ? url += `${username}${dataFavId}/` : (Logger.logWarning("No last data fav id given. Using default 1 instead."), 
                url += username), url += direction >= 0 ? "next/" : "prev/";
                const page = yield FuraffinityRequests.getHTML(url, semaphore);
                return CheckTagsAll(page), page;
            }));
        }
        static getJournalsPage(username, pageNumber, semaphore) {
            return Page_awaiter(this, void 0, void 0, (function*() {
                if (null == username) return void Logger.logError("No username given");
                (null == pageNumber || pageNumber <= 0) && (Logger.logWarning("Page number must be greater than 0. Using default 1 instead."), 
                pageNumber = 1), username.endsWith("/") || (username += "/");
                const url = Journals.hardLink + username;
                return yield FuraffinityRequests.getHTML(url + pageNumber, semaphore);
            }));
        }
        static getBrowsePage(pageNumber, browseOptions, semaphore) {
            return Page_awaiter(this, void 0, void 0, (function*() {
                (null == pageNumber || pageNumber <= 0) && (Logger.logWarning("Page number must be greater than 0. Using default 1 instead."), 
                pageNumber = 1), null == browseOptions && (browseOptions = new BrowseOptions);
                const payload = {
                    cat: browseOptions.category,
                    atype: browseOptions.type,
                    species: browseOptions.species,
                    gender: browseOptions.gender,
                    perpage: browseOptions.results,
                    page: pageNumber,
                    rating_general: browseOptions.ratingGeneral ? "on" : "off",
                    rating_mature: browseOptions.ratingMature ? "on" : "off",
                    rating_adult: browseOptions.ratingAdult ? "on" : "off"
                };
                for (const key in payload) null != payload[key] && 0 !== payload[key] && "off" !== payload[key] || delete payload[key];
                const payloadArray = Object.entries(payload).map((([key, value]) => {
                    var _a;
                    return [ key, null !== (_a = null == value ? void 0 : value.toString()) && void 0 !== _a ? _a : "" ];
                })), url = Browse.hardLink, page = yield FuraffinityRequests.postHTML(url, payloadArray, semaphore);
                return CheckTagsAll(page), page;
            }));
        }
        static getSearchPage(pageNumber, searchOptions, semaphore) {
            return Page_awaiter(this, void 0, void 0, (function*() {
                (null == pageNumber || pageNumber <= 0) && (Logger.logWarning("Page number must be greater than 0. Using default 1 instead."), 
                pageNumber = 1), null == searchOptions && (searchOptions = new SearchOptions);
                const payload = {
                    page: pageNumber,
                    q: searchOptions.input,
                    "order-by": searchOptions.orderBy,
                    "order-direction": searchOptions.orderDirection,
                    range: searchOptions.range,
                    range_from: void 0,
                    range_to: void 0,
                    "rating-general": searchOptions.ratingGeneral ? 1 : 0,
                    "rating-mature": searchOptions.ratingMature ? 1 : 0,
                    "rating-adult": searchOptions.ratingAdult ? 1 : 0,
                    "type-art": searchOptions.typeArt ? 1 : 0,
                    "type-music": searchOptions.typeMusic ? 1 : 0,
                    "type-flash": searchOptions.typeFlash ? 1 : 0,
                    "type-story": searchOptions.typeStory ? 1 : 0,
                    "type-photos": searchOptions.typePhotos ? 1 : 0,
                    "type-poetry": searchOptions.typePoetry ? 1 : 0,
                    mode: searchOptions.matching
                };
                if (searchOptions.rangeFrom instanceof Date && null != searchOptions.rangeFrom) {
                    const formattedDate = `${searchOptions.rangeFrom.getFullYear()}-${(searchOptions.rangeFrom.getMonth() + 1).toString().padStart(2, "0")}-${searchOptions.rangeFrom.getDate().toString().padStart(2, "0")}`;
                    payload.range_from = formattedDate;
                } else "string" == typeof searchOptions.rangeFrom && searchOptions.rangeFrom && (payload.range_from = searchOptions.rangeFrom);
                if (searchOptions.rangeTo instanceof Date && null != searchOptions.rangeTo) {
                    const formattedDate = `${searchOptions.rangeTo.getFullYear()}-${(searchOptions.rangeTo.getMonth() + 1).toString().padStart(2, "0")}-${searchOptions.rangeTo.getDate().toString().padStart(2, "0")}`;
                    payload.range_to = formattedDate;
                } else "string" == typeof searchOptions.rangeTo && searchOptions.rangeTo && (payload.range_to = searchOptions.rangeTo);
                for (const key in payload) null != payload[key] && 0 !== payload[key] && "off" !== payload[key] || delete payload[key];
                const payloadArray = Object.entries(payload).map((([key, value]) => {
                    var _a;
                    return [ key, null !== (_a = null == value ? void 0 : value.toString()) && void 0 !== _a ? _a : "" ];
                })), url = Search.hardLink, page = yield FuraffinityRequests.postHTML(url, payloadArray, semaphore);
                return CheckTagsAll(page), page;
            }));
        }
    }
    var Gallery_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class Gallery {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLink() {
            return FuraffinityRequests.fullUrl + "/gallery/";
        }
        getFiguresBetweenIds(username_1, fromId_1, toId_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, fromId, toId, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillId, [ username, void 0, toId, void 0, GalleryType.GALLERY, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSinceId, [ username, void 0, fromId, void 0, GalleryType.GALLERY, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenIds, [ username, void 0, fromId, toId, void 0, void 0, GalleryType.GALLERY, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresInFolderBetweenIds(username_1, folderId_1, fromId_1, toId_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, folderId, fromId, toId, action, delay = 100) {
                return folderId = convertToNumber(folderId), fromId = convertToNumber(fromId), toId = convertToNumber(toId), 
                null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillId, [ username, folderId, toId, void 0, GalleryType.GALLERY, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSinceId, [ username, folderId, fromId, void 0, GalleryType.GALLERY, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenIds, [ username, folderId, fromId, toId, void 0, void 0, GalleryType.GALLERY, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenIdsBetweenPages(username_1, fromId_1, toId_1, fromPageNumber_1, toPageNumber_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, fromId, toId, fromPageNumber, toPageNumber, action, delay = 100) {
                return fromId = convertToNumber(fromId), toId = convertToNumber(toId), fromPageNumber = convertToNumber(fromPageNumber), 
                toPageNumber = convertToNumber(toPageNumber), null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillId, [ username, void 0, toId, fromPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSinceId, [ username, void 0, fromId, toPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenIds, [ username, void 0, fromId, toId, fromPageNumber, toPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresInFolderBetweenIdsBetweenPages(username_1, folderId_1, fromId_1, toId_1, fromPageNumber_1, toPageNumber_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, folderId, fromId, toId, fromPageNumber, toPageNumber, action, delay = 100) {
                return folderId = convertToNumber(folderId), fromId = convertToNumber(fromId), toId = convertToNumber(toId), 
                fromPageNumber = convertToNumber(fromPageNumber), toPageNumber = convertToNumber(toPageNumber), 
                null == fromId || fromId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillId, [ username, folderId, toId, fromPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay) : null == toId || toId <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSinceId, [ username, folderId, fromId, toPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenIds, [ username, folderId, fromId, toId, fromPageNumber, toPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresBetweenPages(username_1, fromPageNumber_1, toPageNumber_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, fromPageNumber, toPageNumber, action, delay = 100) {
                return fromPageNumber = convertToNumber(fromPageNumber), toPageNumber = convertToNumber(toPageNumber), 
                null == fromPageNumber || fromPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillPage, [ username, void 0, toPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay, !0) : null == toPageNumber || toPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSincePage, [ username, void 0, fromPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenPages, [ username, void 0, fromPageNumber, toPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay, !0);
            }));
        }
        getFiguresInFolderBetweenPages(username_1, folderId_1, fromPageNumber_1, toPageNumber_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, folderId, fromPageNumber, toPageNumber, action, delay = 100) {
                return folderId = convertToNumber(folderId), fromPageNumber = convertToNumber(fromPageNumber), 
                toPageNumber = convertToNumber(toPageNumber), null == fromPageNumber || fromPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresTillPage, [ username, folderId, toPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay, !0) : null == toPageNumber || toPageNumber <= 0 ? yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresSincePage, [ username, folderId, fromPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay) : yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFiguresBetweenPages, [ username, folderId, fromPageNumber, toPageNumber, GalleryType.GALLERY, this._semaphore ], action, delay, !0);
            }));
        }
        getFigures(username_1, pageNumber_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, pageNumber, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFigures, [ username, void 0, pageNumber, GalleryType.GALLERY, this._semaphore ], action, delay);
            }));
        }
        getFiguresInFolder(username_1, folderId_1, pageNumber_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, folderId, pageNumber, action, delay = 100) {
                return folderId = convertToNumber(folderId), pageNumber = convertToNumber(pageNumber), 
                yield WaitAndCallAction.callFunctionAsync(GalleryRequests.getGalleryFigures, [ username, folderId, pageNumber, GalleryType.GALLERY, this._semaphore ], action, delay);
            }));
        }
        getPage(username_1, pageNumber_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, pageNumber, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(Page.getGalleryPage, [ username, void 0, pageNumber, GalleryType.GALLERY, this._semaphore ], action, delay);
            }));
        }
        getPageInFolder(username_1, folderId_1, pageNumber_1, action_1) {
            return Gallery_awaiter(this, arguments, void 0, (function*(username, folderId, pageNumber, action, delay = 100) {
                return folderId = convertToNumber(folderId), pageNumber = convertToNumber(pageNumber), 
                yield WaitAndCallAction.callFunctionAsync(Page.getGalleryPage, [ username, folderId, pageNumber, GalleryType.GALLERY, this._semaphore ], action, delay);
            }));
        }
    }
    var GalleryType, GalleryRequests_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class GalleryRequests {
        constructor(semaphore) {
            this._semaphore = semaphore, this.Gallery = new Gallery(this._semaphore), this.Scraps = new Scraps(this._semaphore), 
            this.Favorites = new Favorites(this._semaphore), this.Journals = new Journals(this._semaphore);
        }
        static getGalleryFiguresTillId(username, folderId, toId, fromPage, galleryType, semaphore) {
            return GalleryRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
                const allFigures = [];
                let running = !0, i = 1;
                for (null != fromPage && fromPage >= 1 && (i = fromPage); running; ) {
                    const figures = yield GalleryRequests.getGalleryFigures(username, folderId, i, galleryType, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : IdArray.containsId(figures, toId) ? (allFigures.push(IdArray.getTillId(figures, toId)), 
                    running = !1) : (allFigures.push(figures), i++);
                }
                return allFigures;
            }));
        }
        static getGalleryFiguresSinceId(username, folderId, fromId, toPage, galleryType, semaphore) {
            return GalleryRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
                const direction = null == toPage || toPage <= 0 ? -1 : 1;
                let lastFigureId, running = !0, i = null == toPage || toPage <= 0 ? 1 : toPage;
                if (null == toPage || toPage <= 0) for (;running; ) {
                    const figures = yield GalleryRequests.getGalleryFigures(username, folderId, i, galleryType, semaphore);
                    let currFigureId = lastFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), currFigureId === lastFigureId || IdArray.containsId(figures, fromId) ? running = !1 : i++;
                }
                const allFigures = [];
                for (lastFigureId = void 0, running = !0; running; ) {
                    const figures = yield GalleryRequests.getGalleryFigures(username, folderId, i, galleryType, semaphore);
                    let currFigureId = lastFigureId;
                    if (0 !== figures.length && (currFigureId = figures[0].id), currFigureId === lastFigureId) running = !1; else {
                        if (IdArray.containsId(figures, fromId)) {
                            const figuresPush = IdArray.getSinceId(figures, fromId);
                            direction < 0 && (figuresPush.reverse(), running = !1), allFigures.push(figuresPush);
                        } else direction < 0 && figures.reverse(), allFigures.push(figures);
                        i += direction;
                    }
                }
                return direction < 0 && allFigures.reverse(), allFigures;
            }));
        }
        static getGalleryFiguresBetweenIds(username, folderId, fromId, toId, fromPage, toPage, galleryType, semaphore, percentId) {
            return GalleryRequests_awaiter(this, void 0, void 0, (function*() {
                if (null == fromId || fromId <= 0) return Logger.logError("No fromId given"), [];
                if (null == toId || toId <= 0) return Logger.logError("No toId given"), [];
                (null == fromPage || fromPage <= 0 || null == toPage || toPage <= 1) && (Logger.logWarning("No fromPage or toPage given. Percentages can not be calculated."), 
                percentId = void 0);
                let i = 1;
                null != fromPage && fromPage >= 1 && (i = fromPage);
                const allFigures = [];
                let running = !0, completedPages = 0;
                for (;running; ) {
                    null != toPage && toPage >= 1 && i >= toPage && (running = !1);
                    const figures = yield GalleryRequests.getGalleryFigures(username, folderId, i, galleryType, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : (IdArray.containsId(figures, fromId) && allFigures.push(IdArray.getSinceId(figures, fromId)), 
                    IdArray.containsId(figures, toId) ? (allFigures.push(IdArray.getBetweenIds(figures, fromId, toId)), 
                    running = !1) : (allFigures.push(figures), i++)), completedPages++, null != toPage && toPage >= 1 && PercentHelper.updatePercentValue(percentId, completedPages, toPage);
                }
                return allFigures;
            }));
        }
        static getGalleryFiguresTillPage(username, folderId, toPageNumber, galleryType, semaphore, percentId) {
            return GalleryRequests_awaiter(this, void 0, void 0, (function*() {
                (null == toPageNumber || toPageNumber <= 0) && (Logger.logWarning("toPageNumber must be greater than 0. Using default 1 instead."), 
                toPageNumber = 1);
                const allFigures = [];
                let completedPages = 0;
                for (let i = 1; i <= toPageNumber; i++) {
                    const figures = yield GalleryRequests.getGalleryFigures(username, folderId, i, galleryType, semaphore);
                    0 !== figures.length && allFigures.push(figures), completedPages++, PercentHelper.updatePercentValue(percentId, completedPages, toPageNumber);
                }
                return allFigures;
            }));
        }
        static getGalleryFiguresSincePage(username, folderId, fromPageNumber, galleryType, semaphore) {
            return GalleryRequests_awaiter(this, void 0, void 0, (function*() {
                (null == fromPageNumber || fromPageNumber <= 0) && (Logger.logWarning("fromPageNumber must be greater than 0. Using default 1 instead."), 
                fromPageNumber = 1);
                const allFigures = [];
                let running = !0, i = fromPageNumber;
                for (;running; ) {
                    const figures = yield GalleryRequests.getGalleryFigures(username, folderId, i, galleryType, semaphore);
                    let currFigureId;
                    0 !== figures.length && (currFigureId = figures[0].id), undefined === currFigureId ? running = !1 : (allFigures.push(figures), 
                    i++);
                }
                return allFigures;
            }));
        }
        static getGalleryFiguresBetweenPages(username, folderId, fromPageNumber, toPageNumber, galleryType, semaphore, percentId) {
            return GalleryRequests_awaiter(this, void 0, void 0, (function*() {
                (null == fromPageNumber || fromPageNumber <= 0) && (Logger.logWarning("fromPageNumber must be greater than 0. Using default 1 instead."), 
                fromPageNumber = 1), (null == toPageNumber || toPageNumber <= 0) && (Logger.logError("toPageNumber must be greater than 0. Using default 1 instead."), 
                toPageNumber = 1);
                const allFigures = [], direction = fromPageNumber <= toPageNumber ? 1 : -1, totalPages = Math.abs(toPageNumber - fromPageNumber) + 1;
                let completedPages = 0;
                for (let i = fromPageNumber; i <= toPageNumber; i += direction) {
                    const figures = yield GalleryRequests.getGalleryFigures(username, folderId, i, galleryType, semaphore);
                    0 !== figures.length && allFigures.push(figures), completedPages++, PercentHelper.updatePercentValue(percentId, completedPages, totalPages);
                }
                return allFigures;
            }));
        }
        static getGalleryFigures(username, folderId, pageNumber, galleryType, semaphore) {
            return GalleryRequests_awaiter(this, void 0, void 0, (function*() {
                (null == pageNumber || pageNumber <= 0) && (Logger.logWarning("No pageNumber given. Using default value of 1."), 
                pageNumber = 1);
                const galleryDoc = yield Page.getGalleryPage(username, folderId, pageNumber, galleryType, semaphore);
                if (!galleryDoc || !(galleryDoc instanceof Document) || galleryDoc.getElementById("no-images")) return Logger.logMessage(`No images found at ${galleryType} of "${username}" on page "${pageNumber}".`), 
                [];
                const figures = galleryDoc.getElementsByTagName("figure");
                return null == figures || 0 === figures.length ? (Logger.logMessage(`No figures found at ${galleryType} of "${username}" on page "${pageNumber}".`), 
                []) : Array.from(figures);
            }));
        }
    }
    !function(GalleryType) {
        GalleryType.GALLERY = "gallery", GalleryType.FAVORITES = "favorites", GalleryType.SCRAPS = "scraps", 
        GalleryType.JOURNALS = "journals", GalleryType.BROWSE = "browse", GalleryType.SEARCH = "search";
    }(GalleryType || (GalleryType = {}));
    var UserRequests_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class UserRequests {
        constructor(semaphore) {
            this._semaphore = semaphore, this.GalleryRequests = new GalleryRequests(this._semaphore), 
            this.SearchRequests = new SearchRequests(this._semaphore);
        }
        static get hardLinks() {
            return {
                user: FuraffinityRequests.fullUrl + "/user/",
                watch: FuraffinityRequests.fullUrl + "/watch/",
                unwatch: FuraffinityRequests.fullUrl + "/unwatch/",
                block: FuraffinityRequests.fullUrl + "/block/",
                unblock: FuraffinityRequests.fullUrl + "/unblock/"
            };
        }
        getUserPage(username_1, action_1) {
            return UserRequests_awaiter(this, arguments, void 0, (function*(username, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(getUserPageLocal, [ username, this._semaphore ], action, delay);
            }));
        }
        watchUser(username_1, watchKey_1, action_1) {
            return UserRequests_awaiter(this, arguments, void 0, (function*(username, watchKey, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(watchUserLocal, [ username, watchKey, this._semaphore ], action, delay);
            }));
        }
        unwatchUser(username_1, unwatchKey_1, action_1) {
            return UserRequests_awaiter(this, arguments, void 0, (function*(username, unwatchKey, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(unwatchUserLocal, [ username, unwatchKey, this._semaphore ], action, delay);
            }));
        }
        blockUser(username_1, blockKey_1, action_1) {
            return UserRequests_awaiter(this, arguments, void 0, (function*(username, blockKey, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(blockUserLocal, [ username, blockKey, this._semaphore ], action, delay);
            }));
        }
        unblockUser(username_1, unblockKey_1, action_1) {
            return UserRequests_awaiter(this, arguments, void 0, (function*(username, unblockKey, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(unblockUserLocal, [ username, unblockKey, this._semaphore ], action, delay);
            }));
        }
    }
    function getUserPageLocal(username, semaphore) {
        return UserRequests_awaiter(this, void 0, void 0, (function*() {
            if (null == username) return void Logger.logWarning("No username given");
            const url = UserRequests.hardLinks.user + username;
            return yield FuraffinityRequests.getHTML(url, semaphore);
        }));
    }
    function watchUserLocal(username, watchKey, semaphore) {
        return UserRequests_awaiter(this, void 0, void 0, (function*() {
            if (null == username || "" === username) return Logger.logError("No username given"), 
            !1;
            if (null == watchKey || "" === watchKey || -1 === watchKey) return Logger.logError("No watch key given"), 
            !1;
            const url = UserRequests.hardLinks.watch + username + "?key=" + watchKey;
            return null == (yield FuraffinityRequests.getHTML(url, semaphore));
        }));
    }
    function unwatchUserLocal(username, unwatchKey, semaphore) {
        return UserRequests_awaiter(this, void 0, void 0, (function*() {
            if (null == username || "" === username) return Logger.logError("No username given"), 
            !1;
            if (null == unwatchKey || "" === unwatchKey || -1 === unwatchKey) return Logger.logError("No unwatch key given"), 
            !1;
            const url = UserRequests.hardLinks.unwatch + username + "?key=" + unwatchKey;
            return null == (yield FuraffinityRequests.getHTML(url, semaphore));
        }));
    }
    function blockUserLocal(username, blockKey, semaphore) {
        return UserRequests_awaiter(this, void 0, void 0, (function*() {
            if (null == username || "" === username) return Logger.logError("No username given"), 
            !1;
            if (null == blockKey || "" === blockKey || -1 === blockKey) return Logger.logError("No block key given"), 
            !1;
            const url = UserRequests.hardLinks.block + username + "?key=" + blockKey;
            return null == (yield FuraffinityRequests.getHTML(url, semaphore));
        }));
    }
    function unblockUserLocal(username, unblockKey, semaphore) {
        return UserRequests_awaiter(this, void 0, void 0, (function*() {
            if (null == username || "" === username) return Logger.logError("No username given"), 
            !1;
            if (null == unblockKey || "" === unblockKey || -1 === unblockKey) return Logger.logError("No unblock key given"), 
            !1;
            const url = UserRequests.hardLinks.unblock + username + "?key=" + unblockKey;
            return null == (yield FuraffinityRequests.getHTML(url, semaphore));
        }));
    }
    var NewSubmissions_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class NewSubmissions {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLink() {
            return FuraffinityRequests.fullUrl + "/msg/submissions/";
        }
        getSubmissionsPage(firstSubmissionId_1, action_1) {
            return NewSubmissions_awaiter(this, arguments, void 0, (function*(firstSubmissionId, action, delay = 100) {
                return firstSubmissionId = convertToNumber(firstSubmissionId), yield WaitAndCallAction.callFunctionAsync(getSubmissionsPageLocal, [ firstSubmissionId, this._semaphore ], action, delay);
            }));
        }
        removeSubmissions(submissionIds_1, action_1) {
            return NewSubmissions_awaiter(this, arguments, void 0, (function*(submissionIds, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(removeSubmissionsLocal, [ submissionIds, this._semaphore ], action, delay);
            }));
        }
        nukeSubmissions(action_1) {
            return NewSubmissions_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(nukeSubmissionsLocal, [ this._semaphore ], action, delay);
            }));
        }
    }
    function getSubmissionsPageLocal(firstSubmissionId, semaphore) {
        return NewSubmissions_awaiter(this, void 0, void 0, (function*() {
            return null == firstSubmissionId || firstSubmissionId <= 0 ? yield FuraffinityRequests.getHTML(`${NewSubmissions.hardLink}new@72/`, semaphore) : yield FuraffinityRequests.getHTML(`${NewSubmissions.hardLink}new~${firstSubmissionId}@72/`, semaphore);
        }));
    }
    function removeSubmissionsLocal(submissionIds, semaphore) {
        return NewSubmissions_awaiter(this, void 0, void 0, (function*() {
            if (null == submissionIds || 0 === submissionIds.length) return void Logger.logError("No submission ids to remove");
            const payload = [ [ "messagecenter-action", Message.hardActions.remove ] ];
            for (const submissionId of submissionIds) payload.push([ "submissions", submissionId.toString() ]);
            return yield FuraffinityRequests.postHTML(`${NewSubmissions.hardLink}new@72/`, payload, semaphore);
        }));
    }
    function nukeSubmissionsLocal(semaphore) {
        return NewSubmissions_awaiter(this, void 0, void 0, (function*() {
            const payload = {
                "messagecenter-action": Message.hardActions.nuke
            }, payloadArray = Object.entries(payload).map((([key, value]) => {
                var _a;
                return [ key, null !== (_a = null == value ? void 0 : value.toString()) && void 0 !== _a ? _a : "" ];
            }));
            return yield FuraffinityRequests.postHTML(`${NewSubmissions.hardLink}new@72/`, payloadArray, semaphore);
        }));
    }
    class Message {
        constructor(semaphore) {
            this._semaphore = semaphore, this.NewSubmissions = new NewSubmissions(this._semaphore);
        }
        static get hardActions() {
            return {
                remove: "remove_checked",
                nuke: "nuke_notifications"
            };
        }
    }
    var AccountInformation_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class AccountInformation {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLinks() {
            return {
                settings: FuraffinityRequests.fullUrl + "/controls/settings/",
                siteSettings: FuraffinityRequests.fullUrl + "/controls/site-settings/",
                userSettings: FuraffinityRequests.fullUrl + "/controls/user-settings/"
            };
        }
        getSettingsPage(action_1) {
            return AccountInformation_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ AccountInformation.hardLinks.settings, this._semaphore ], action, delay);
            }));
        }
        getSiteSettingsPage(action_1) {
            return AccountInformation_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ AccountInformation.hardLinks.siteSettings, this._semaphore ], action, delay);
            }));
        }
        getUserSettingsPage(action_1) {
            return AccountInformation_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ AccountInformation.hardLinks.userSettings, this._semaphore ], action, delay);
            }));
        }
    }
    var UserProfile_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class UserProfile {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLinks() {
            return {
                profile: FuraffinityRequests.fullUrl + "/controls/profile/",
                profilebanner: FuraffinityRequests.fullUrl + "/controls/profilebanner/",
                contacts: FuraffinityRequests.fullUrl + "/controls/contacts/",
                avatar: FuraffinityRequests.fullUrl + "/controls/avatar/"
            };
        }
        getProfilePage(action_1) {
            return UserProfile_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ UserProfile.hardLinks.profile, this._semaphore ], action, delay);
            }));
        }
        getProfilebannerPage(action_1) {
            return UserProfile_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ UserProfile.hardLinks.profilebanner, this._semaphore ], action, delay);
            }));
        }
        getContactsPage(action_1) {
            return UserProfile_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ UserProfile.hardLinks.contacts, this._semaphore ], action, delay);
            }));
        }
        getAvatarPage(action_1) {
            return UserProfile_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ UserProfile.hardLinks.avatar, this._semaphore ], action, delay);
            }));
        }
    }
    var ManageContent_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class ManageContent {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLinks() {
            return {
                submissions: FuraffinityRequests.fullUrl + "/controls/submissions/",
                folders: FuraffinityRequests.fullUrl + "/controls/folders/submissions/",
                journals: FuraffinityRequests.fullUrl + "/controls/journal/",
                favorites: FuraffinityRequests.fullUrl + "/controls/favorites/",
                buddylist: FuraffinityRequests.fullUrl + "/controls/buddylist/",
                shouts: FuraffinityRequests.fullUrl + "/controls/shouts/",
                badges: FuraffinityRequests.fullUrl + "/controls/badges/"
            };
        }
        getFoldersPages(action_1) {
            return ManageContent_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ ManageContent.hardLinks.folders, this._semaphore ], action, delay);
            }));
        }
        getAllWatchesPages(action_1) {
            return ManageContent_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(getContentAllWatchesPagesLocal, [ this._semaphore ], action, delay);
            }));
        }
        getWatchesPage(pageNumber_1, action_1) {
            return ManageContent_awaiter(this, arguments, void 0, (function*(pageNumber, action, delay = 100) {
                return pageNumber = convertToNumber(pageNumber), yield WaitAndCallAction.callFunctionAsync(getWatchesPageLocal, [ pageNumber, this._semaphore ], action, delay);
            }));
        }
    }
    function getContentAllWatchesPagesLocal(semaphore) {
        return ManageContent_awaiter(this, void 0, void 0, (function*() {
            let usersDoc = yield FuraffinityRequests.getHTML(ManageContent.hardLinks.buddylist + "x", semaphore);
            const columnPage = null == usersDoc ? void 0 : usersDoc.getElementById("columnpage"), sectionBody = null == columnPage ? void 0 : columnPage.querySelector('div[class="section-body"'), pages = null == sectionBody ? void 0 : sectionBody.querySelectorAll(":scope > a"), userPageDocs = [];
            if (null != pages) for (let i = 1; i <= pages.length; i++) usersDoc = yield getWatchesPageLocal(i, semaphore), 
            usersDoc && userPageDocs.push(usersDoc);
            return userPageDocs;
        }));
    }
    function getWatchesPageLocal(pageNumber, semaphore) {
        return ManageContent_awaiter(this, void 0, void 0, (function*() {
            return (null == pageNumber || pageNumber <= 0) && (Logger.logWarning("No page number given. Using default 1 instead."), 
            pageNumber = 1), yield FuraffinityRequests.getHTML(ManageContent.hardLinks.buddylist + pageNumber, semaphore);
        }));
    }
    var Security_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class Security {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLinks() {
            return {
                sessions: FuraffinityRequests.fullUrl + "/controls/sessions/logins/",
                logs: FuraffinityRequests.fullUrl + "/controls/logs/",
                labels: FuraffinityRequests.fullUrl + "/controls/labels/"
            };
        }
        getSessionsPage(action_1) {
            return Security_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ Security.hardLinks.sessions, this._semaphore ], action, delay);
            }));
        }
        getLogsPage(action_1) {
            return Security_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ Security.hardLinks.logs, this._semaphore ], action, delay);
            }));
        }
        getLabelsPage(action_1) {
            return Security_awaiter(this, arguments, void 0, (function*(action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(FuraffinityRequests.getHTML, [ Security.hardLinks.labels, this._semaphore ], action, delay);
            }));
        }
    }
    class PersonalUserRequests {
        constructor(semaphore) {
            this._semaphore = semaphore, this.MessageRequests = new Message(this._semaphore), 
            this.AccountInformation = new AccountInformation(this._semaphore), this.UserProfile = new UserProfile(this._semaphore), 
            this.ManageContent = new ManageContent(this._semaphore), this.Security = new Security(this._semaphore);
        }
    }
    var SubmissionRequests_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class SubmissionRequests {
        constructor(semaphore) {
            this._semaphore = semaphore;
        }
        static get hardLinks() {
            return {
                view: FuraffinityRequests.fullUrl + "/view/",
                fav: FuraffinityRequests.fullUrl + "/fav/",
                unfav: FuraffinityRequests.fullUrl + "/unfav/",
                journal: FuraffinityRequests.fullUrl + "/journal/"
            };
        }
        getSubmissionPage(submissionId_1, action_1) {
            return SubmissionRequests_awaiter(this, arguments, void 0, (function*(submissionId, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(getSubmissionPageLocal, [ submissionId, this._semaphore ], action, delay);
            }));
        }
        favSubmission(submissionId_1, favKey_1, action_1) {
            return SubmissionRequests_awaiter(this, arguments, void 0, (function*(submissionId, favKey, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(favSubmissionLocal, [ submissionId, favKey, this._semaphore ], action, delay);
            }));
        }
        unfavSubmission(submissionId_1, unfavKey_1, action_1) {
            return SubmissionRequests_awaiter(this, arguments, void 0, (function*(submissionId, unfavKey, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(unfavSubmissionLocal, [ submissionId, unfavKey, this._semaphore ], action, delay);
            }));
        }
        getJournalPage(journalId_1, action_1) {
            return SubmissionRequests_awaiter(this, arguments, void 0, (function*(journalId, action, delay = 100) {
                return yield WaitAndCallAction.callFunctionAsync(getJournalPageLocal, [ journalId, this._semaphore ], action, delay);
            }));
        }
    }
    function getSubmissionPageLocal(submissionId, semaphore) {
        return SubmissionRequests_awaiter(this, void 0, void 0, (function*() {
            if (null == submissionId || "" === submissionId || -1 === submissionId) return void Logger.logError("No submissionId given");
            const url = SubmissionRequests.hardLinks.view + submissionId;
            return yield FuraffinityRequests.getHTML(url, semaphore);
        }));
    }
    function favSubmissionLocal(submissionId, favKey, semaphore) {
        return SubmissionRequests_awaiter(this, void 0, void 0, (function*() {
            var _a, _b;
            if (null == submissionId || "" === submissionId || -1 === submissionId) return void Logger.logError("No submissionId given");
            if (null == favKey || "" === favKey || -1 === favKey) return void Logger.logError("No favKey given");
            const url = SubmissionRequests.hardLinks.fav + submissionId + "?key=" + favKey, resultDoc = yield FuraffinityRequests.getHTML(url, semaphore);
            if (null != resultDoc) try {
                const standardpage = resultDoc.getElementById("standardpage");
                if (standardpage) {
                    const blocked = standardpage.querySelector('div[class="redirect-message"]');
                    if (null !== (_b = null === (_a = null == blocked ? void 0 : blocked.textContent) || void 0 === _a ? void 0 : _a.includes("blocked")) && void 0 !== _b && _b) return;
                }
                return getFavKeyLocal(resultDoc);
            } catch (_c) {}
        }));
    }
    function unfavSubmissionLocal(submissionId, unfavKey, semaphore) {
        return SubmissionRequests_awaiter(this, void 0, void 0, (function*() {
            if (null == submissionId || "" === submissionId || -1 === submissionId) return void Logger.logError("No submissionId given");
            if (null == unfavKey || "" === unfavKey || -1 === unfavKey) return void Logger.logError("No unfavKey given");
            const url = SubmissionRequests.hardLinks.unfav + submissionId + "?key=" + unfavKey, resultDoc = yield FuraffinityRequests.getHTML(url, semaphore);
            if (resultDoc) {
                return getFavKeyLocal(resultDoc);
            }
        }));
    }
    function getJournalPageLocal(journalId, semaphore) {
        return SubmissionRequests_awaiter(this, void 0, void 0, (function*() {
            if (null == journalId || "" === journalId || -1 === journalId) return void Logger.logError("No journalId given");
            const url = SubmissionRequests.hardLinks.journal + journalId;
            return yield FuraffinityRequests.getHTML(url, semaphore);
        }));
    }
    function getFavKeyLocal(doc) {
        var _a, _b, _c;
        const columnPage = doc.getElementById("columnpage"), navbar = null == columnPage ? void 0 : columnPage.querySelector('div[class*="favorite-nav"'), buttons = null == navbar ? void 0 : navbar.querySelectorAll('a[class*="button"][href]');
        if (!buttons || 0 === buttons.length) return;
        let favButton;
        for (const button of Array.from(buttons)) null !== (_b = null === (_a = null == button ? void 0 : button.textContent) || void 0 === _a ? void 0 : _a.toLowerCase().includes("fav")) && void 0 !== _b && _b && (favButton = button);
        if (null != favButton) {
            return null === (_c = favButton.getAttribute("href")) || void 0 === _c ? void 0 : _c.split("?key=")[1];
        }
    }
    var FuraffinityRequests_awaiter = function(thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))((function(resolve, reject) {
            function fulfilled(value) {
                try {
                    step(generator.next(value));
                } catch (e) {
                    reject(e);
                }
            }
            function rejected(value) {
                try {
                    step(generator.throw(value));
                } catch (e) {
                    reject(e);
                }
            }
            function step(result) {
                result.done ? resolve(result.value) : function adopt(value) {
                    return value instanceof P ? value : new P((function(resolve) {
                        resolve(value);
                    }));
                }(result.value).then(fulfilled, rejected);
            }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        }));
    };
    class FuraffinityRequests {
        constructor(maxAmountRequests = 2) {
            this._semaphore = new Semaphore(maxAmountRequests), this.UserRequests = new UserRequests(this._semaphore), 
            this.PersonalUserRequests = new PersonalUserRequests(this._semaphore), this.SubmissionRequests = new SubmissionRequests(this._semaphore);
        }
        set maxAmountRequests(value) {
            this._semaphore.maxConcurrency !== value && (this._semaphore.maxConcurrency = value);
        }
        get maxAmountRequests() {
            return this._semaphore.maxConcurrency;
        }
        static set useHttps(value) {
            FuraffinityRequests._useHttps !== value && (FuraffinityRequests._useHttps = value, 
            FuraffinityRequests._httpsString = value ? "https://" : "http://");
        }
        static get useHttps() {
            return FuraffinityRequests._useHttps;
        }
        static get fullUrl() {
            return FuraffinityRequests._httpsString + FuraffinityRequests._domain;
        }
        static getHTML(url_1, semaphore_1, action_1) {
            return FuraffinityRequests_awaiter(this, arguments, void 0, (function*(url, semaphore, action, delay = 100) {
                if (null != url && "" !== url) return yield WaitAndCallAction.callFunctionAsync(getHTMLLocal, [ url, semaphore ], action, delay);
                Logger.logError("No url given");
            }));
        }
        static postHTML(url_1, payload_1, semaphore_1, action_1) {
            return FuraffinityRequests_awaiter(this, arguments, void 0, (function*(url, payload, semaphore, action, delay = 100) {
                if (null != url && "" !== url) return yield WaitAndCallAction.callFunctionAsync(postHTMLLocal, [ url, payload, semaphore ], action, delay);
                Logger.logError("No url given");
            }));
        }
    }
    function getHTMLLocal(url, semaphore) {
        return FuraffinityRequests_awaiter(this, void 0, void 0, (function*() {
            Logger.logMessage(`Requesting '${url}'`);
            const semaphoreActive = null != semaphore && semaphore.maxConcurrency > 0;
            semaphoreActive && (yield semaphore.acquire());
            try {
                const response = yield fetch(url), html = yield response.text(), parser = new DOMParser;
                return parser.parseFromString(html, "text/html");
            } catch (error) {
                Logger.logError(error);
            } finally {
                semaphoreActive && semaphore.release();
            }
        }));
    }
    function postHTMLLocal(url, payload, semaphore) {
        return FuraffinityRequests_awaiter(this, void 0, void 0, (function*() {
            const semaphoreActive = null != semaphore && semaphore.maxConcurrency > 0;
            semaphoreActive && (yield semaphore.acquire());
            try {
                const response = yield fetch(url, {
                    method: "POST",
                    body: new URLSearchParams(payload).toString(),
                    headers: {
                        "Content-Type": "application/x-www-form-urlencoded"
                    }
                });
                if (!response.ok) return void Logger.logError(`HTTP error! Status: ${response.status}`);
                const responseData = yield response.text();
                try {
                    const parser = new DOMParser;
                    return parser.parseFromString(responseData, "text/html");
                } catch (_a) {
                    Logger.logError(`Failed to parse response data as HTML: ${responseData}`);
                }
            } catch (error) {
                Logger.logError(error);
            } finally {
                semaphoreActive && semaphore.release();
            }
        }));
    }
    FuraffinityRequests.logLevel = 1, FuraffinityRequests.Types = {
        BrowseOptions,
        SearchOptions
    }, FuraffinityRequests._useHttps = !0, FuraffinityRequests._httpsString = "https://", 
    FuraffinityRequests._domain = "www.furaffinity.net", Object.defineProperties(window, {
        FARequestHelper: {
            get: () => FuraffinityRequests
        }
    });
})();