Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 11
Línea 1... Línea -...
1
{"version":3,"file":"message_drawer_lazy_load_list.min.js","sources":["../src/message_drawer_lazy_load_list.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Lazy loaded list of items.\n *\n * @module     core_message/message_drawer_lazy_load_list\n * @copyright  2018 Ryan Wyllie <ryan@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n    'jquery',\n    'core/custom_interaction_events'\n],\nfunction(\n    $,\n    CustomEvents\n) {\n\n    var SELECTORS = {\n        ROOT: '[data-region=\"lazy-load-list\"]',\n        LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n        CONTENT_CONTAINER: '[data-region=\"content-container\"]',\n        EMPTY_MESSAGE: '[data-region=\"empty-message-container\"]',\n        PLACEHOLDER: '[data-region=\"placeholder-container\"]'\n    };\n\n    /**\n     * Flag element as loading.\n     *\n     * @param {Object} root The section container element.\n     */\n    var startLoading = function(root) {\n        root.attr('data-loading', true);\n    };\n\n    /**\n     * Flag element as not loading.\n     *\n     * @param {Object} root The section container element.\n     */\n    var stopLoading = function(root) {\n        root.attr('data-loading', false);\n    };\n\n    /**\n     * Check if the element is loading.\n     *\n     * @param {Object} root The section container element.\n     * @return {Bool}\n     */\n    var isLoading = function(root) {\n        return root.attr('data-loading') === 'true';\n    };\n\n    /**\n     * Get user id\n     *\n     * @param  {Object} root The section container element.\n     * @return {Number} Logged in user id.\n     */\n    var getUserId = function(root) {\n        return root.attr('data-user-id');\n    };\n\n    /**\n     * Get the section content container element.\n     *\n     * @param  {Object} root The section container element.\n     * @return {Object} The section content container element.\n     */\n    var getContentContainer = function(root) {\n        return root.find(SELECTORS.CONTENT_CONTAINER);\n    };\n\n    /**\n     * Get the root element.\n     *\n     * @param  {Object} containerElement The container element to search in.\n     * @return {Object} The list root element.\n     */\n    var getRoot = function(containerElement) {\n        return containerElement.find(SELECTORS.ROOT);\n    };\n\n    /**\n     * Show the loading icon.\n     *\n     * @param {Object} root The section container element.\n     */\n    var showLoadingIcon = function(root) {\n        root.find(SELECTORS.LOADING_ICON_CONTAINER).removeClass('hidden');\n    };\n\n    /**\n     * Hide the loading icon.\n     *\n     * @param {Object} root The section container element.\n     */\n    var hideLoadingIcon = function(root) {\n        root.find(SELECTORS.LOADING_ICON_CONTAINER).addClass('hidden');\n    };\n\n    /**\n     * Show the empty message.\n     *\n     * @param {Object} root The section container element.\n     */\n    var showEmptyMessage = function(root) {\n        root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n    };\n\n    /**\n     * Hide the empty message.\n     *\n     * @param {Object} root The section container element.\n     */\n    var hideEmptyMessage = function(root) {\n        root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n    };\n\n    /**\n     * Show the placeholder element.\n     *\n     * @param {Object} root The section container element.\n     */\n    var showPlaceholder = function(root) {\n        root.find(SELECTORS.PLACEHOLDER).removeClass('hidden');\n    };\n\n    /**\n     * Hide the placeholder element.\n     *\n     * @param {Object} root The section container element.\n     */\n    var hidePlaceholder = function(root) {\n        root.find(SELECTORS.PLACEHOLDER).addClass('hidden');\n    };\n\n    /**\n     * Show the section content container.\n     *\n     * @param {Object} root The section container element.\n     */\n    var showContent = function(root) {\n        getContentContainer(root).removeClass('hidden');\n    };\n\n    /**\n     * Hide the section content container.\n     *\n     * @param {Object} root The section container element.\n     */\n    var hideContent = function(root) {\n        getContentContainer(root).addClass('hidden');\n    };\n\n    /**\n     * If the section has loaded all content.\n     *\n     * @param {Object} root The section container element.\n     * @return {Bool}\n     */\n    var hasLoadedAll = function(root) {\n        return root.attr('data-loaded-all') == 'true';\n    };\n\n    /**\n     * If the section has loaded all content.\n     *\n     * @param {Object} root The section container element.\n     * @param {Bool} value If all items have been loaded.\n     */\n    var setLoadedAll = function(root, value) {\n        root.attr('data-loaded-all', value);\n    };\n\n    /**\n     * If the section can load more items.\n     *\n     * @param {Object} root The section container element.\n     * @return {Bool}\n     */\n    var canLoadMore = function(root) {\n        return !hasLoadedAll(root) && !isLoading(root);\n    };\n\n    /**\n     * Load all items in this container from callback and render them.\n     *\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Function} renderCallback The callback to render the results.\n     * @return {Object} jQuery promise\n     */\n    var loadAndRender = function(root, loadCallback, renderCallback) {\n        var userId = getUserId(root);\n        startLoading(root);\n\n        return loadCallback(root, userId)\n            .then(function(items) {\n                if (items.length > 0) {\n                    var contentContainer = getContentContainer(root);\n                    return renderCallback(contentContainer, items, userId)\n                        .then(function() {\n                            return items;\n                        });\n                } else {\n                    return items;\n                }\n            })\n            .then(function(items) {\n                stopLoading(root);\n                root.attr('data-seen', true);\n\n                if (!items.length) {\n                    setLoadedAll(root, true);\n                }\n\n                return items;\n            })\n            .catch(function() {\n                stopLoading(root);\n                root.attr('data-seen', true);\n                return;\n            });\n    };\n\n    /**\n     * First load of this section.\n     *\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Function} renderCallback The callback to render the results.\n     * @return {Object} promise\n     */\n    var initialLoadAndRender = function(root, loadCallback, renderCallback) {\n        getContentContainer(root).empty();\n        showPlaceholder(root);\n        hideContent(root);\n        return loadAndRender(root, loadCallback, renderCallback)\n            .then(function(items) {\n                hidePlaceholder(root);\n\n                if (!items.length) {\n                    showEmptyMessage(root);\n                } else {\n                    showContent(root);\n                }\n\n                return;\n            })\n            .catch(function() {\n                hidePlaceholder(root);\n                showContent(root);\n                return;\n            });\n    };\n\n    /**\n     * Listen to, and handle events in this section.\n     *\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Function} renderCallback The callback to render the results.\n     */\n    var registerEventListeners = function(root, loadCallback, renderCallback) {\n        CustomEvents.define(root, [\n            CustomEvents.events.scrollBottom\n        ]);\n\n        root.on(CustomEvents.events.scrollBottom, function() {\n            if (canLoadMore(root)) {\n                showLoadingIcon(root);\n                loadAndRender(root, loadCallback, renderCallback)\n                    .then(function() {\n                        return hideLoadingIcon(root);\n                    })\n                    .catch(function() {\n                        return hideLoadingIcon(root);\n                    });\n            }\n        });\n    };\n\n    /**\n     * Setup the section.\n     *\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Function} renderCallback The callback to render the results.\n     */\n    var show = function(root, loadCallback, renderCallback) {\n        root = $(root);\n\n        if (!root.attr('data-init')) {\n            registerEventListeners(root, loadCallback, renderCallback);\n            initialLoadAndRender(root, loadCallback, renderCallback);\n            root.attr('data-init', true);\n        }\n    };\n\n    return {\n        show: show,\n        getContentContainer: getContentContainer,\n        getRoot: getRoot,\n        setLoadedAll: setLoadedAll,\n        showEmptyMessage: showEmptyMessage,\n        hideEmptyMessage: hideEmptyMessage,\n        showContent: showContent,\n        hideContent: hideContent\n    };\n});\n"],"names":["define","$","CustomEvents","SELECTORS","stopLoading","root","attr","getContentContainer","find","hideLoadingIcon","addClass","showEmptyMessage","removeClass","hidePlaceholder","showContent","hideContent","setLoadedAll","value","loadAndRender","loadCallback","renderCallback","userId","getUserId","startLoading","then","items","length","contentContainer","catch","initialLoadAndRender","empty","showPlaceholder","registerEventListeners","events","scrollBottom","on","hasLoadedAll","isLoading","canLoadMore","showLoadingIcon","show","getRoot","containerElement","hideEmptyMessage"],"mappings":";;;;;;;AAsBAA,oDACA,CACI,SACA,mCAEJ,SACIC,EACAC,kBAGIC,eACM,iCADNA,iCAEwB,yCAFxBA,4BAGmB,oCAHnBA,wBAIe,0CAJfA,sBAKa,wCAiBbC,YAAc,SAASC,MACvBA,KAAKC,KAAK,gBAAgB,IA6B1BC,oBAAsB,SAASF,aACxBA,KAAKG,KAAKL,8BA2BjBM,gBAAkB,SAASJ,MAC3BA,KAAKG,KAAKL,kCAAkCO,SAAS,WAQrDC,iBAAmB,SAASN,MAC5BA,KAAKG,KAAKL,yBAAyBS,YAAY,WA0B/CC,gBAAkB,SAASR,MAC3BA,KAAKG,KAAKL,uBAAuBO,SAAS,WAQ1CI,YAAc,SAAST,MACvBE,oBAAoBF,MAAMO,YAAY,WAQtCG,YAAc,SAASV,MACvBE,oBAAoBF,MAAMK,SAAS,WAmBnCM,aAAe,SAASX,KAAMY,OAC9BZ,KAAKC,KAAK,kBAAmBW,QAqB7BC,cAAgB,SAASb,KAAMc,aAAcC,oBACzCC,OAvIQ,SAAShB,aACdA,KAAKC,KAAK,gBAsIJgB,CAAUjB,aApKR,SAASA,MACxBA,KAAKC,KAAK,gBAAgB,GAoK1BiB,CAAalB,MAENc,aAAad,KAAMgB,QACrBG,MAAK,SAASC,UACPA,MAAMC,OAAS,EAAG,KACdC,iBAAmBpB,oBAAoBF,aACpCe,eAAeO,iBAAkBF,MAAOJ,QAC1CG,MAAK,kBACKC,gBAGRA,SAGdD,MAAK,SAASC,cACXrB,YAAYC,MACZA,KAAKC,KAAK,aAAa,GAElBmB,MAAMC,QACPV,aAAaX,MAAM,GAGhBoB,SAEVG,OAAM,WACHxB,YAAYC,MACZA,KAAKC,KAAK,aAAa,OAa/BuB,qBAAuB,SAASxB,KAAMc,aAAcC,uBACpDb,oBAAoBF,MAAMyB,QA/GR,SAASzB,MAC3BA,KAAKG,KAAKL,uBAAuBS,YAAY,UA+G7CmB,CAAgB1B,MAChBU,YAAYV,MACLa,cAAcb,KAAMc,aAAcC,gBACpCI,MAAK,SAASC,OACXZ,gBAAgBR,MAEXoB,MAAMC,OAGPZ,YAAYT,MAFZM,iBAAiBN,SAOxBuB,OAAM,WACHf,gBAAgBR,MAChBS,YAAYT,UAYpB2B,uBAAyB,SAAS3B,KAAMc,aAAcC,gBACtDlB,aAAaF,OAAOK,KAAM,CACtBH,aAAa+B,OAAOC,eAGxB7B,KAAK8B,GAAGjC,aAAa+B,OAAOC,cAAc,YAxF5B,SAAS7B,aApBR,SAASA,YACe,QAAhCA,KAAKC,KAAK,mBAoBT8B,CAAa/B,QArIT,SAASA,YACgB,SAA9BA,KAAKC,KAAK,gBAoIc+B,CAAUhC,OAwFjCiC,CAAYjC,SAtLF,SAASA,MAC3BA,KAAKG,KAAKL,kCAAkCS,YAAY,UAsLhD2B,CAAgBlC,MAChBa,cAAcb,KAAMc,aAAcC,gBAC7BI,MAAK,kBACKf,gBAAgBJ,SAE1BuB,OAAM,kBACInB,gBAAgBJ,oBAuBpC,CACHmC,KAXO,SAASnC,KAAMc,aAAcC,iBACpCf,KAAOJ,EAAEI,OAECC,KAAK,eACX0B,uBAAuB3B,KAAMc,aAAcC,gBAC3CS,qBAAqBxB,KAAMc,aAAcC,gBACzCf,KAAKC,KAAK,aAAa,KAM3BC,oBAAqBA,oBACrBkC,QAhOU,SAASC,yBACZA,iBAAiBlC,KAAKL,iBAgO7Ba,aAAcA,aACdL,iBAAkBA,iBAClBgC,iBA/LmB,SAAStC,MAC5BA,KAAKG,KAAKL,yBAAyBO,SAAS,WA+L5CI,YAAaA,YACbC,YAAaA"}
-
 
2
1
{"version":3,"file":"message_drawer_lazy_load_list.min.js","sources":["../src/message_drawer_lazy_load_list.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Lazy loaded list of items.\n *\n * @module     core_message/message_drawer_lazy_load_list\n * @copyright  2018 Ryan Wyllie <ryan@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n    'jquery',\n    'core/custom_interaction_events',\n    'core/pending',\n],\nfunction(\n    $,\n    CustomEvents,\n    PendingPromise,\n) {\n\n    var SELECTORS = {\n        ROOT: '[data-region=\"lazy-load-list\"]',\n        LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n        CONTENT_CONTAINER: '[data-region=\"content-container\"]',\n        EMPTY_MESSAGE: '[data-region=\"empty-message-container\"]',\n        PLACEHOLDER: '[data-region=\"placeholder-container\"]'\n    };\n\n    /**\n     * Flag element as loading.\n     *\n     * @param {Object} root The section container element.\n     */\n    var startLoading = function(root) {\n        root.attr('data-loading', true);\n    };\n\n    /**\n     * Flag element as not loading.\n     *\n     * @param {Object} root The section container element.\n     */\n    var stopLoading = function(root) {\n        root.attr('data-loading', false);\n    };\n\n    /**\n     * Check if the element is loading.\n     *\n     * @param {Object} root The section container element.\n     * @return {Bool}\n     */\n    var isLoading = function(root) {\n        return root.attr('data-loading') === 'true';\n    };\n\n    /**\n     * Get user id\n     *\n     * @param  {Object} root The section container element.\n     * @return {Number} Logged in user id.\n     */\n    var getUserId = function(root) {\n        return root.attr('data-user-id');\n    };\n\n    /**\n     * Get the section content container element.\n     *\n     * @param  {Object} root The section container element.\n     * @return {Object} The section content container element.\n     */\n    var getContentContainer = function(root) {\n        return root.find(SELECTORS.CONTENT_CONTAINER);\n    };\n\n    /**\n     * Get the root element.\n     *\n     * @param  {Object} containerElement The container element to search in.\n     * @return {Object} The list root element.\n     */\n    var getRoot = function(containerElement) {\n        return containerElement.find(SELECTORS.ROOT);\n    };\n\n    /**\n     * Show the loading icon.\n     *\n     * @param {Object} root The section container element.\n     */\n    var showLoadingIcon = function(root) {\n        root.find(SELECTORS.LOADING_ICON_CONTAINER).removeClass('hidden');\n    };\n\n    /**\n     * Hide the loading icon.\n     *\n     * @param {Object} root The section container element.\n     */\n    var hideLoadingIcon = function(root) {\n        root.find(SELECTORS.LOADING_ICON_CONTAINER).addClass('hidden');\n    };\n\n    /**\n     * Show the empty message.\n     *\n     * @param {Object} root The section container element.\n     */\n    var showEmptyMessage = function(root) {\n        root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n    };\n\n    /**\n     * Hide the empty message.\n     *\n     * @param {Object} root The section container element.\n     */\n    var hideEmptyMessage = function(root) {\n        root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n    };\n\n    /**\n     * Show the placeholder element.\n     *\n     * @param {Object} root The section container element.\n     */\n    var showPlaceholder = function(root) {\n        root.find(SELECTORS.PLACEHOLDER).removeClass('hidden');\n    };\n\n    /**\n     * Hide the placeholder element.\n     *\n     * @param {Object} root The section container element.\n     */\n    var hidePlaceholder = function(root) {\n        root.find(SELECTORS.PLACEHOLDER).addClass('hidden');\n    };\n\n    /**\n     * Show the section content container.\n     *\n     * @param {Object} root The section container element.\n     */\n    var showContent = function(root) {\n        getContentContainer(root).removeClass('hidden');\n    };\n\n    /**\n     * Hide the section content container.\n     *\n     * @param {Object} root The section container element.\n     */\n    var hideContent = function(root) {\n        getContentContainer(root).addClass('hidden');\n    };\n\n    /**\n     * If the section has loaded all content.\n     *\n     * @param {Object} root The section container element.\n     * @return {Bool}\n     */\n    var hasLoadedAll = function(root) {\n        return root.attr('data-loaded-all') == 'true';\n    };\n\n    /**\n     * If the section has loaded all content.\n     *\n     * @param {Object} root The section container element.\n     * @param {Bool} value If all items have been loaded.\n     */\n    var setLoadedAll = function(root, value) {\n        root.attr('data-loaded-all', value);\n    };\n\n    /**\n     * If the section can load more items.\n     *\n     * @param {Object} root The section container element.\n     * @return {Bool}\n     */\n    var canLoadMore = function(root) {\n        return !hasLoadedAll(root) && !isLoading(root);\n    };\n\n    /**\n     * Load all items in this container from callback and render them.\n     *\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Function} renderCallback The callback to render the results.\n     * @return {Object} jQuery promise\n     */\n    var loadAndRender = function(root, loadCallback, renderCallback) {\n        var userId = getUserId(root);\n        startLoading(root);\n\n        return loadCallback(root, userId)\n            .then(function(items) {\n                if (items.length > 0) {\n                    var contentContainer = getContentContainer(root);\n                    return renderCallback(contentContainer, items, userId)\n                        .then(function() {\n                            return items;\n                        });\n                } else {\n                    return items;\n                }\n            })\n            .then(function(items) {\n                stopLoading(root);\n                root.attr('data-seen', true);\n\n                if (!items.length) {\n                    setLoadedAll(root, true);\n                }\n\n                return items;\n            })\n            .catch(function() {\n                stopLoading(root);\n                root.attr('data-seen', true);\n                return;\n            });\n    };\n\n    /**\n     * First load of this section.\n     *\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Function} renderCallback The callback to render the results.\n     * @return {Object} promise\n     */\n    var initialLoadAndRender = function(root, loadCallback, renderCallback) {\n        const pendingPromise = new PendingPromise('initialLoadAndRender');\n        getContentContainer(root).empty();\n        showPlaceholder(root);\n        hideContent(root);\n        return loadAndRender(root, loadCallback, renderCallback)\n            .then(function(items) {\n                hidePlaceholder(root);\n\n                if (!items.length) {\n                    showEmptyMessage(root);\n                } else {\n                    showContent(root);\n                }\n\n                return;\n            })\n            .catch(function() {\n                hidePlaceholder(root);\n                showContent(root);\n                return;\n            })\n            .then(() => {\n                pendingPromise.resolve();\n                return;\n            });\n    };\n\n    /**\n     * Listen to, and handle events in this section.\n     *\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Function} renderCallback The callback to render the results.\n     */\n    var registerEventListeners = function(root, loadCallback, renderCallback) {\n        CustomEvents.define(root, [\n            CustomEvents.events.scrollBottom\n        ]);\n\n        root.on(CustomEvents.events.scrollBottom, function() {\n            if (canLoadMore(root)) {\n                showLoadingIcon(root);\n                loadAndRender(root, loadCallback, renderCallback)\n                    .then(function() {\n                        return hideLoadingIcon(root);\n                    })\n                    .catch(function() {\n                        return hideLoadingIcon(root);\n                    });\n            }\n        });\n    };\n\n    /**\n     * Setup the section.\n     *\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Function} renderCallback The callback to render the results.\n     */\n    var show = function(root, loadCallback, renderCallback) {\n        root = $(root);\n\n        if (!root.attr('data-init')) {\n            registerEventListeners(root, loadCallback, renderCallback);\n            initialLoadAndRender(root, loadCallback, renderCallback);\n            root.attr('data-init', true);\n        }\n    };\n\n    return {\n        show: show,\n        getContentContainer: getContentContainer,\n        getRoot: getRoot,\n        setLoadedAll: setLoadedAll,\n        showEmptyMessage: showEmptyMessage,\n        hideEmptyMessage: hideEmptyMessage,\n        showContent: showContent,\n        hideContent: hideContent\n    };\n});\n"],"names":["define","$","CustomEvents","PendingPromise","SELECTORS","stopLoading","root","attr","getContentContainer","find","hideLoadingIcon","addClass","showEmptyMessage","removeClass","hidePlaceholder","showContent","hideContent","setLoadedAll","value","loadAndRender","loadCallback","renderCallback","userId","getUserId","startLoading","then","items","length","contentContainer","catch","initialLoadAndRender","pendingPromise","empty","showPlaceholder","resolve","registerEventListeners","events","scrollBottom","on","hasLoadedAll","isLoading","canLoadMore","showLoadingIcon","show","getRoot","containerElement","hideEmptyMessage"],"mappings":";;;;;;;AAsBAA,oDACA,CACI,SACA,iCACA,iBAEJ,SACIC,EACAC,aACAC,oBAGIC,eACM,iCADNA,iCAEwB,yCAFxBA,4BAGmB,oCAHnBA,wBAIe,0CAJfA,sBAKa,wCAiBbC,YAAc,SAASC,MACvBA,KAAKC,KAAK,gBAAgB,IA6B1BC,oBAAsB,SAASF,aACxBA,KAAKG,KAAKL,8BA2BjBM,gBAAkB,SAASJ,MAC3BA,KAAKG,KAAKL,kCAAkCO,SAAS,WAQrDC,iBAAmB,SAASN,MAC5BA,KAAKG,KAAKL,yBAAyBS,YAAY,WA0B/CC,gBAAkB,SAASR,MAC3BA,KAAKG,KAAKL,uBAAuBO,SAAS,WAQ1CI,YAAc,SAAST,MACvBE,oBAAoBF,MAAMO,YAAY,WAQtCG,YAAc,SAASV,MACvBE,oBAAoBF,MAAMK,SAAS,WAmBnCM,aAAe,SAASX,KAAMY,OAC9BZ,KAAKC,KAAK,kBAAmBW,QAqB7BC,cAAgB,SAASb,KAAMc,aAAcC,oBACzCC,OAvIQ,SAAShB,aACdA,KAAKC,KAAK,gBAsIJgB,CAAUjB,aApKR,SAASA,MACxBA,KAAKC,KAAK,gBAAgB,GAoK1BiB,CAAalB,MAENc,aAAad,KAAMgB,QACrBG,MAAK,SAASC,UACPA,MAAMC,OAAS,EAAG,KACdC,iBAAmBpB,oBAAoBF,aACpCe,eAAeO,iBAAkBF,MAAOJ,QAC1CG,MAAK,kBACKC,gBAGRA,SAGdD,MAAK,SAASC,cACXrB,YAAYC,MACZA,KAAKC,KAAK,aAAa,GAElBmB,MAAMC,QACPV,aAAaX,MAAM,GAGhBoB,SAEVG,OAAM,WACHxB,YAAYC,MACZA,KAAKC,KAAK,aAAa,OAa/BuB,qBAAuB,SAASxB,KAAMc,aAAcC,sBAC9CU,eAAiB,IAAI5B,eAAe,+BAC1CK,oBAAoBF,MAAM0B,QAhHR,SAAS1B,MAC3BA,KAAKG,KAAKL,uBAAuBS,YAAY,UAgH7CoB,CAAgB3B,MAChBU,YAAYV,MACLa,cAAcb,KAAMc,aAAcC,gBACpCI,MAAK,SAASC,OACXZ,gBAAgBR,MAEXoB,MAAMC,OAGPZ,YAAYT,MAFZM,iBAAiBN,SAOxBuB,OAAM,WACHf,gBAAgBR,MAChBS,YAAYT,SAGfmB,MAAK,KACFM,eAAeG,cAYvBC,uBAAyB,SAAS7B,KAAMc,aAAcC,gBACtDnB,aAAaF,OAAOM,KAAM,CACtBJ,aAAakC,OAAOC,eAGxB/B,KAAKgC,GAAGpC,aAAakC,OAAOC,cAAc,YA7F5B,SAAS/B,aApBR,SAASA,YACe,QAAhCA,KAAKC,KAAK,mBAoBTgC,CAAajC,QArIT,SAASA,YACgB,SAA9BA,KAAKC,KAAK,gBAoIciC,CAAUlC,OA6FjCmC,CAAYnC,SA3LF,SAASA,MAC3BA,KAAKG,KAAKL,kCAAkCS,YAAY,UA2LhD6B,CAAgBpC,MAChBa,cAAcb,KAAMc,aAAcC,gBAC7BI,MAAK,kBACKf,gBAAgBJ,SAE1BuB,OAAM,kBACInB,gBAAgBJ,oBAuBpC,CACHqC,KAXO,SAASrC,KAAMc,aAAcC,iBACpCf,KAAOL,EAAEK,OAECC,KAAK,eACX4B,uBAAuB7B,KAAMc,aAAcC,gBAC3CS,qBAAqBxB,KAAMc,aAAcC,gBACzCf,KAAKC,KAAK,aAAa,KAM3BC,oBAAqBA,oBACrBoC,QArOU,SAASC,yBACZA,iBAAiBpC,KAAKL,iBAqO7Ba,aAAcA,aACdL,iBAAkBA,iBAClBkC,iBApMmB,SAASxC,MAC5BA,KAAKG,KAAKL,yBAAyBO,SAAS,WAoM5CI,YAAaA,YACbC,YAAaA"}
-
 
2
3
3