diff --git a/action/dist/index.js b/action/dist/index.js index 98413f0f..48ed1330 100644 --- a/action/dist/index.js +++ b/action/dist/index.js @@ -1,59280 +1 @@ -module.exports = -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ 64563: -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -// ESM COMPAT FLAG -__webpack_require__.r(__webpack_exports__); - -// NAMESPACE OBJECT: E:\Users\lecoq\Documents\GitHub\gitstats\src\setup.mjs -var E_Users_lecoq_Documents_GitHub_gitstats_src_setup_namespaceObject = {}; -__webpack_require__.r(E_Users_lecoq_Documents_GitHub_gitstats_src_setup_namespaceObject); -__webpack_require__.d(E_Users_lecoq_Documents_GitHub_gitstats_src_setup_namespaceObject, { - "default": () => E_Users_lecoq_Documents_GitHub_gitstats_src_setup -}); - -// NAMESPACE OBJECT: E:\Users\lecoq\Documents\GitHub\gitstats\src\metrics.mjs -var E_Users_lecoq_Documents_GitHub_gitstats_src_metrics_namespaceObject = {}; -__webpack_require__.r(E_Users_lecoq_Documents_GitHub_gitstats_src_metrics_namespaceObject); -__webpack_require__.d(E_Users_lecoq_Documents_GitHub_gitstats_src_metrics_namespaceObject, { - "default": () => metrics -}); - -// EXTERNAL MODULE: external "fs" -var external_fs_ = __webpack_require__(35747); -var external_fs_default = /*#__PURE__*/__webpack_require__.n(external_fs_); - -// EXTERNAL MODULE: external "path" -var external_path_ = __webpack_require__(85622); -var external_path_default = /*#__PURE__*/__webpack_require__.n(external_path_); - -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\setup.mjs -//Imports - - - -/** Setup */ - /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_setup({log = true} = {}) { - - //Init - const logger = log ? console.debug : () => null - logger(`metrics/setup > setup`) - const templates = "src/templates" - const conf = { - templates:{}, - settings:{}, - statics:__webpack_require__.ab + "html", - node_modules:external_path_default().resolve("node_modules"), - } - - //Load settings - logger(`metrics/setup > load settings.json`) - if (external_fs_default().existsSync(__webpack_require__.ab + "settings.json")) { - conf.settings = JSON.parse(`${await external_fs_default().promises.readFile(external_path_default().resolve("settings.json"))}`) - logger(`metrics/setup > load settings.json > success`) - } - else - logger(`metrics/setup > load settings.json > (missing)`) - if (!conf.settings.templates) - conf.settings.templates = {default:"classic", enabled:[]} - if (!conf.settings.plugins) - conf.settings.plugins = {} - conf.settings.plugins.base = {parts:["header", "activity", "community", "repositories", "metadata"]} - if (conf.settings.debug) - logger(conf.settings) - - //Load package settings - logger(`metrics/setup > load package.json`) - if (external_fs_default().existsSync(__webpack_require__.ab + "package.json")) { - conf.package = JSON.parse(`${await external_fs_default().promises.readFile(external_path_default().resolve("package.json"))}`) - logger(`metrics/setup > load package.json > success`) - } - else { - logger(`metrics/setup > load package.json > (missing)`) - conf.package = {version:"2.2.0", author:"lowlighter"} - } - - //Load templates - if (external_fs_default().existsSync(__webpack_require__.ab + "templates")) { - for (const name of await external_fs_default().promises.readdir(templates)) { - //Cache templates - if (/.*[.]mjs$/.test(name)) - continue - logger(`metrics/setup > load template [${name}]`) - const files = [ - `${templates}/${name}/query.graphql`, - `${templates}/${name}/image.svg`, - `${templates}/${name}/style.css`, - ] - const [query, image, style] = await Promise.all(files.map(async file => `${await external_fs_default().promises.readFile(external_path_default().resolve(file))}`)) - conf.templates[name] = {query, image, style} - logger(`metrics/setup > load template [${name}] > success`) - //Debug - if (conf.settings.debug) { - Object.defineProperty(conf.templates, name, { - get() { - logger(`metrics/setup > reload template [${name}]`) - const [query, image, style] = files.map(file => `${external_fs_default().readFileSync(external_path_default().resolve(file))}`) - logger(`metrics/setup > reload template [${name}] > success`) - return {query, image, style} - } - }) - } - } - } - else { - logger(`metrics/setup > load templates from build`) - conf.templates = JSON.parse(Buffer.from(`eyJjbGFzc2ljIjp7InF1ZXJ5IjoicXVlcnkgTWV0cmljcyB7XHJcbiAgdXNlcihsb2dpbjogJGxvZ2luKSB7XHJcbiAgICBkYXRhYmFzZUlkXHJcbiAgICBuYW1lXHJcbiAgICBsb2dpblxyXG4gICAgY3JlYXRlZEF0XHJcbiAgICBhdmF0YXJVcmxcclxuICAgIHdlYnNpdGVVcmxcclxuICAgIGdpc3RzIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgcmVwb3NpdG9yaWVzKGxhc3Q6ICRyZXBvc2l0b3JpZXMsIGlzRm9yazogZmFsc2UsIG93bmVyQWZmaWxpYXRpb25zOiBPV05FUikge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICAgIG5vZGVzIHtcclxuICAgICAgICBuYW1lXHJcbiAgICAgICAgd2F0Y2hlcnMge1xyXG4gICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFyZ2F6ZXJzIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgbGFuZ3VhZ2VzKGZpcnN0OiA0KSB7XHJcbiAgICAgICAgICBlZGdlcyB7XHJcbiAgICAgICAgICAgIHNpemVcclxuICAgICAgICAgICAgbm9kZSB7XHJcbiAgICAgICAgICAgICAgY29sb3JcclxuICAgICAgICAgICAgICBuYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaXNzdWVzX29wZW46IGlzc3VlcyhzdGF0ZXM6IE9QRU4pIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgaXNzdWVzX2Nsb3NlZDogaXNzdWVzKHN0YXRlczogQ0xPU0VEKSB7XHJcbiAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByX29wZW46IHB1bGxSZXF1ZXN0cyhzdGF0ZXM6IE9QRU4pIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJfbWVyZ2VkOiBwdWxsUmVxdWVzdHMoc3RhdGVzOiBNRVJHRUQpIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9ya0NvdW50XHJcbiAgICAgICAgbGljZW5zZUluZm8ge1xyXG4gICAgICAgICAgc3BkeElkXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwYWNrYWdlcyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHN0YXJyZWRSZXBvc2l0b3JpZXMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgICB3YXRjaGluZyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHNwb25zb3JzaGlwc0FzU3BvbnNvciB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHNwb25zb3JzaGlwc0FzTWFpbnRhaW5lciB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIGNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uIHtcclxuICAgICAgdG90YWxSZXBvc2l0b3JpZXNXaXRoQ29udHJpYnV0ZWRDb21taXRzXHJcbiAgICAgIHRvdGFsQ29tbWl0Q29udHJpYnV0aW9uc1xyXG4gICAgICByZXN0cmljdGVkQ29udHJpYnV0aW9uc0NvdW50XHJcbiAgICAgIHRvdGFsSXNzdWVDb250cmlidXRpb25zXHJcbiAgICAgIHRvdGFsUHVsbFJlcXVlc3RDb250cmlidXRpb25zXHJcbiAgICAgIHRvdGFsUHVsbFJlcXVlc3RSZXZpZXdDb250cmlidXRpb25zXHJcbiAgICB9XHJcbiAgICBjYWxlbmRhcjpjb250cmlidXRpb25zQ29sbGVjdGlvbihmcm9tOiAkY2FsZW5kYXIuZnJvbSwgdG86ICRjYWxlbmRhci50bykge1xyXG4gICAgICBjb250cmlidXRpb25DYWxlbmRhciB7XHJcbiAgICAgICAgd2Vla3Mge1xyXG4gICAgICAgICAgY29udHJpYnV0aW9uRGF5cyB7XHJcbiAgICAgICAgICAgIGNvbG9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXBvc2l0b3JpZXNDb250cmlidXRlZFRvIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgZm9sbG93ZXJzIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgZm9sbG93aW5nIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgaXNzdWVDb21tZW50cyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIG9yZ2FuaXphdGlvbnMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltYWdlIjoiPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0ODBcIiBoZWlnaHQ9XCI8JT0gMFxyXG4gICsgKCEhYmFzZS5oZWFkZXIpKigxNio2KVxyXG4gICsgKCEhYmFzZS5tZXRhZGF0YSkqKDE2KjMpXHJcbiAgKyAoKCEhYmFzZS5hY3Rpdml0eSl8fCghIWJhc2UuY29tbXVuaXR5KSkqKDE2KjEwKVxyXG4gICsgKCEhYmFzZS5yZXBvc2l0b3JpZXMpKigxNio3KVxyXG4gICsgKCghIWNvbXB1dGVkLnBsdWdpbnMudHJhZmZpYyl8fCghIWNvbXB1dGVkLnBsdWdpbnMubGluZXMpKSooMTYqMilcclxuICArICghIWNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXApKigxNio1KVxyXG4gICsgKCEhY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMpKigxNio2KVxyXG4gICsgKCEhY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQpKigxNio5KVxyXG4gICsgKCEhY29tcHV0ZWQucGx1Z2lucy5oYWJpdHMpKigxNio1KVxyXG4lPlwiPlxyXG4gIDxzdHlsZT5cclxuICAgIDwlPSBzdHlsZSAlPlxyXG4gIDwvc3R5bGU+XHJcblxyXG4gIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICA8ZGl2IHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPlxyXG5cclxuICAgICAgPCUgaWYgKGJhc2UuaGVhZGVyKSB7ICU+XHJcbiAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICA8aDEgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyXCIgc3JjPVwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LDwlPSBjb21wdXRlZC5hdmF0YXIgJT5cIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiAvPlxyXG4gICAgICAgICAgICA8c3Bhbj48JT0gdXNlci5uYW1lIHx8IHVzZXIubG9naW4gJT48L3NwYW4+XHJcbiAgICAgICAgICA8L2gxPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xLjUgOGE2LjUgNi41IDAgMTExMyAwIDYuNSA2LjUgMCAwMS0xMyAwek04IDBhOCA4IDAgMTAwIDE2QTggOCAwIDAwOCAwem0uNSA0Ljc1YS43NS43NSAwIDAwLTEuNSAwdjMuNWEuNzUuNzUgMCAwMC40NzEuNjk2bDIuNSAxYS43NS43NSAwIDAwLjU1Ny0xLjM5Mkw4LjUgNy43NDJWNC43NXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICBKb2luZWQgR2l0SHViIDwlPSBjb21wdXRlZC5yZWdpc3RyYXRpb24gJT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk01LjUgMy41YTIgMiAwIDEwMCA0IDIgMiAwIDAwMC00ek0yIDUuNWEzLjUgMy41IDAgMTE1Ljg5OCAyLjU0OSA1LjUwNyA1LjUwNyAwIDAxMy4wMzQgNC4wODQuNzUuNzUgMCAxMS0xLjQ4Mi4yMzUgNC4wMDEgNC4wMDEgMCAwMC03LjkgMCAuNzUuNzUgMCAwMS0xLjQ4Mi0uMjM2QTUuNTA3IDUuNTA3IDAgMDEzLjEwMiA4LjA1IDMuNDkgMy40OSAwIDAxMiA1LjV6TTExIDRhLjc1Ljc1IDAgMTAwIDEuNSAxLjUgMS41IDAgMDEuNjY2IDIuODQ0Ljc1Ljc1IDAgMDAtLjQxNi42NzJ2LjM1MmEuNzUuNzUgMCAwMC41NzQuNzNjMS4yLjI4OSAyLjE2MiAxLjIgMi41MjIgMi4zNzJhLjc1Ljc1IDAgMTAxLjQzNC0uNDQgNS4wMSA1LjAxIDAgMDAtMi41Ni0zLjAxMkEzIDMgMCAwMDExIDR6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgRm9sbG93ZWQgYnkgPCU9IHVzZXIuZm9sbG93ZXJzLnRvdGFsQ291bnQgJT4gdXNlcjwlPSBzKHVzZXIuZm9sbG93ZXJzLnRvdGFsQ291bnQpICU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNhbGVuZGFyXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDwlPSBjb21wdXRlZC5jYWxlbmRhci5sZW5ndGgqMTUgJT4gMTFcIiB3aWR0aD1cIjwlPSBjb21wdXRlZC5jYWxlbmRhci5sZW5ndGgqMTUgJT5cIiBoZWlnaHQ9XCIxNlwiPlxyXG4gICAgICAgICAgICAgICAgICA8Zz5cclxuICAgICAgICAgICAgICAgICAgICA8JSBmb3IgKGNvbnN0IFt4LCB7Y29sb3J9XSBvZiBPYmplY3QuZW50cmllcyhjb21wdXRlZC5jYWxlbmRhcikpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IGNsYXNzPVwiZGF5XCIgeD1cIjwlPSB4KjE1ICU+XCIgeT1cIjBcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiBmaWxsPVwiPCU9IGNvbG9yICU+XCIgcng9XCIyXCIgcnk9XCIyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEgMi41QTIuNSAyLjUgMCAwMTMuNSAwaDguNzVhLjc1Ljc1IDAgMDEuNzUuNzV2My41YS43NS43NSAwIDAxLTEuNSAwVjEuNWgtOGExIDEgMCAwMC0xIDF2Ni43MDhBMi40OTIgMi40OTIgMCAwMTMuNSA5aDMuMjVhLjc1Ljc1IDAgMDEwIDEuNUgzLjVhMSAxIDAgMTAwIDJoNS43NWEuNzUuNzUgMCAwMTAgMS41SDMuNUEyLjUgMi41IDAgMDExIDExLjV2LTl6bTEzLjIzIDcuNzlhLjc1Ljc1IDAgMDAxLjA2LTEuMDZsLTIuNTA1LTIuNTA1YS43NS43NSAwIDAwLTEuMDYgMEw5LjIyIDkuMjI5YS43NS43NSAwIDAwMS4wNiAxLjA2MWwxLjIyNS0xLjIyNHY2LjE4NGEuNzUuNzUgMCAwMDEuNSAwVjkuMDY2bDEuMjI0IDEuMjI0elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIENvbnRyaWJ1dGVkIHRvIDwlPSB1c2VyLnJlcG9zaXRvcmllc0NvbnRyaWJ1dGVkVG8udG90YWxDb3VudCAlPiByZXBvc2l0b3I8JT0gcyh1c2VyLnJlcG9zaXRvcmllc0NvbnRyaWJ1dGVkVG8udG90YWxDb3VudCwgXCJ5XCIpICU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgPCUgfSAlPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDwlIGlmIChiYXNlLmFjdGl2aXR5KSB7ICU+XHJcbiAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgPGgyIGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMS41IDEuNzVhLjc1Ljc1IDAgMDAtMS41IDB2MTIuNWMwIC40MTQuMzM2Ljc1Ljc1Ljc1aDE0LjVhLjc1Ljc1IDAgMDAwLTEuNUgxLjVWMS43NXptMTQuMjggMi41M2EuNzUuNzUgMCAwMC0xLjA2LTEuMDZMMTAgNy45NCA3LjUzIDUuNDdhLjc1Ljc1IDAgMDAtMS4wNiAwTDMuMjIgOC43MmEuNzUuNzUgMCAwMDEuMDYgMS4wNkw3IDcuMDZsMi40NyAyLjQ3YS43NS43NSAwIDAwMS4wNiAwbDUuMjUtNS4yNXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgQWN0aXZpdHlcclxuICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEwLjUgNy43NWEyLjUgMi41IDAgMTEtNSAwIDIuNSAyLjUgMCAwMTUgMHptMS40My43NWE0LjAwMiA0LjAwMiAwIDAxLTcuODYgMEguNzVhLjc1Ljc1IDAgMTEwLTEuNWgzLjMyYTQuMDAxIDQuMDAxIDAgMDE3Ljg2IDBoMy4zMmEuNzUuNzUgMCAxMTAgMS41aC0zLjMyelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICA8JT0gY29tcHV0ZWQuY29tbWl0cyAlPiBDb21taXQ8JT0gcyhjb21wdXRlZC5jb21taXRzKSAlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTIuNSAxLjc1YS4yNS4yNSAwIDAxLjI1LS4yNWg4LjVhLjI1LjI1IDAgMDEuMjUuMjV2Ny43MzZhLjc1Ljc1IDAgMTAxLjUgMFYxLjc1QTEuNzUgMS43NSAwIDAwMTEuMjUgMGgtOC41QTEuNzUgMS43NSAwIDAwMSAxLjc1djExLjVjMCAuOTY2Ljc4NCAxLjc1IDEuNzUgMS43NWgzLjE3YS43NS43NSAwIDAwMC0xLjVIMi43NWEuMjUuMjUgMCAwMS0uMjUtLjI1VjEuNzV6TTQuNzUgNGEuNzUuNzUgMCAwMDAgMS41aDQuNWEuNzUuNzUgMCAwMDAtMS41aC00LjV6TTQgNy43NUEuNzUuNzUgMCAwMTQuNzUgN2gyYS43NS43NSAwIDAxMCAxLjVoLTJBLjc1Ljc1IDAgMDE0IDcuNzV6bTExLjc3NCAzLjUzN2EuNzUuNzUgMCAwMC0xLjA0OC0xLjA3NEwxMC43IDE0LjE0NSA5LjI4MSAxMi43MmEuNzUuNzUgMCAwMC0xLjA2MiAxLjA1OGwxLjk0MyAxLjk1YS43NS43NSAwIDAwMS4wNTUuMDA4bDQuNTU3LTQuNDV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwlPSB1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsUHVsbFJlcXVlc3RSZXZpZXdDb250cmlidXRpb25zICU+IFB1bGwgcmVxdWVzdDwlPSBzKHVzZXIuY29udHJpYnV0aW9uc0NvbGxlY3Rpb24udG90YWxQdWxsUmVxdWVzdFJldmlld0NvbnRyaWJ1dGlvbnMpICU+IHJldmlld2VkXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNy4xNzcgMy4wNzNMOS41NzMuNjc3QS4yNS4yNSAwIDAxMTAgLjg1NHY0Ljc5MmEuMjUuMjUgMCAwMS0uNDI3LjE3N0w3LjE3NyAzLjQyN2EuMjUuMjUgMCAwMTAtLjM1NHpNMy43NSAyLjVhLjc1Ljc1IDAgMTAwIDEuNS43NS43NSAwIDAwMC0xLjV6bS0yLjI1Ljc1YTIuMjUgMi4yNSAwIDExMyAyLjEyMnY1LjI1NmEyLjI1MSAyLjI1MSAwIDExLTEuNSAwVjUuMzcyQTIuMjUgMi4yNSAwIDAxMS41IDMuMjV6TTExIDIuNWgtMVY0aDFhMSAxIDAgMDExIDF2NS42MjhhMi4yNTEgMi4yNTEgMCAxMDEuNSAwVjVBMi41IDIuNSAwIDAwMTEgMi41em0xIDEwLjI1YS43NS43NSAwIDExMS41IDAgLjc1Ljc1IDAgMDEtMS41IDB6TTMuNzUgMTJhLjc1Ljc1IDAgMTAwIDEuNS43NS43NSAwIDAwMC0xLjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwlPSB1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsUHVsbFJlcXVlc3RDb250cmlidXRpb25zICU+IFB1bGwgcmVxdWVzdDwlPSBzKHVzZXIuY29udHJpYnV0aW9uc0NvbGxlY3Rpb24udG90YWxQdWxsUmVxdWVzdENvbnRyaWJ1dGlvbnMpICU+IG9wZW5lZFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTggMS41YTYuNSA2LjUgMCAxMDAgMTMgNi41IDYuNSAwIDAwMC0xM3pNMCA4YTggOCAwIDExMTYgMEE4IDggMCAwMTAgOHptOSAzYTEgMSAwIDExLTIgMCAxIDEgMCAwMTIgMHptLS4yNS02LjI1YS43NS43NSAwIDAwLTEuNSAwdjMuNWEuNzUuNzUgMCAwMDEuNSAwdi0zLjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwlPSB1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsSXNzdWVDb250cmlidXRpb25zICU+IElzc3VlPCU9IHModXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbElzc3VlQ29udHJpYnV0aW9ucykgJT4gb3BlbmVkXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMi43NSAyLjVhLjI1LjI1IDAgMDAtLjI1LjI1djcuNWMwIC4xMzguMTEyLjI1LjI1LjI1aDJhLjc1Ljc1IDAgMDEuNzUuNzV2Mi4xOWwyLjcyLTIuNzJhLjc1Ljc1IDAgMDEuNTMtLjIyaDQuNWEuMjUuMjUgMCAwMC4yNS0uMjV2LTcuNWEuMjUuMjUgMCAwMC0uMjUtLjI1SDIuNzV6TTEgMi43NUMxIDEuNzg0IDEuNzg0IDEgMi43NSAxaDEwLjVjLjk2NiAwIDEuNzUuNzg0IDEuNzUgMS43NXY3LjVBMS43NSAxLjc1IDAgMDExMy4yNSAxMkg5LjA2bC0yLjU3MyAyLjU3M0ExLjQ1NyAxLjQ1NyAwIDAxNCAxMy41NDNWMTJIMi43NUExLjc1IDEuNzUgMCAwMTEgMTAuMjV2LTcuNXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPCU9IHVzZXIuaXNzdWVDb21tZW50cy50b3RhbENvdW50ICU+IGlzc3VlIGNvbW1lbnQ8JT0gcyh1c2VyLmlzc3VlQ29tbWVudHMudG90YWxDb3VudCkgJT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgIDwlIGlmIChiYXNlLmNvbW11bml0eSkgeyAlPlxyXG4gICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNzUgMEExLjc1IDEuNzUgMCAwMDAgMS43NXYxMi41QzAgMTUuMjE2Ljc4NCAxNiAxLjc1IDE2aDEyLjVBMS43NSAxLjc1IDAgMDAxNiAxNC4yNVYxLjc1QTEuNzUgMS43NSAwIDAwMTQuMjUgMEgxLjc1ek0xLjUgMS43NWEuMjUuMjUgMCAwMS4yNS0uMjVoMTIuNWEuMjUuMjUgMCAwMS4yNS4yNXYxMi41YS4yNS4yNSAwIDAxLS4yNS4yNUgxLjc1YS4yNS4yNSAwIDAxLS4yNS0uMjVWMS43NXpNMTEuNzUgM2EuNzUuNzUgMCAwMC0uNzUuNzV2Ny41YS43NS43NSAwIDAwMS41IDB2LTcuNWEuNzUuNzUgMCAwMC0uNzUtLjc1em0tOC4yNS43NWEuNzUuNzUgMCAwMTEuNSAwdjUuNWEuNzUuNzUgMCAwMS0xLjUgMHYtNS41ek04IDNhLjc1Ljc1IDAgMDAtLjc1Ljc1djMuNWEuNzUuNzUgMCAwMDEuNSAwdi0zLjVBLjc1Ljc1IDAgMDA4IDN6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIENvbW11bml0eSBzdGF0c1xyXG4gICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNS41IDMuNWEyIDIgMCAxMDAgNCAyIDIgMCAwMDAtNHpNMiA1LjVhMy41IDMuNSAwIDExNS44OTggMi41NDkgNS41MDcgNS41MDcgMCAwMTMuMDM0IDQuMDg0Ljc1Ljc1IDAgMTEtMS40ODIuMjM1IDQuMDAxIDQuMDAxIDAgMDAtNy45IDAgLjc1Ljc1IDAgMDEtMS40ODItLjIzNkE1LjUwNyA1LjUwNyAwIDAxMy4xMDIgOC4wNSAzLjQ5IDMuNDkgMCAwMTIgNS41ek0xMSA0YS43NS43NSAwIDEwMCAxLjUgMS41IDEuNSAwIDAxLjY2NiAyLjg0NC43NS43NSAwIDAwLS40MTYuNjcydi4zNTJhLjc1Ljc1IDAgMDAuNTc0LjczYzEuMi4yODkgMi4xNjIgMS4yIDIuNTIyIDIuMzcyYS43NS43NSAwIDEwMS40MzQtLjQ0IDUuMDEgNS4wMSAwIDAwLTIuNTYtMy4wMTJBMyAzIDAgMDAxMSA0elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICBGb2xsb3dpbmcgPCU9IHVzZXIuZm9sbG93aW5nLnRvdGFsQ291bnQgJT4gdXNlcjwlPSBzKHVzZXIuZm9sbG93ZXJzLnRvdGFsQ291bnQpICU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC4yNSAyLjVjLTEuMzM2IDAtMi43NSAxLjE2NC0yLjc1IDMgMCAyLjE1IDEuNTggNC4xNDQgMy4zNjUgNS42ODJBMjAuNTY1IDIwLjU2NSAwIDAwOCAxMy4zOTNhMjAuNTYxIDIwLjU2MSAwIDAwMy4xMzUtMi4yMTFDMTIuOTIgOS42NDQgMTQuNSA3LjY1IDE0LjUgNS41YzAtMS44MzYtMS40MTQtMy0yLjc1LTMtMS4zNzMgMC0yLjYwOS45ODYtMy4wMjkgMi40NTZhLjc1Ljc1IDAgMDEtMS40NDIgMEM2Ljg1OSAzLjQ4NiA1LjYyMyAyLjUgNC4yNSAyLjV6TTggMTQuMjVsLS4zNDUuNjY2LS4wMDItLjAwMS0uMDA2LS4wMDMtLjAxOC0uMDFhNy42NDMgNy42NDMgMCAwMS0uMzEtLjE3IDIyLjA3NSAyMi4wNzUgMCAwMS0zLjQzNC0yLjQxNEMyLjA0NSAxMC43MzEgMCA4LjM1IDAgNS41IDAgMi44MzYgMi4wODYgMSA0LjI1IDEgNS43OTcgMSA3LjE1MyAxLjgwMiA4IDMuMDIgOC44NDcgMS44MDIgMTAuMjAzIDEgMTEuNzUgMSAxMy45MTQgMSAxNiAyLjgzNiAxNiA1LjVjMCAyLjg1LTIuMDQ1IDUuMjMxLTMuODg1IDYuODE4YTIyLjA4IDIyLjA4IDAgMDEtMy43NDQgMi41ODRsLS4wMTguMDEtLjAwNi4wMDNoLS4wMDJMOCAxNC4yNXptMCAwbC4zNDUuNjY2YS43NTIuNzUyIDAgMDEtLjY5IDBMOCAxNC4yNXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgU3BvbnNvcmluZyA8JT0gY29tcHV0ZWQuc3BvbnNvcnNoaXBzICU+IHJlcG9zaXRvcjwlPSBzKGNvbXB1dGVkLnNwb25zb3JzaGlwcywgXCJ5XCIpICU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNOCAuMjVhLjc1Ljc1IDAgMDEuNjczLjQxOGwxLjg4MiAzLjgxNSA0LjIxLjYxMmEuNzUuNzUgMCAwMS40MTYgMS4yNzlsLTMuMDQ2IDIuOTcuNzE5IDQuMTkyYS43NS43NSAwIDAxLTEuMDg4Ljc5MUw4IDEyLjM0N2wtMy43NjYgMS45OGEuNzUuNzUgMCAwMS0xLjA4OC0uNzlsLjcyLTQuMTk0TC44MTggNi4zNzRhLjc1Ljc1IDAgMDEuNDE2LTEuMjhsNC4yMS0uNjExTDcuMzI3LjY2OEEuNzUuNzUgMCAwMTggLjI1em0wIDIuNDQ1TDYuNjE1IDUuNWEuNzUuNzUgMCAwMS0uNTY0LjQxbC0zLjA5Ny40NSAyLjI0IDIuMTg0YS43NS43NSAwIDAxLjIxNi42NjRsLS41MjggMy4wODQgMi43NjktMS40NTZhLjc1Ljc1IDAgMDEuNjk4IDBsMi43NyAxLjQ1Ni0uNTMtMy4wODRhLjc1Ljc1IDAgMDEuMjE2LS42NjRsMi4yNC0yLjE4My0zLjA5Ni0uNDVhLjc1Ljc1IDAgMDEtLjU2NC0uNDFMOCAyLjY5NHYuMDAxelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICBTdGFycmVkIDwlPSB1c2VyLnN0YXJyZWRSZXBvc2l0b3JpZXMudG90YWxDb3VudCAlPiByZXBvc2l0b3I8JT0gcyh1c2VyLnN0YXJyZWRSZXBvc2l0b3JpZXMudG90YWxDb3VudCwgXCJ5XCIpICU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMS42NzkgNy45MzJjLjQxMi0uNjIxIDEuMjQyLTEuNzUgMi4zNjYtMi43MTdDNS4xNzUgNC4yNDIgNi41MjcgMy41IDggMy41YzEuNDczIDAgMi44MjQuNzQyIDMuOTU1IDEuNzE1IDEuMTI0Ljk2NyAxLjk1NCAyLjA5NiAyLjM2NiAyLjcxN2EuMTE5LjExOSAwIDAxMCAuMTM2Yy0uNDEyLjYyMS0xLjI0MiAxLjc1LTIuMzY2IDIuNzE3QzEwLjgyNSAxMS43NTggOS40NzMgMTIuNSA4IDEyLjVjLTEuNDczIDAtMi44MjQtLjc0Mi0zLjk1NS0xLjcxNUMyLjkyIDkuODE4IDIuMDkgOC42OSAxLjY3OSA4LjA2OGEuMTE5LjExOSAwIDAxMC0uMTM2ek04IDJjLTEuOTgxIDAtMy42Ny45OTItNC45MzMgMi4wNzhDMS43OTcgNS4xNjkuODggNi40MjMuNDMgNy4xYTEuNjE5IDEuNjE5IDAgMDAwIDEuNzk4Yy40NS42NzggMS4zNjcgMS45MzIgMi42MzcgMy4wMjRDNC4zMjkgMTMuMDA4IDYuMDE5IDE0IDggMTRjMS45ODEgMCAzLjY3LS45OTIgNC45MzMtMi4wNzggMS4yNy0xLjA5MSAyLjE4Ny0yLjM0NSAyLjYzNy0zLjAyM2ExLjYxOSAxLjYxOSAwIDAwMC0xLjc5OGMtLjQ1LS42NzgtMS4zNjctMS45MzItMi42MzctMy4wMjNDMTEuNjcxIDIuOTkyIDkuOTgxIDIgOCAyem0wIDhhMiAyIDAgMTAwLTQgMiAyIDAgMDAwIDR6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIFdhdGNoaW5nIDwlPSB1c2VyLndhdGNoaW5nLnRvdGFsQ291bnQgJT4gcmVwb3NpdG9yPCU9IHModXNlci53YXRjaGluZy50b3RhbENvdW50LCBcInlcIikgJT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xLjUgMTQuMjVjMCAuMTM4LjExMi4yNS4yNS4yNUg0di0xLjI1YS43NS43NSAwIDAxLjc1LS43NWgyLjVhLjc1Ljc1IDAgMDEuNzUuNzV2MS4yNWgyLjI1YS4yNS4yNSAwIDAwLjI1LS4yNVYxLjc1YS4yNS4yNSAwIDAwLS4yNS0uMjVoLTguNWEuMjUuMjUgMCAwMC0uMjUuMjV2MTIuNXpNMS43NSAxNkExLjc1IDEuNzUgMCAwMTAgMTQuMjVWMS43NUMwIC43ODQuNzg0IDAgMS43NSAwaDguNUMxMS4yMTYgMCAxMiAuNzg0IDEyIDEuNzV2MTIuNWMwIC4wODUtLjAwNi4xNjgtLjAxOC4yNWgyLjI2OGEuMjUuMjUgMCAwMC4yNS0uMjVWOC4yODVhLjI1LjI1IDAgMDAtLjExMS0uMjA4bC0xLjA1NS0uNzAzYS43NS43NSAwIDExLjgzMi0xLjI0OGwxLjA1NS43MDNjLjQ4Ny4zMjUuNzc5Ljg3MS43NzkgMS40NTZ2NS45NjVBMS43NSAxLjc1IDAgMDExNC4yNSAxNmgtMy41YS43NS43NSAwIDAxLS4xOTctLjAyNmMtLjA5OS4wMTctLjIuMDI2LS4zMDMuMDI2aC0zYS43NS43NSAwIDAxLS43NS0uNzVWMTRoLTF2MS4yNWEuNzUuNzUgMCAwMS0uNzUuNzVoLTN6TTMgMy43NUEuNzUuNzUgMCAwMTMuNzUgM2guNWEuNzUuNzUgMCAwMTAgMS41aC0uNUEuNzUuNzUgMCAwMTMgMy43NXpNMy43NSA2YS43NS43NSAwIDAwMCAxLjVoLjVhLjc1Ljc1IDAgMDAwLTEuNWgtLjV6TTMgOS43NUEuNzUuNzUgMCAwMTMuNzUgOWguNWEuNzUuNzUgMCAwMTAgMS41aC0uNUEuNzUuNzUgMCAwMTMgOS43NXpNNy43NSA5YS43NS43NSAwIDAwMCAxLjVoLjVhLjc1Ljc1IDAgMDAwLTEuNWgtLjV6TTcgNi43NUEuNzUuNzUgMCAwMTcuNzUgNmguNWEuNzUuNzUgMCAwMTAgMS41aC0uNUEuNzUuNzUgMCAwMTcgNi43NXpNNy43NSAzYS43NS43NSAwIDAwMCAxLjVoLjVhLjc1Ljc1IDAgMDAwLTEuNWgtLjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIE1lbWJlciBvZiA8JT0gdXNlci5vcmdhbml6YXRpb25zLnRvdGFsQ291bnQgJT4gb3JnYW5pemF0aW9uPCU9IHModXNlci5vcmdhbml6YXRpb25zLnRvdGFsQ291bnQpICU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgIDwlIH0gJT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8JSBpZiAoYmFzZS5yZXBvc2l0b3JpZXMpIHsgJT5cclxuICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgIDxoMiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yIDIuNUEyLjUgMi41IDAgMDE0LjUgMGg4Ljc1YS43NS43NSAwIDAxLjc1Ljc1djEyLjVhLjc1Ljc1IDAgMDEtLjc1Ljc1aC0yLjVhLjc1Ljc1IDAgMTEwLTEuNWgxLjc1di0yaC04YTEgMSAwIDAwLS43MTQgMS43Ljc1Ljc1IDAgMDEtMS4wNzIgMS4wNUEyLjQ5NSAyLjQ5NSAwIDAxMiAxMS41di05em0xMC41LTFWOWgtOGMtLjM1NiAwLS42OTQuMDc0LTEgLjIwOFYyLjVhMSAxIDAgMDExLTFoOHpNNSAxMi4yNXYzLjI1YS4yNS4yNSAwIDAwLjQuMmwxLjQ1LTEuMDg3YS4yNS4yNSAwIDAxLjMgMEw4LjYgMTUuN2EuMjUuMjUgMCAwMC40LS4ydi0zLjI1YS4yNS4yNSAwIDAwLS4yNS0uMjVoLTMuNWEuMjUuMjUgMCAwMC0uMjUuMjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICA8JT0gdXNlci5yZXBvc2l0b3JpZXMudG90YWxDb3VudCAlPiBSZXBvc2l0b3I8JT0gcyh1c2VyLnJlcG9zaXRvcmllcy50b3RhbENvdW50LCBcInlcIikgJT5cclxuICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04Ljc1Ljc1YS43NS43NSAwIDAwLTEuNSAwVjJoLS45ODRjLS4zMDUgMC0uNjA0LjA4LS44NjkuMjNsLTEuMjg4LjczN0EuMjUuMjUgMCAwMTMuOTg0IDNIMS43NWEuNzUuNzUgMCAwMDAgMS41aC40MjhMLjA2NiA5LjE5MmEuNzUuNzUgMCAwMC4xNTQuODM4bC41My0uNTMtLjUzLjUzdi4wMDFsLjAwMi4wMDIuMDAyLjAwMi4wMDYuMDA2LjAxNi4wMTUuMDQ1LjA0YTMuNTE0IDMuNTE0IDAgMDAuNjg2LjQ1QTQuNDkyIDQuNDkyIDAgMDAzIDExYy44OCAwIDEuNTU2LS4yMiAyLjAyMy0uNDU0YTMuNTE1IDMuNTE1IDAgMDAuNjg2LS40NWwuMDQ1LS4wNC4wMTYtLjAxNS4wMDYtLjAwNi4wMDItLjAwMi4wMDEtLjAwMkw1LjI1IDkuNWwuNTMuNTNhLjc1Ljc1IDAgMDAuMTU0LS44MzhMMy44MjIgNC41aC4xNjJjLjMwNSAwIC42MDQtLjA4Ljg2OS0uMjNsMS4yODktLjczN2EuMjUuMjUgMCAwMS4xMjQtLjAzM2guOTg0VjEzaC0yLjVhLjc1Ljc1IDAgMDAwIDEuNWg2LjVhLjc1Ljc1IDAgMDAwLTEuNWgtMi41VjMuNWguOTg0YS4yNS4yNSAwIDAxLjEyNC4wMzNsMS4yOS43MzZjLjI2NC4xNTIuNTYzLjIzMS44NjguMjMxaC4xNjJsLTIuMTEyIDQuNjkyYS43NS43NSAwIDAwLjE1NC44MzhsLjUzLS41My0uNTMuNTN2LjAwMWwuMDAyLjAwMi4wMDIuMDAyLjAwNi4wMDYuMDE2LjAxNS4wNDUuMDRhMy41MTcgMy41MTcgMCAwMC42ODYuNDVBNC40OTIgNC40OTIgMCAwMDEzIDExYy44OCAwIDEuNTU2LS4yMiAyLjAyMy0uNDU0YTMuNTEyIDMuNTEyIDAgMDAuNjg2LS40NWwuMDQ1LS4wNC4wMS0uMDEuMDA2LS4wMDUuMDA2LS4wMDYuMDAyLS4wMDIuMDAxLS4wMDItLjUyOS0uNTMxLjUzLjUzYS43NS43NSAwIDAwLjE1NC0uODM4TDEzLjgyMyA0LjVoLjQyN2EuNzUuNzUgMCAwMDAtMS41aC0yLjIzNGEuMjUuMjUgMCAwMS0uMTI0LS4wMzNsLTEuMjktLjczNkExLjc1IDEuNzUgMCAwMDkuNzM1IDJIOC43NVYuNzV6TTEuNjk1IDkuMjI3Yy4yODUuMTM1LjcxOC4yNzMgMS4zMDUuMjczczEuMDItLjEzOCAxLjMwNS0uMjczTDMgNi4zMjdsLTEuMzA1IDIuOXptMTAgMGMuMjg1LjEzNS43MTguMjczIDEuMzA1LjI3M3MxLjAyLS4xMzggMS4zMDUtLjI3M0wxMyA2LjMyN2wtMS4zMDUgMi45elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5saWNlbnNlcy5mYXZvcml0ZS5sZW5ndGgpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgUHJlZmVyIDwlPSBjb21wdXRlZC5saWNlbnNlcy5mYXZvcml0ZSAlPiBsaWNlbnNlXHJcbiAgICAgICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxyXG4gICAgICAgICAgICAgICAgICBObyBsaWNlbnNlIHByZWZlcmVuY2VcclxuICAgICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04Ljg3OC4zOTJhMS43NSAxLjc1IDAgMDAtMS43NTYgMGwtNS4yNSAzLjA0NUExLjc1IDEuNzUgMCAwMDEgNC45NTF2Ni4wOThjMCAuNjI0LjMzMiAxLjIuODcyIDEuNTE0bDUuMjUgMy4wNDVhMS43NSAxLjc1IDAgMDAxLjc1NiAwbDUuMjUtMy4wNDVjLjU0LS4zMTMuODcyLS44OS44NzItMS41MTRWNC45NTFjMC0uNjI0LS4zMzItMS4yLS44NzItMS41MTRMOC44NzguMzkyek03Ljg3NSAxLjY5YS4yNS4yNSAwIDAxLjI1IDBsNC42MyAyLjY4NUw4IDcuMTMzIDMuMjQ1IDQuMzc1bDQuNjMtMi42ODV6TTIuNSA1LjY3N3Y1LjM3MmMwIC4wOS4wNDcuMTcxLjEyNS4yMTZsNC42MjUgMi42ODNWOC40MzJMMi41IDUuNjc3em02LjI1IDguMjcxbDQuNjI1LTIuNjgzYS4yNS4yNSAwIDAwLjEyNS0uMjE2VjUuNjc3TDguNzUgOC40MzJ2NS41MTZ6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCU9IHVzZXIucGFja2FnZXMudG90YWxDb3VudCAlPiBQYWNrYWdlPCU9IHModXNlci5wYWNrYWdlcy50b3RhbENvdW50KSAlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiICA+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMS43NSAxLjVhLjI1LjI1IDAgMDAtLjI1LjI1djEyLjVjMCAuMTM4LjExMi4yNS4yNS4yNWgxMi41YS4yNS4yNSAwIDAwLjI1LS4yNVYxLjc1YS4yNS4yNSAwIDAwLS4yNS0uMjVIMS43NXpNMCAxLjc1QzAgLjc4NC43ODQgMCAxLjc1IDBoMTIuNUMxNS4yMTYgMCAxNiAuNzg0IDE2IDEuNzV2MTIuNUExLjc1IDEuNzUgMCAwMTE0LjI1IDE2SDEuNzVBMS43NSAxLjc1IDAgMDEwIDE0LjI1VjEuNzV6bTkuMjIgMy43MmEuNzUuNzUgMCAwMDAgMS4wNkwxMC42OSA4IDkuMjIgOS40N2EuNzUuNzUgMCAxMDEuMDYgMS4wNmwyLTJhLjc1Ljc1IDAgMDAwLTEuMDZsLTItMmEuNzUuNzUgMCAwMC0xLjA2IDB6TTYuNzggNi41M2EuNzUuNzUgMCAwMC0xLjA2LTEuMDZsLTIgMmEuNzUuNzUgMCAwMDAgMS4wNmwyIDJhLjc1Ljc1IDAgMTAxLjA2LTEuMDZMNS4zMSA4bDEuNDctMS40N3pcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8JT0gdXNlci5naXN0cy50b3RhbENvdW50ICU+IEdpc3Q8JT0gcyh1c2VyLmdpc3RzLnRvdGFsQ291bnQpICU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMubGluZXMpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIDwlPSBjb21wdXRlZC5wbHVnaW5zLmxpbmVzLmVycm9yID8gJ2Vycm9yJyA6ICcnICU+XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNzIgMy4yMmEuNzUuNzUgMCAwMTEuMDYgMS4wNkwyLjA2IDhsMy43MiAzLjcyYS43NS43NSAwIDExLTEuMDYgMS4wNkwuNDcgOC41M2EuNzUuNzUgMCAwMTAtMS4wNmw0LjI1LTQuMjV6bTYuNTYgMGEuNzUuNzUgMCAxMC0xLjA2IDEuMDZMMTMuOTQgOGwtMy43MiAzLjcyYS43NS43NSAwIDEwMS4wNiAxLjA2bDQuMjUtNC4yNWEuNzUuNzUgMCAwMDAtMS4wNmwtNC4yNS00LjI1elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5saW5lcy5lcnJvcikgeyAlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMubGluZXMuZXJyb3IgJT5cclxuICAgICAgICAgICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMubGluZXMuYWRkZWQgJT4gYWRkZWQsIDwlPSBjb21wdXRlZC5wbHVnaW5zLmxpbmVzLmRlbGV0ZWQgJT4gcmVtb3ZlZFxyXG4gICAgICAgICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTggLjI1YS43NS43NSAwIDAxLjY3My40MThsMS44ODIgMy44MTUgNC4yMS42MTJhLjc1Ljc1IDAgMDEuNDE2IDEuMjc5bC0zLjA0NiAyLjk3LjcxOSA0LjE5MmEuNzUuNzUgMCAwMS0xLjA4OC43OTFMOCAxMi4zNDdsLTMuNzY2IDEuOThhLjc1Ljc1IDAgMDEtMS4wODgtLjc5bC43Mi00LjE5NEwuODE4IDYuMzc0YS43NS43NSAwIDAxLjQxNi0xLjI4bDQuMjEtLjYxMUw3LjMyNy42NjhBLjc1Ljc1IDAgMDE4IC4yNXptMCAyLjQ0NUw2LjYxNSA1LjVhLjc1Ljc1IDAgMDEtLjU2NC40MWwtMy4wOTcuNDUgMi4yNCAyLjE4NGEuNzUuNzUgMCAwMS4yMTYuNjY0bC0uNTI4IDMuMDg0IDIuNzY5LTEuNDU2YS43NS43NSAwIDAxLjY5OCAwbDIuNzcgMS40NTYtLjUzLTMuMDg0YS43NS43NSAwIDAxLjIxNi0uNjY0bDIuMjQtMi4xODMtMy4wOTYtLjQ1YS43NS43NSAwIDAxLS41NjQtLjQxTDggMi42OTR2LjAwMXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8JT0gY29tcHV0ZWQucmVwb3NpdG9yaWVzLnN0YXJnYXplcnMgJT4gU3RhcmdhemVyPCU9IHMoY29tcHV0ZWQucmVwb3NpdG9yaWVzLnN0YXJnYXplcnMpICU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNSAzLjI1YS43NS43NSAwIDExLTEuNSAwIC43NS43NSAwIDAxMS41IDB6bTAgMi4xMjJhMi4yNSAyLjI1IDAgMTAtMS41IDB2Ljg3OEEyLjI1IDIuMjUgMCAwMDUuNzUgOC41aDEuNXYyLjEyOGEyLjI1MSAyLjI1MSAwIDEwMS41IDBWOC41aDEuNWEyLjI1IDIuMjUgMCAwMDIuMjUtMi4yNXYtLjg3OGEyLjI1IDIuMjUgMCAxMC0xLjUgMHYuODc4YS43NS43NSAwIDAxLS43NS43NWgtNC41QS43NS43NSAwIDAxNSA2LjI1di0uODc4em0zLjc1IDcuMzc4YS43NS43NSAwIDExLTEuNSAwIC43NS43NSAwIDAxMS41IDB6bTMtOC43NWEuNzUuNzUgMCAxMDAtMS41Ljc1Ljc1IDAgMDAwIDEuNXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8JT0gY29tcHV0ZWQucmVwb3NpdG9yaWVzLmZvcmtzICU+IEZvcms8JT0gcyhjb21wdXRlZC5yZXBvc2l0b3JpZXMuZm9ya3MpICU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMS42NzkgNy45MzJjLjQxMi0uNjIxIDEuMjQyLTEuNzUgMi4zNjYtMi43MTdDNS4xNzUgNC4yNDIgNi41MjcgMy41IDggMy41YzEuNDczIDAgMi44MjQuNzQyIDMuOTU1IDEuNzE1IDEuMTI0Ljk2NyAxLjk1NCAyLjA5NiAyLjM2NiAyLjcxN2EuMTE5LjExOSAwIDAxMCAuMTM2Yy0uNDEyLjYyMS0xLjI0MiAxLjc1LTIuMzY2IDIuNzE3QzEwLjgyNSAxMS43NTggOS40NzMgMTIuNSA4IDEyLjVjLTEuNDczIDAtMi44MjQtLjc0Mi0zLjk1NS0xLjcxNUMyLjkyIDkuODE4IDIuMDkgOC42OSAxLjY3OSA4LjA2OGEuMTE5LjExOSAwIDAxMC0uMTM2ek04IDJjLTEuOTgxIDAtMy42Ny45OTItNC45MzMgMi4wNzhDMS43OTcgNS4xNjkuODggNi40MjMuNDMgNy4xYTEuNjE5IDEuNjE5IDAgMDAwIDEuNzk4Yy40NS42NzggMS4zNjcgMS45MzIgMi42MzcgMy4wMjRDNC4zMjkgMTMuMDA4IDYuMDE5IDE0IDggMTRjMS45ODEgMCAzLjY3LS45OTIgNC45MzMtMi4wNzggMS4yNy0xLjA5MSAyLjE4Ny0yLjM0NSAyLjYzNy0zLjAyM2ExLjYxOSAxLjYxOSAwIDAwMC0xLjc5OGMtLjQ1LS42NzgtMS4zNjctMS45MzItMi42MzctMy4wMjNDMTEuNjcxIDIuOTkyIDkuOTgxIDIgOCAyem0wIDhhMiAyIDAgMTAwLTQgMiAyIDAgMDAwIDR6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnJlcG9zaXRvcmllcy53YXRjaGVycyAlPiBXYXRjaGVyPCU9IHMoY29tcHV0ZWQucmVwb3NpdG9yaWVzLndhdGNoZXJzKSAlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLnRyYWZmaWMpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIDwlPSBjb21wdXRlZC5wbHVnaW5zLnRyYWZmaWMuZXJyb3IgPyAnZXJyb3InIDogJycgJT5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMCAxLjc1QS43NS43NSAwIDAxLjc1IDFoNC4yNTNjMS4yMjcgMCAyLjMxNy41OSAzIDEuNTAxQTMuNzQ0IDMuNzQ0IDAgMDExMS4wMDYgMWg0LjI0NWEuNzUuNzUgMCAwMS43NS43NXYxMC41YS43NS43NSAwIDAxLS43NS43NWgtNC41MDdhMi4yNSAyLjI1IDAgMDAtMS41OTEuNjU5bC0uNjIyLjYyMWEuNzUuNzUgMCAwMS0xLjA2IDBsLS42MjItLjYyMUEyLjI1IDIuMjUgMCAwMDUuMjU4IDEzSC43NWEuNzUuNzUgMCAwMS0uNzUtLjc1VjEuNzV6bTguNzU1IDNhMi4yNSAyLjI1IDAgMDEyLjI1LTIuMjVIMTQuNXY5aC0zLjc1N2MtLjcxIDAtMS40LjIwMS0xLjk5Mi41NzJsLjAwNC03LjMyMnptLTEuNTA0IDcuMzI0bC4wMDQtNS4wNzMtLjAwMi0yLjI1M0EyLjI1IDIuMjUgMCAwMDUuMDAzIDIuNUgxLjV2OWgzLjc1N2EzLjc1IDMuNzUgMCAwMTEuOTk0LjU3NHpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMudHJhZmZpYy5lcnJvcikgeyAlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMudHJhZmZpYy5lcnJvciAlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwlIH0gZWxzZSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8JT0gY29tcHV0ZWQucGx1Z2lucy50cmFmZmljLnZpZXdzLmNvdW50ICU+IHZpZXc8JT0gcyhjb21wdXRlZC5wbHVnaW5zLnRyYWZmaWMudmlld3MuY291bnQpICU+IGluIGxhc3QgdHdvIHdlZWtzXHJcbiAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgPCUgfSAlPlxyXG5cclxuICAgICAgPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXApIHsgJT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcblxyXG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgPGgzPklzc3VlczwvaDM+XHJcbiAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmVycm9yKSB7ICU+XHJcbiAgICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNDcuMjJBLjc1Ljc1IDAgMDE1IDBoNmEuNzUuNzUgMCAwMS41My4yMmw0LjI1IDQuMjVjLjE0MS4xNC4yMi4zMzEuMjIuNTN2NmEuNzUuNzUgMCAwMS0uMjIuNTNsLTQuMjUgNC4yNUEuNzUuNzUgMCAwMTExIDE2SDVhLjc1Ljc1IDAgMDEtLjUzLS4yMkwuMjIgMTEuNTNBLjc1Ljc1IDAgMDEwIDExVjVhLjc1Ljc1IDAgMDEuMjItLjUzTDQuNDcuMjJ6bS44NCAxLjI4TDEuNSA1LjMxdjUuMzhsMy44MSAzLjgxaDUuMzhsMy44MS0zLjgxVjUuMzFMMTAuNjkgMS41SDUuMzF6TTggNGEuNzUuNzUgMCAwMS43NS43NXYzLjVhLjc1Ljc1IDAgMDEtMS41IDB2LTMuNUEuNzUuNzUgMCAwMTggNHptMCA4YTEgMSAwIDEwMC0yIDEgMSAwIDAwMCAyelwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuZXJyb3IgJT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYmFyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjIwXCIgaGVpZ2h0PVwiOFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hc2sgaWQ9XCJpc3N1ZXMtYmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjIyMFwiIGhlaWdodD1cIjhcIiBmaWxsPVwid2hpdGVcIiByeD1cIjVcIi8+XHJcbiAgICAgICAgICAgICAgICA8L21hc2s+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBtYXNrPVwidXJsKCNpc3N1ZXMtYmFyKVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjwlPSBjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmlzc3Vlcy5jb3VudCA/IDAgOiAyMjAgJT5cIiBoZWlnaHQ9XCI4XCIgZmlsbD1cIiNkMWQ1ZGFcIi8+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBtYXNrPVwidXJsKCNpc3N1ZXMtYmFyKVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjwlPSAoY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY2xvc2VkL2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuaXNzdWVzLmNvdW50KSoyMjAgfHwgMCAlPlwiIGhlaWdodD1cIjhcIiBmaWxsPVwiI2Q3M2E0OVwiLz5cclxuICAgICAgICAgICAgICAgIDxyZWN0IG1hc2s9XCJ1cmwoI2lzc3Vlcy1iYXIpXCIgeD1cIjwlPSAoY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY2xvc2VkL2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuaXNzdWVzLmNvdW50KSoyMjAgfHwgMCAlPlwiIHk9XCIwXCIgd2lkdGg9XCI8JT0gKDEtY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY2xvc2VkL2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuaXNzdWVzLmNvdW50KSoyMjAgfHwgMCAlPlwiIGhlaWdodD1cIjhcIiBmaWxsPVwiIzI4YTc0NVwiLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaG9yaXpvbnRhbCBmaWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsPVwiI2Q3M2E0OVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNSA4YTYuNSA2LjUgMCAwMTEwLjY1LTUuMDAzLjc1Ljc1IDAgMDAuOTU5LTEuMTUzIDggOCAwIDEwMi41OTIgOC4zMy43NS43NSAwIDEwLTEuNDQ0LS40MDdBNi41IDYuNSAwIDAxMS41IDh6TTggMTJhMSAxIDAgMTAwLTIgMSAxIDAgMDAwIDJ6bTAtOGEuNzUuNzUgMCAwMS43NS43NXYzLjVhLjc1Ljc1IDAgMTEtMS41IDB2LTMuNUEuNzUuNzUgMCAwMTggNHptNC43OCA0LjI4bDMtM2EuNzUuNzUgMCAwMC0xLjA2LTEuMDZsLTIuNDcgMi40Ny0uOTctLjk3YS43NDkuNzQ5IDAgMTAtMS4wNiAxLjA2bDEuNSAxLjVhLjc1Ljc1IDAgMDAxLjA2IDB6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLXdyYXBcIj48JT0gY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY2xvc2VkICU+IENsb3NlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbD1cIiMyOGE3NDVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04IDEuNWE2LjUgNi41IDAgMTAwIDEzIDYuNSA2LjUgMCAwMDAtMTN6TTAgOGE4IDggMCAxMTE2IDBBOCA4IDAgMDEwIDh6bTkgM2ExIDEgMCAxMS0yIDAgMSAxIDAgMDEyIDB6bS0uMjUtNi4yNWEuNzUuNzUgMCAwMC0xLjUgMHYzLjVhLjc1Ljc1IDAgMDAxLjUgMHYtMy41elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuby13cmFwXCI+PCU9IGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuaXNzdWVzLm9wZW4gJT4gT3Blbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgPGgzPlB1bGwgcmVxdWVzdHM8L2gzPlxyXG4gICAgICAgICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5lcnJvcikgeyAlPlxyXG4gICAgICAgICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk00LjQ3LjIyQS43NS43NSAwIDAxNSAwaDZhLjc1Ljc1IDAgMDEuNTMuMjJsNC4yNSA0LjI1Yy4xNDEuMTQuMjIuMzMxLjIyLjUzdjZhLjc1Ljc1IDAgMDEtLjIyLjUzbC00LjI1IDQuMjVBLjc1Ljc1IDAgMDExMSAxNkg1YS43NS43NSAwIDAxLS41My0uMjJMLjIyIDExLjUzQS43NS43NSAwIDAxMCAxMVY1YS43NS43NSAwIDAxLjIyLS41M0w0LjQ3LjIyem0uODQgMS4yOEwxLjUgNS4zMXY1LjM4bDMuODEgMy44MWg1LjM4bDMuODEtMy44MVY1LjMxTDEwLjY5IDEuNUg1LjMxek04IDRhLjc1Ljc1IDAgMDEuNzUuNzV2My41YS43NS43NSAwIDAxLTEuNSAwdi0zLjVBLjc1Ljc1IDAgMDE4IDR6bTAgOGExIDEgMCAxMDAtMiAxIDEgMCAwMDAgMnpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDwlPSBjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLmVycm9yICU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgICAgIDwlIH0gZWxzZSB7ICU+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImJhclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIyMFwiIGhlaWdodD1cIjhcIj5cclxuICAgICAgICAgICAgICAgIDxtYXNrIGlkPVwicHItYmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjIyMFwiIGhlaWdodD1cIjhcIiBmaWxsPVwid2hpdGVcIiByeD1cIjVcIi8+XHJcbiAgICAgICAgICAgICAgICA8L21hc2s+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBtYXNrPVwidXJsKCNwci1iYXIpXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiPCU9IGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIuY291bnQgPyAwIDogMjIwICU+XCIgaGVpZ2h0PVwiOFwiIGZpbGw9XCIjZDFkNWRhXCIvPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgbWFzaz1cInVybCgjcHItYmFyKVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjwlPSAoY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5wci5tZXJnZWQvY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5wci5jb3VudCkqMjIwIHx8IDAgJT5cIiBoZWlnaHQ9XCI4XCIgZmlsbD1cIiM2ZjQyYzFcIi8+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBtYXNrPVwidXJsKCNwci1iYXIpXCIgeD1cIjwlPSAoY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5wci5tZXJnZWQvY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5wci5jb3VudCkqMjIwIHx8IDAgJT5cIiB5PVwiMFwiIHdpZHRoPVwiPCU9ICgxLWNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIubWVyZ2VkL2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIuY291bnQpKjIyMCB8fCAwICU+XCIgaGVpZ2h0PVwiOFwiIGZpbGw9XCIjMjhhNzQ1XCIvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBob3Jpem9udGFsIGZpbGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGw9XCIjNmY0MmMxXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNSAzLjI1NFYzLjI1di4wMDVhLjc1Ljc1IDAgMTEwLS4wMDV2LjAwNHptLjQ1IDEuOWEyLjI1IDIuMjUgMCAxMC0xLjk1LjIxOHY1LjI1NmEyLjI1IDIuMjUgMCAxMDEuNSAwVjcuMTIzQTUuNzM1IDUuNzM1IDAgMDA5LjI1IDloMS4zNzhhMi4yNTEgMi4yNTEgMCAxMDAtMS41SDkuMjVhNC4yNSA0LjI1IDAgMDEtMy44LTIuMzQ2ek0xMi43NSA5YS43NS43NSAwIDEwMC0xLjUuNzUuNzUgMCAwMDAgMS41em0tOC41IDQuNWEuNzUuNzUgMCAxMDAtMS41Ljc1Ljc1IDAgMDAwIDEuNXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm8td3JhcFwiPjwlPSBjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwLnByLm1lcmdlZCAlPiBNZXJnZWQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGZpbGw9XCIjMjhhNzQ1XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNy4xNzcgMy4wNzNMOS41NzMuNjc3QS4yNS4yNSAwIDAxMTAgLjg1NHY0Ljc5MmEuMjUuMjUgMCAwMS0uNDI3LjE3N0w3LjE3NyAzLjQyN2EuMjUuMjUgMCAwMTAtLjM1NHpNMy43NSAyLjVhLjc1Ljc1IDAgMTAwIDEuNS43NS43NSAwIDAwMC0xLjV6bS0yLjI1Ljc1YTIuMjUgMi4yNSAwIDExMyAyLjEyMnY1LjI1NmEyLjI1MSAyLjI1MSAwIDExLTEuNSAwVjUuMzcyQTIuMjUgMi4yNSAwIDAxMS41IDMuMjV6TTExIDIuNWgtMVY0aDFhMSAxIDAgMDExIDF2NS42MjhhMi4yNTEgMi4yNTEgMCAxMDEuNSAwVjVBMi41IDIuNSAwIDAwMTEgMi41em0xIDEwLjI1YS43NS43NSAwIDExMS41IDAgLjc1Ljc1IDAgMDEtMS41IDB6TTMuNzUgMTJhLjc1Ljc1IDAgMTAwIDEuNS43NS43NSAwIDAwMC0xLjV6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLXdyYXBcIj48JT0gY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5wci5vcGVuICU+IE9wZW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPCUgfSAlPlxyXG5cclxuICAgICAgPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzKSB7ICU+XHJcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgICAgIDxoMz5Nb3N0IHVzZWQgbGFuZ3VhZ2VzPC9oMz5cclxuICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmxhbmd1YWdlcy5lcnJvcikgeyAlPlxyXG4gICAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk00LjQ3LjIyQS43NS43NSAwIDAxNSAwaDZhLjc1Ljc1IDAgMDEuNTMuMjJsNC4yNSA0LjI1Yy4xNDEuMTQuMjIuMzMxLjIyLjUzdjZhLjc1Ljc1IDAgMDEtLjIyLjUzbC00LjI1IDQuMjVBLjc1Ljc1IDAgMDExMSAxNkg1YS43NS43NSAwIDAxLS41My0uMjJMLjIyIDExLjUzQS43NS43NSAwIDAxMCAxMVY1YS43NS43NSAwIDAxLjIyLS41M0w0LjQ3LjIyem0uODQgMS4yOEwxLjUgNS4zMXY1LjM4bDMuODEgMy44MWg1LjM4bDMuODEtMy44MVY1LjMxTDEwLjY5IDEuNUg1LjMxek04IDRhLjc1Ljc1IDAgMDEuNzUuNzV2My41YS43NS43NSAwIDAxLTEuNSAwdi0zLjVBLjc1Ljc1IDAgMDE4IDR6bTAgOGExIDEgMCAxMDAtMiAxIDEgMCAwMDAgMnpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8JT0gY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMuZXJyb3IgJT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgPCUgfSBlbHNlIHsgJT5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImJhclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQ2MFwiIGhlaWdodD1cIjhcIj5cclxuICAgICAgICAgICAgICA8bWFzayBpZD1cImxhbmd1YWdlcy1iYXJcIj5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ2MFwiIGhlaWdodD1cIjhcIiBmaWxsPVwid2hpdGVcIiByeD1cIjVcIi8+XHJcbiAgICAgICAgICAgICAgPC9tYXNrPlxyXG4gICAgICAgICAgICAgIDxyZWN0IG1hc2s9XCJ1cmwoI2xhbmd1YWdlcy1iYXIpXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiPCU9IGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzLmZhdm9yaXRlcy5sZW5ndGggPyAwIDogNDYwICU+XCIgaGVpZ2h0PVwiOFwiIGZpbGw9XCIjZDFkNWRhXCIvPlxyXG4gICAgICAgICAgICAgIDwlIGZvciAoY29uc3Qge25hbWUsIHZhbHVlLCBjb2xvciwgeH0gb2YgY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMuZmF2b3JpdGVzKSB7ICU+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBtYXNrPVwidXJsKCNsYW5ndWFnZXMtYmFyKVwiIHg9XCI8JT0geCo0NjAgJT5cIiB5PVwiMFwiIHdpZHRoPVwiPCU9IHZhbHVlKjQ2MCAlPlwiIGhlaWdodD1cIjhcIiBmaWxsPVwiPCU9IGNvbG9yICU+XCIvPlxyXG4gICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjZW50ZXIgaG9yaXpvbnRhbC13cmFwIGZpbGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8JSBmb3IgKGNvbnN0IHtuYW1lLCB2YWx1ZSwgY29sb3J9IG9mIGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzLmZhdm9yaXRlcykgeyAlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNlbnRlciBuby13cmFwIGxhbmd1YWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsPVwiPCU9IGNvbG9yICU+XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNOCA0YTQgNCAwIDEwMCA4IDQgNCAwIDAwMC04elwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCU9IG5hbWUgJT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICA8JSB9ICU+XHJcblxyXG4gICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQpIHsgJT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgPGgyIGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTQuMDY0IDBhOC43NSA4Ljc1IDAgMDAtNi4xODcgMi41NjNsLS40NTkuNDU4Yy0uMzE0LjMxNC0uNjE2LjY0MS0uOTA0Ljk3OUgzLjMxYTEuNzUgMS43NSAwIDAwLTEuNDkuODMzTC4xMSA3LjYwN2EuNzUuNzUgMCAwMC40MTggMS4xMWwzLjEwMi45NTRjLjAzNy4wNTEuMDc5LjEuMTI0LjE0NWwyLjQyOSAyLjQyOGMuMDQ2LjA0Ni4wOTQuMDg4LjE0NS4xMjVsLjk1NCAzLjEwMmEuNzUuNzUgMCAwMDEuMTEuNDE4bDIuNzc0LTEuNzA3YTEuNzUgMS43NSAwIDAwLjgzMy0xLjQ5VjkuNDg1Yy4zMzgtLjI4OC42NjUtLjU5Ljk3OS0uOTA0bC40NTgtLjQ1OUE4Ljc1IDguNzUgMCAwMDE2IDEuOTM2VjEuNzVBMS43NSAxLjc1IDAgMDAxNC4yNSAwaC0uMTg2ek0xMC41IDEwLjYyNWMtLjA4OC4wNi0uMTc3LjExOC0uMjY2LjE3NWwtMi4zNSAxLjUyMS41NDggMS43ODMgMS45NDktMS4yYS4yNS4yNSAwIDAwLjExOS0uMjEzdi0yLjA2NnpNMy42NzggOC4xMTZMNS4yIDUuNzY2Yy4wNTgtLjA5LjExNy0uMTc4LjE3Ni0uMjY2SDMuMzA5YS4yNS4yNSAwIDAwLS4yMTMuMTE5bC0xLjIgMS45NSAxLjc4Mi41NDd6bTUuMjYtNC40OTNBNy4yNSA3LjI1IDAgMDExNC4wNjMgMS41aC4xODZhLjI1LjI1IDAgMDEuMjUuMjV2LjE4NmE3LjI1IDcuMjUgMCAwMS0yLjEyMyA1LjEyN2wtLjQ1OS40NThhMTUuMjEgMTUuMjEgMCAwMS0yLjQ5OSAyLjAybC0yLjMxNyAxLjUtMi4xNDMtMi4xNDMgMS41LTIuMzE3YTE1LjI1IDE1LjI1IDAgMDEyLjAyLTIuNWwuNDU4LS40NThoLjAwMnpNMTIgNWExIDEgMCAxMS0yIDAgMSAxIDAgMDEyIDB6bS04LjQ0IDkuNTZhMS41IDEuNSAwIDEwLTIuMTItMi4xMmMtLjczNC43My0xLjA0NyAyLjMzMi0xLjE1IDMuMDAzYS4yMy4yMyAwIDAwLjI2NS4yNjVjLjY3MS0uMTAzIDIuMjczLS40MTYgMy4wMDUtMS4xNDh6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIFBhZ2VTcGVlZCBJbnNpZ2h0c1xyXG4gICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNy43NzUgMy4yNzVhLjc1Ljc1IDAgMDAxLjA2IDEuMDZsMS4yNS0xLjI1YTIgMiAwIDExMi44MyAyLjgzbC0yLjUgMi41YTIgMiAwIDAxLTIuODMgMCAuNzUuNzUgMCAwMC0xLjA2IDEuMDYgMy41IDMuNSAwIDAwNC45NSAwbDIuNS0yLjVhMy41IDMuNSAwIDAwLTQuOTUtNC45NWwtMS4yNSAxLjI1em0tNC42OSA5LjY0YTIgMiAwIDAxMC0yLjgzbDIuNS0yLjVhMiAyIDAgMDEyLjgzIDAgLjc1Ljc1IDAgMDAxLjA2LTEuMDYgMy41IDMuNSAwIDAwLTQuOTUgMGwtMi41IDIuNWEzLjUgMy41IDAgMDA0Ljk1IDQuOTVsMS4yNS0xLjI1YS43NS43NSAwIDAwLTEuMDYtMS4wNmwtMS4yNSAxLjI1YTIgMiAwIDAxLTIuODMgMHpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPCU9IHVzZXIud2Vic2l0ZVVybCAlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQuZXJyb3IpIHsgJT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPHNlY3Rpb24+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC40Ny4yMkEuNzUuNzUgMCAwMTUgMGg2YS43NS43NSAwIDAxLjUzLjIybDQuMjUgNC4yNWMuMTQxLjE0LjIyLjMzMS4yMi41M3Y2YS43NS43NSAwIDAxLS4yMi41M2wtNC4yNSA0LjI1QS43NS43NSAwIDAxMTEgMTZINWEuNzUuNzUgMCAwMS0uNTMtLjIyTC4yMiAxMS41M0EuNzUuNzUgMCAwMTAgMTFWNWEuNzUuNzUgMCAwMS4yMi0uNTNMNC40Ny4yMnptLjg0IDEuMjhMMS41IDUuMzF2NS4zOGwzLjgxIDMuODFoNS4zOGwzLjgxLTMuODFWNS4zMUwxMC42OSAxLjVINS4zMXpNOCA0YS43NS43NSAwIDAxLjc1Ljc1djMuNWEuNzUuNzUgMCAwMS0xLjUgMHYtMy41QS43NS43NSAwIDAxOCA0em0wIDhhMSAxIDAgMTAwLTIgMSAxIDAgMDAwIDJ6XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCU9IGNvbXB1dGVkLnBsdWdpbnMucGFnZXNwZWVkLmVycm9yICU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwlIH0gZWxzZSB7ICU+XHJcbiAgICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmaWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjYXRlZ29yaWVzXCI+XHJcbiAgICAgICAgICAgICAgICA8JSBmb3IgKGNvbnN0IHtzY29yZSwgdGl0bGV9IG9mIGNvbXB1dGVkLnBsdWdpbnMucGFnZXNwZWVkLnNjb3JlcykgeyAlPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllIGNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTIwIDEyMFwiIHdpZHRoPVwiNTBcIiBoZWlnaHQ9XCI1MFwiIGNsYXNzPVwiZ2F1Z2UgPCU9ICFOdW1iZXIuaXNOYU4oc2NvcmUpID8gKHNjb3JlID49IDAuOSA/ICdoaWdoJyA6IHNjb3JlID49IDAuNSA/ICdhdmVyYWdlJyA6ICdsb3cnKSA6ICcnICU+XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiZ2F1Z2UtYmFzZVwiIHI9XCI1M1wiIGN4PVwiNjBcIiBjeT1cIjYwXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8JSBpZiAoIU51bWJlci5pc05hTihzY29yZSkpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cImdhdWdlLWFyY1wiIHRyYW5zZm9ybT1cInJvdGF0ZSgtOTAgNjAgNjApXCIgcj1cIjUzXCIgY3g9XCI2MFwiIGN5PVwiNjBcIiBzdHJva2UtZGFzaGFycmF5PVwiPCU9IHNjb3JlICogMzI5ICU+IDMyOVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dCB4PVwiNjBcIiB5PVwiNjBcIiBkb21pbmFudC1iYXNlbGluZT1cImNlbnRyYWxcIiA+PCU9IE1hdGgucm91bmQoc2NvcmUqMTAwKSAlPjwvdGV4dD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwlIH0gZWxzZSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0IHg9XCI2MFwiIHk9XCI2MFwiIGRvbWluYW50LWJhc2VsaW5lPVwiY2VudHJhbFwiID4tPC90ZXh0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj48JT0gdGl0bGUgJT48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCUgfSAlPlxyXG4gICAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPCUgfSAlPlxyXG4gICAgICA8JSB9ICU+XHJcblxyXG4gICAgICA8JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5oYWJpdHMpIHsgJT5cclxuICAgICAgICA8c2VjdGlvbj5cclxuICAgICAgICAgIDxoMiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04IDEuNWMtMi4zNjMgMC00IDEuNjktNCAzLjc1IDAgLjk4NC40MjQgMS42MjUuOTg0IDIuMzA0bC4yMTQuMjUzYy4yMjMuMjY0LjQ3LjU1Ni42NzMuODQ4LjI4NC40MTEuNTM3Ljg5Ni42MjEgMS40OWEuNzUuNzUgMCAwMS0xLjQ4NC4yMTFjLS4wNC0uMjgyLS4xNjMtLjU0Ny0uMzctLjg0N2E4LjY5NSA4LjY5NSAwIDAwLS41NDItLjY4Yy0uMDg0LS4xLS4xNzMtLjIwNS0uMjY4LS4zMkMzLjIwMSA3Ljc1IDIuNSA2Ljc2NiAyLjUgNS4yNSAyLjUgMi4zMSA0Ljg2MyAwIDggMHM1LjUgMi4zMSA1LjUgNS4yNWMwIDEuNTE2LS43MDEgMi41LTEuMzI4IDMuMjU5LS4wOTUuMTE1LS4xODQuMjItLjI2OC4zMTktLjIwNy4yNDUtLjM4My40NTMtLjU0MS42ODEtLjIwOC4zLS4zMy41NjUtLjM3Ljg0N2EuNzUuNzUgMCAwMS0xLjQ4NS0uMjEyYy4wODQtLjU5My4zMzctMS4wNzguNjIxLTEuNDg5LjIwMy0uMjkyLjQ1LS41ODQuNjczLS44NDguMDc1LS4wODguMTQ3LS4xNzMuMjEzLS4yNTMuNTYxLS42NzkuOTg1LTEuMzIuOTg1LTIuMzA0IDAtMi4wNi0xLjYzNy0zLjc1LTQtMy43NXpNNiAxNS4yNWEuNzUuNzUgMCAwMS43NS0uNzVoMi41YS43NS43NSAwIDAxMCAxLjVoLTIuNWEuNzUuNzUgMCAwMS0uNzUtLjc1ek01Ljc1IDEyYS43NS43NSAwIDAwMCAxLjVoNC41YS43NS43NSAwIDAwMC0xLjVoLTQuNXpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgIENvZGluZyBoYWJpdHNcclxuICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDwlIGlmIChjb21wdXRlZC5wbHVnaW5zLmhhYml0cy5lcnJvcikgeyAlPlxyXG4gICAgICAgICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk00LjQ3LjIyQS43NS43NSAwIDAxNSAwaDZhLjc1Ljc1IDAgMDEuNTMuMjJsNC4yNSA0LjI1Yy4xNDEuMTQuMjIuMzMxLjIyLjUzdjZhLjc1Ljc1IDAgMDEtLjIyLjUzbC00LjI1IDQuMjVBLjc1Ljc1IDAgMDExMSAxNkg1YS43NS43NSAwIDAxLS41My0uMjJMLjIyIDExLjUzQS43NS43NSAwIDAxMCAxMVY1YS43NS43NSAwIDAxLjIyLS41M0w0LjQ3LjIyem0uODQgMS4yOEwxLjUgNS4zMXY1LjM4bDMuODEgMy44MWg1LjM4bDMuODEtMy44MVY1LjMxTDEwLjY5IDEuNUg1LjMxek04IDRhLjc1Ljc1IDAgMDEuNzUuNzV2My41YS43NS43NSAwIDAxLTEuNSAwdi0zLjVBLjc1Ljc1IDAgMDE4IDR6bTAgOGExIDEgMCAxMDAtMiAxIDEgMCAwMDAgMnpcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDwlPSBjb21wdXRlZC5wbHVnaW5zLmhhYml0cy5lcnJvciAlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxyXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImhhYml0c1wiPlxyXG4gICAgICAgICAgICAgICAgPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMuaGFiaXRzLmluZGVudHMuc3R5bGUpIHsgJT5cclxuICAgICAgICAgICAgICAgICAgPGxpPlVzZSA8JT0gY29tcHV0ZWQucGx1Z2lucy5oYWJpdHMuaW5kZW50cy5zdHlsZSAlPiBmb3IgaW5kZW50czwvbGk+XHJcbiAgICAgICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICAgICAgICA8JSBpZiAoIU51bWJlci5pc05hTihjb21wdXRlZC5wbHVnaW5zLmhhYml0cy5jb21taXRzLmhvdXIpKSB7ICU+XHJcbiAgICAgICAgICAgICAgICAgIDxsaT5Nb3N0bHkgcHVzaCBjb2RlIGFyb3VuZCA8JT0gY29tcHV0ZWQucGx1Z2lucy5oYWJpdHMuY29tbWl0cy5ob3VyICU+OjAwPC9saT5cclxuICAgICAgICAgICAgICAgIDwlIH0gJT5cclxuICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8JSB9ICU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgIDwlIH0gJT5cclxuXHJcbiAgICAgIDwlIGlmIChiYXNlLm1ldGFkYXRhKSB7ICU+XHJcbiAgICAgICAgPGZvb3Rlcj5cclxuICAgICAgICAgIDxzcGFuPlRoZXNlIG1ldHJpY3MgPCU9ICFjb21wdXRlZC50b2tlbi5zY29wZXMuaW5jbHVkZXMoXCJyZXBvXCIpID8gXCJkb2VzIG5vdCBpbmNsdWRlXCIgOiBcImluY2x1ZGVzXCIgJT4gcHJpdmF0ZSBjb250cmlidXRpb25zPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+TGFzdCB1cGRhdGVkIDwlPSBuZXcgRGF0ZSgpICU+PC9zcGFuPlxyXG4gICAgICAgIDwvZm9vdGVyPlxyXG4gICAgICA8JSB9ICU+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9mb3JlaWduT2JqZWN0PlxyXG48L3N2Zz4iLCJzdHlsZSI6Ii8qIFNWRyBnbG9iYWwgY29udGV4dCAqL1xyXG4gIHN2ZyB7XHJcbiAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiwgQXBwbGUgQ29sb3IgRW1vamksIFNlZ29lIFVJIEVtb2ppO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgY29sb3I6ICM3Nzc3Nzc7XHJcbiAgfVxyXG5cclxuLyogSGVhZGVycyAqL1xyXG4gIGgxLCBoMiwgaDMge1xyXG4gICAgbWFyZ2luOiA4cHggMCAycHg7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgY29sb3I6ICMwMzY2ZDY7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gIH1cclxuICBoMSBzdmcsIGgyIHN2ZywgaDMgc3ZnIHtcclxuICAgIGZpbGw6IGN1cnJlbnRDb2xvcjtcclxuICB9XHJcbiAgaDEge1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgfVxyXG4gIGgyIHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICB9XHJcbiAgaDMge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gIH1cclxuXHJcbi8qIEZpZWxkcyAqL1xyXG4gIHNlY3Rpb24gPiAuZmllbGQge1xyXG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcclxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xyXG4gIH1cclxuICAuZmllbGQge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAycHg7XHJcbiAgfVxyXG4gIC5maWVsZCBzdmcge1xyXG4gICAgbWFyZ2luOiAwIDhweDtcclxuICAgIGZpbGw6ICM5NTlkYTU7XHJcbiAgfVxyXG4gIC5maWVsZC5lcnJvciB7XHJcbiAgICBjb2xvcjogI2NiMjQzMTtcclxuICB9XHJcbiAgLmZpZWxkLmVycm9yIHN2ZyB7XHJcbiAgICBmaWxsOiAjY2IyNDMxO1xyXG4gIH1cclxuXHJcbi8qIERpc3BsYXlzICovXHJcbiAgLnJvdyB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gIH1cclxuICAucm93IHNlY3Rpb24ge1xyXG4gICAgZmxleDogMSAxIDA7XHJcbiAgfVxyXG4gIC5jb2x1bW4ge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIH1cclxuICAuY2VudGVyIHtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIH1cclxuICAuaG9yaXpvbnRhbCB7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcclxuICB9XHJcbiAgLmhvcml6b250YWwtd3JhcCB7XHJcbiAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgfVxyXG4gIC5ob3Jpem9udGFsIC5maWVsZCB7XHJcbiAgICBmbGV4OiAxIDEgMDtcclxuICB9XHJcbiAgLm5vLXdyYXAge1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICB9XHJcbiAgLmZpbGwtd2lkdGgge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgfVxyXG5cclxuLyogVXNlciBhdmF0YXIgKi9cclxuICAuYXZhdGFyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICBtYXJnaW46IDAgNnB4O1xyXG4gIH1cclxuXHJcbi8qIENvbW1pdCBjYWxlbmRhciAqL1xyXG4gIC5jYWxlbmRhci5maWVsZCB7XHJcbiAgICBtYXJnaW46IDRweCAwO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDdweDtcclxuICB9XHJcbiAgLmNhbGVuZGFyIC5kYXkge1xyXG4gICAgb3V0bGluZTogMXB4IHNvbGlkIHJnYmEoMjcsMzEsMzUsLjA0KTtcclxuICAgIG91dGxpbmUtb2Zmc2V0OiAtMXB4O1xyXG4gIH1cclxuXHJcbi8qIFByb2dyZXNzIGJhcnMgKi9cclxuICBzdmcuYmFyIHtcclxuICAgIG1hcmdpbjogNHB4IDA7XHJcbiAgfVxyXG5cclxuLyogTGFuZ3VhZ2UgKi9cclxuICAuZmllbGQubGFuZ3VhZ2Uge1xyXG4gICAgbWFyZ2luOiAwIDhweDtcclxuICAgIGZsZXgtZ3JvdzogMDtcclxuICB9XHJcblxyXG4gIC5maWVsZC5sYW5ndWFnZSBzbWFsbCB7XHJcbiAgICBtYXJnaW4tbGVmdDogNHB4O1xyXG4gICAgb3BhY2l0eTogLjc7XHJcbiAgfVxyXG5cclxuLyogSGFiaXRzICovXHJcbiAgLmhhYml0cyB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDM3cHg7XHJcbiAgfVxyXG5cclxuLyogRm9vdGVyICovXHJcbiAgZm9vdGVyIHtcclxuICAgIG1hcmdpbi10b3A6IDhweDtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcclxuICAgIG9wYWNpdHk6IDAuNTtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xyXG4gIH1cclxuXHJcbi8qIFNwZWVkIHRlc3QgY2F0ZWdvcmllcyAqL1xyXG4gIC5jYXRlZ29yaWVzIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XHJcbiAgICBtYXJnaW4tdG9wOiA0cHg7XHJcbiAgfVxyXG4gIC5jYXRlZ29yaWUge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgZmxleDogMSAxIDA7XHJcbiAgfVxyXG5cclxuLyogR2F1Z2VzICovXHJcbiAgLmdhdWdlIHtcclxuICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDtcclxuICAgIGZpbGw6IG5vbmU7XHJcbiAgfVxyXG4gIC5nYXVnZS5oaWdoIHtcclxuICAgIGNvbG9yOiAjMThiNjYzO1xyXG4gIH1cclxuICAuZ2F1Z2UuYXZlcmFnZSB7XHJcbiAgICBjb2xvcjogI2ZiOGMwMDtcclxuICB9XHJcbiAgLmdhdWdlLmxvdyB7XHJcbiAgICBjb2xvcjogI2U1MzkzNTtcclxuICB9XHJcbiAgLmdhdWdlLWJhc2UsIC5nYXVnZS1hcmMge1xyXG4gICAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7XHJcbiAgICBzdHJva2Utd2lkdGg6IDEwO1xyXG4gIH1cclxuICAuZ2F1Z2UtYmFzZSB7XHJcbiAgICBzdHJva2Utb3BhY2l0eTogLjI7XHJcbiAgfVxyXG4gIC5nYXVnZS1hcmMge1xyXG4gICAgZmlsbDogbm9uZTtcclxuICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwO1xyXG4gICAgYW5pbWF0aW9uLWRlbGF5OiAyNTBtcztcclxuICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLWdhdWdlIDFzIGVhc2UgZm9yd2FyZHNcclxuICB9XHJcbiAgLmdhdWdlIHRleHQge1xyXG4gICAgZmlsbDogY3VycmVudENvbG9yO1xyXG4gICAgZm9udC1zaXplOiA0MHB4O1xyXG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcclxuICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7XHJcbiAgICBmb250LXdlaWdodDogNjAwO1xyXG4gIH1cclxuICAuZ2F1Z2UgLnRpdGxlIHtcclxuICAgIGZvbnQtc2l6ZTogMThweDtcclxuICAgIGNvbG9yOiAjNzc3Nzc3O1xyXG4gIH1cclxuICBAa2V5ZnJhbWVzIGFuaW1hdGlvbi1nYXVnZSB7XHJcbiAgICBmcm9tIHtcclxuICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMCAzMjk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuLyogRmFkZSBhbmltYXRpb24gKi9cclxuICAuYWYge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLWZhZGUgMXMgZWFzZSBmb3J3YXJkcztcclxuICB9XHJcbiAgQGtleWZyYW1lcyBhbmltYXRpb24tZmFkZSB7XHJcbiAgICBmcm9tIHtcclxuICAgICAgb3BhY2l0eTogMDtcclxuICAgIH1cclxuICAgIHRvIHtcclxuICAgICAgb3BhY2l0eTogMTtcclxuICAgIH1cclxuICB9In0sInRlcm1pbmFsIjp7InF1ZXJ5IjoicXVlcnkgTWV0cmljcyB7XHJcbiAgdXNlcihsb2dpbjogJGxvZ2luKSB7XHJcbiAgICBkYXRhYmFzZUlkXHJcbiAgICBuYW1lXHJcbiAgICBsb2dpblxyXG4gICAgY3JlYXRlZEF0XHJcbiAgICBhdmF0YXJVcmxcclxuICAgIHdlYnNpdGVVcmxcclxuICAgIGdpc3RzIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgcmVwb3NpdG9yaWVzKGxhc3Q6ICRyZXBvc2l0b3JpZXMsIGlzRm9yazogZmFsc2UsIG93bmVyQWZmaWxpYXRpb25zOiBPV05FUikge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICAgIG5vZGVzIHtcclxuICAgICAgICBuYW1lXHJcbiAgICAgICAgd2F0Y2hlcnMge1xyXG4gICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFyZ2F6ZXJzIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgbGFuZ3VhZ2VzKGZpcnN0OiA0KSB7XHJcbiAgICAgICAgICBlZGdlcyB7XHJcbiAgICAgICAgICAgIHNpemVcclxuICAgICAgICAgICAgbm9kZSB7XHJcbiAgICAgICAgICAgICAgY29sb3JcclxuICAgICAgICAgICAgICBuYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaXNzdWVzX29wZW46IGlzc3VlcyhzdGF0ZXM6IE9QRU4pIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgaXNzdWVzX2Nsb3NlZDogaXNzdWVzKHN0YXRlczogQ0xPU0VEKSB7XHJcbiAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByX29wZW46IHB1bGxSZXF1ZXN0cyhzdGF0ZXM6IE9QRU4pIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJfbWVyZ2VkOiBwdWxsUmVxdWVzdHMoc3RhdGVzOiBNRVJHRUQpIHtcclxuICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9ya0NvdW50XHJcbiAgICAgICAgbGljZW5zZUluZm8ge1xyXG4gICAgICAgICAgc3BkeElkXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwYWNrYWdlcyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHN0YXJyZWRSZXBvc2l0b3JpZXMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgICB3YXRjaGluZyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHNwb25zb3JzaGlwc0FzU3BvbnNvciB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIHNwb25zb3JzaGlwc0FzTWFpbnRhaW5lciB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIGNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uIHtcclxuICAgICAgdG90YWxSZXBvc2l0b3JpZXNXaXRoQ29udHJpYnV0ZWRDb21taXRzXHJcbiAgICAgIHRvdGFsQ29tbWl0Q29udHJpYnV0aW9uc1xyXG4gICAgICByZXN0cmljdGVkQ29udHJpYnV0aW9uc0NvdW50XHJcbiAgICAgIHRvdGFsSXNzdWVDb250cmlidXRpb25zXHJcbiAgICAgIHRvdGFsUHVsbFJlcXVlc3RDb250cmlidXRpb25zXHJcbiAgICAgIHRvdGFsUHVsbFJlcXVlc3RSZXZpZXdDb250cmlidXRpb25zXHJcbiAgICB9XHJcbiAgICBjYWxlbmRhcjpjb250cmlidXRpb25zQ29sbGVjdGlvbihmcm9tOiAkY2FsZW5kYXIuZnJvbSwgdG86ICRjYWxlbmRhci50bykge1xyXG4gICAgICBjb250cmlidXRpb25DYWxlbmRhciB7XHJcbiAgICAgICAgd2Vla3Mge1xyXG4gICAgICAgICAgY29udHJpYnV0aW9uRGF5cyB7XHJcbiAgICAgICAgICAgIGNvbG9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXBvc2l0b3JpZXNDb250cmlidXRlZFRvIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgZm9sbG93ZXJzIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgZm9sbG93aW5nIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgaXNzdWVDb21tZW50cyB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIG9yZ2FuaXphdGlvbnMge1xyXG4gICAgICB0b3RhbENvdW50XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltYWdlIjoiPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0ODBcIiBoZWlnaHQ9XCI8JT0gNDhcclxuICArICghIWJhc2UuaGVhZGVyKSooMTYqNSlcclxuICArICghIWJhc2UubWV0YWRhdGEpKigxNio5KVxyXG4gICsgKCEhYmFzZS5hY3Rpdml0eSkqKDE2KjEwKVxyXG4gICsgKCEhYmFzZS5jb21tdW5pdHkpKigxNio5KVxyXG4gICsgKCEhYmFzZS5yZXBvc2l0b3JpZXMpKigxNioxMylcclxuICArICghIWNvbXB1dGVkLnBsdWdpbnMudHJhZmZpYykqKDE2KjEpXHJcbiAgKyAoISFjb21wdXRlZC5wbHVnaW5zLmZvbGxvd3VwKSooMTYqNilcclxuICArICghIWNvbXB1dGVkLnBsdWdpbnMubGluZXMpKigxNiozKVxyXG4gICsgKCEhY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMpKigxNioxMilcclxuICArICghIWNvbXB1dGVkLnBsdWdpbnMucGFnZXNwZWVkKSooMTYqMTApXHJcbiU+XCI+XHJcbiAgPCVcclxuICAgIG1ldGEuJCA9IGA8c3BhbiBjbGFzcz1cInBzMS1wYXRoXCI+JHt1c2VyLmxvZ2lufUBtZXRyaWNzPC9zcGFuPjo8c3BhbiBjbGFzcz1cInBzMS1sb2NhdGlvblwiPn48L3NwYW4+JHtjb21wdXRlZC50b2tlbi5zY29wZXMuaW5jbHVkZXMoXCJyZXBvXCIpID8gXCIjXCIgOiBcIiRcIn1gXHJcbiAgICBtZXRhLmFuaW1hdGlvbnMgPSAhbWV0YS5wbGFjZWhvbGRlciA/IHtzdGRpbjouMTYsIHN0ZG91dDouMjgsIGxlbmd0aDooMitPYmplY3Qua2V5cyhiYXNlKS5sZW5ndGgrT2JqZWN0LmtleXMoY29tcHV0ZWQucGx1Z2lucykubGVuZ3RoKX0gOiB7c3RkaW46MCwgc3Rkb3V0OjAsIGxlbmd0aDowfVxyXG4gICU+XHJcblxyXG4gIDxzdHlsZT5cclxuICAgIDwlPSBzdHlsZSAlPlxyXG4gICAgICAuc3RkaW4sIC5zdGRvdXQge1xyXG4gICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogPCU9IG1ldGEuYW5pbWF0aW9ucy5zdGRpbiAlPnM7XHJcbiAgICAgIH1cclxuICAgICAgLnN0ZG91dCB7XHJcbiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiA8JT0gbWV0YS5hbmltYXRpb25zLnN0ZG91dCAlPnM7XHJcbiAgICAgIH1cclxuICAgICAgPCUgZm9yIChsZXQgaSA9IDAsIGQgPSAwOyBpIDwgbWV0YS5hbmltYXRpb25zLmxlbmd0aDsgaSsrLCBkKz1tZXRhLmFuaW1hdGlvbnMuc3RkaW4rbWV0YS5hbmltYXRpb25zLnN0ZG91dCkgeyAlPlxyXG4gICAgICAgIC5zdGRpbjpudGgtb2YtdHlwZSg8JT0gaSsxICU+KSB7XHJcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDwlPSBkICU+cztcclxuICAgICAgICB9XHJcbiAgICAgICAgLnN0ZG91dDpudGgtb2YtdHlwZSg8JT0gaSsyICU+KSB7XHJcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDwlPSBkK21ldGEuYW5pbWF0aW9ucy5zdGRpbiAlPnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDwlIGlmIChpID09PSBtZXRhLmFuaW1hdGlvbnMubGVuZ3RoLTEpIHsgJT5cclxuICAgICAgICAgIGZvb3RlciB7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogPCU9IGQgJT5zO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwlIH0gJT5cclxuICAgICAgPCUgfSAlPlxyXG4gIDwvc3R5bGU+XHJcblxyXG4gIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICA8ZGl2IHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj5HaXRIdWIgbWV0cmljcyB2PCU9IG1ldGEudmVyc2lvbiAlPjwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvblwiPuKUgDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvblwiPuKWoTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbiBleGl0XCI+4pyVPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuPHByZT48ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDotMTZweFwiPjwvZGl2PjwlIyAtJT5cclxuPCUgaWYgKGJhc2UubWV0YWRhdGEpIHsgJT5cclxuPHNwYW4gY2xhc3M9XCJiYW5uZXJcIj48JSMgLSU+XHJcbkdpdEh1YiBtZXRyaWNzIGdlbmVyYXRvciA8JT0gbWV0YS52ZXJzaW9uICU+XHJcblRoZXNlIGdlbmVyYXRlZCBtZXRyaWNzIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWSxcclxudG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcuXHJcblxyXG5MYXN0IGdlbmVyYXRlZDogPCU9IG5ldyBEYXRlKCkudG9HTVRTdHJpbmcoKSAlPlxyXG48L3NwYW4+PCUgfSAtJT5cclxuPCUjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLSU+XHJcbjwlIGlmIChiYXNlLmhlYWRlcikgeyAlPlxyXG48ZGl2IGNsYXNzPVwic3RkaW5cIj48JS0gbWV0YS4kICU+IHdob2FtaTwvZGl2PjwlIyAtJT5cclxuPGRpdiBjbGFzcz1cInN0ZG91dFwiPjwlIyAtJT5cclxuPGI+PCU9IHVzZXIubmFtZSB8fCB1c2VyLmxvZ2luICU+PC9iPiByZWdpc3RlcmVkPTwlPSBjb21wdXRlZC5yZWdpc3RyYXRpb24ubWF0Y2goL14uKz8gW3ltXS8pWzBdLnJlcGxhY2UoLyAvZywgXCJcIikgJT4sIHVpZD08JT0gYCR7dXNlci5kYXRhYmFzZUlkfWAuc3Vic3RyKC00KSAlPiwgZ2lkPTwlPSB1c2VyLm9yZ2FuaXphdGlvbnMudG90YWxDb3VudCAlPiwgZm9sbG93ZXJzPTwlPSB1c2VyLmZvbGxvd2Vycy50b3RhbENvdW50ICU+XHJcbiAgY29udHJpYnV0ZWQgdG8gPCU9IHVzZXIucmVwb3NpdG9yaWVzQ29udHJpYnV0ZWRUby50b3RhbENvdW50ICU+IHJlcG9zaXRvcjwlPSBzKHVzZXIucmVwb3NpdG9yaWVzQ29udHJpYnV0ZWRUby50b3RhbENvdW50LCBcInlcIikgJT4gPGI+PCUgZm9yIChjb25zdCBbeCwge2NvbG9yfV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcHV0ZWQuY2FsZW5kYXIpKSB7IC0lPjxzcGFuIHN0eWxlPVwiY29sb3I6PCU9IGNvbG9yICU+XCI+Izwvc3Bhbj48JSB9ICU+PC9iPlxyXG48L2Rpdj48JSB9IC0lPlxyXG48JSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtJT5cclxuPCUgaWYgKChiYXNlLmFjdGl2aXR5KXx8KGJhc2UuY29tbXVuaXR5KSkgeyAlPlxyXG48ZGl2IGNsYXNzPVwic3RkaW5cIj48JS0gbWV0YS4kICU+IGdpdCBzdGF0dXM8L2Rpdj48JSMgLSU+XHJcbjxkaXYgY2xhc3M9XCJzdGRvdXRcIj48JSMgLSU+XHJcbjwlIGlmIChiYXNlLmFjdGl2aXR5KSB7IC0lPlxyXG48Yj5SZWNlbnQgYWN0aXZpdHk8L2I+XHJcbiAgPGI+PCU9IGAke2NvbXB1dGVkLmNvbW1pdHN9YC5wYWRTdGFydCg1KSAlPjwvYj4gY29tbWl0PCU9IHMoY29tcHV0ZWQuY29tbWl0cykgJT5cclxuICA8Yj48JT0gYCR7dXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbFB1bGxSZXF1ZXN0UmV2aWV3Q29udHJpYnV0aW9uc31gLnBhZFN0YXJ0KDUpICU+PC9iPiBwdWxsIHJlcXVlc3Q8JT0gcyh1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsUHVsbFJlcXVlc3RSZXZpZXdDb250cmlidXRpb25zKSAlPiByZXZpZXdlZFxyXG4gIDxiPjwlPSBgJHt1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsUHVsbFJlcXVlc3RDb250cmlidXRpb25zfWAucGFkU3RhcnQoNSkgJT48L2I+IHB1bGwgcmVxdWVzdDwlPSBzKHVzZXIuY29udHJpYnV0aW9uc0NvbGxlY3Rpb24udG90YWxQdWxsUmVxdWVzdENvbnRyaWJ1dGlvbnMpICU+IG9wZW5lZFxyXG4gIDxiPjwlPSBgJHt1c2VyLmNvbnRyaWJ1dGlvbnNDb2xsZWN0aW9uLnRvdGFsSXNzdWVDb250cmlidXRpb25zfWAucGFkU3RhcnQoNSkgJT48L2I+IGlzc3VlPCU9IHModXNlci5jb250cmlidXRpb25zQ29sbGVjdGlvbi50b3RhbElzc3VlQ29udHJpYnV0aW9ucykgJT4gb3BlbmVkXHJcbiAgPGI+PCU9IGAke3VzZXIuaXNzdWVDb21tZW50cy50b3RhbENvdW50fWAucGFkU3RhcnQoNSkgJT48L2I+IGlzc3VlIGNvbW1lbnQ8JT0gcyh1c2VyLmlzc3VlQ29tbWVudHMudG90YWxDb3VudCkgJT5cclxuPCUgfSAtJT5cclxuPCUgaWYgKChiYXNlLmFjdGl2aXR5KSYmKGJhc2UuY29tbXVuaXR5KSkgeyAtJT5cclxuXHJcbjwlIH0gLSU+XHJcbjwlIGlmIChiYXNlLmNvbW11bml0eSkgeyAtJT5cclxuPGI+VHJhY2tlZCBhY3Rpdml0eTwvYj5cclxuICA8Yj48JT0gYCR7dXNlci5mb2xsb3dpbmcudG90YWxDb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiB1c2VyPCU9IHModXNlci5mb2xsb3dlcnMudG90YWxDb3VudCkgJT4gZm9sbG93ZWRcclxuICA8Yj48JT0gYCR7Y29tcHV0ZWQuc3BvbnNvcnNoaXBzfWAucGFkU3RhcnQoNSkgJT48L2I+IHJlcG9zaXRvcjwlPSBzKGNvbXB1dGVkLnNwb25zb3JzaGlwcywgXCJ5XCIpICU+IHNwb25zb3JlZFxyXG4gIDxiPjwlPSBgJHt1c2VyLnN0YXJyZWRSZXBvc2l0b3JpZXMudG90YWxDb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiByZXBvc2l0b3I8JT0gcyh1c2VyLnN0YXJyZWRSZXBvc2l0b3JpZXMudG90YWxDb3VudCwgXCJ5XCIpICU+IHN0YXJyZWRcclxuICA8Yj48JT0gYCR7dXNlci53YXRjaGluZy50b3RhbENvdW50fWAucGFkU3RhcnQoNSkgJT48L2I+IHJlcG9zaXRvcjwlPSBzKHVzZXIud2F0Y2hpbmcudG90YWxDb3VudCwgXCJ5XCIpICU+IHdhdGNoZWRcclxuPCUgfSAtJT5cclxuPC9kaXY+PCUgfSAtJT5cclxuPCUjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLSU+XHJcbjwlIGlmIChiYXNlLnJlcG9zaXRvcmllcykgeyAlPlxyXG48ZGl2IGNsYXNzPVwic3RkaW5cIj48JS0gbWV0YS4kICU+IGxzIC1saCBnaXRodWIvcmVwb3NpdG9yaWVzPC9kaXY+PCUjIC0lPlxyXG48ZGl2IGNsYXNzPVwic3Rkb3V0XCI+PCUjIC0lPlxyXG5Ub3RhbCA8JT0gdXNlci5yZXBvc2l0b3JpZXMudG90YWxDb3VudCAlPiByZXBvc2l0b3I8JT0gcyh1c2VyLnJlcG9zaXRvcmllcy50b3RhbENvdW50LCBcInlcIikgJT5cclxuPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMudHJhZmZpYykgeyBpZiAoY29tcHV0ZWQucGx1Z2lucy50cmFmZmljLmVycm9yKSB7IC0lPlxyXG4tLS0tICA8Yj4gICAgIDwvYj4gIHZpZXdzIDxzcGFuIGNsYXNzPVwiZXJyb3JcIj4oPCU9IGNvbXB1dGVkLnBsdWdpbnMudHJhZmZpYy5lcnJvciAlPik8L3NwYW4+XHJcbjwlIH0gZWxzZSB7IC0lPlxyXG4tci0tICA8Yj48JT0gYCR7Y29tcHV0ZWQucGx1Z2lucy50cmFmZmljLnZpZXdzLmNvdW50fWAucGFkU3RhcnQoNSkgJT48L2I+ICB2aWV3c1xyXG48JSB9fSAtJT5cclxuLXItLSAgPGI+PCU9IGAke2NvbXB1dGVkLnJlcG9zaXRvcmllcy5zdGFyZ2F6ZXJzfWAucGFkU3RhcnQoNSkgJT48L2I+ICBzdGFyZ2F6ZXI8JT0gcyhjb21wdXRlZC5yZXBvc2l0b3JpZXMuc3RhcmdhemVycykgJT5cclxuLXItLSAgPGI+PCU9IGAke2NvbXB1dGVkLnJlcG9zaXRvcmllcy5mb3Jrc31gLnBhZFN0YXJ0KDUpICU+PC9iPiAgZm9yazwlPSBzKGNvbXB1dGVkLnJlcG9zaXRvcmllcy5mb3JrcykgJT5cclxuLXItLSAgPGI+PCU9IGAke2NvbXB1dGVkLnJlcG9zaXRvcmllcy53YXRjaGVyc31gLnBhZFN0YXJ0KDUpICU+PC9iPiAgd2F0Y2hlcjwlPSBzKGNvbXB1dGVkLnJlcG9zaXRvcmllcy53YXRjaGVycykgJT5cclxuZHIteCAgPGI+PCU9IGAke3VzZXIucGFja2FnZXMudG90YWxDb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiAgcGFja2FnZTwlPSBzKHVzZXIucGFja2FnZXMudG90YWxDb3VudCkgJT5cclxuZHIteCAgPGI+PCU9IGAke3VzZXIuZ2lzdHMudG90YWxDb3VudH1gLnBhZFN0YXJ0KDUpICU+PC9iPiAgZ2lzdDwlPSBzKHVzZXIuZ2lzdHMudG90YWxDb3VudCkgJT5cclxuPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXApIHsgaWYgKGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuZXJyb3IpIHsgLSU+XHJcbmQtLS0gIDxiPiAgICAgPC9iPiAgSVNTVUVTIDxzcGFuIGNsYXNzPVwiZXJyb3JcIj4oPCU9IGNvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuZXJyb3IgJT4pPC9zcGFuPlxyXG5kLS0tICA8Yj4gICAgIDwvYj4gIFBVTExfUkVRVUVTVFMgPHNwYW4gY2xhc3M9XCJlcnJvclwiPig8JT0gY29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5lcnJvciAlPik8L3NwYW4+XHJcbjwlIH0gZWxzZSB7IC0lPlxyXG5kci14ICA8Yj48JT0gYCR7Y29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY291bnR9YC5wYWRTdGFydCg1KSAlPjwvYj4gIElTU1VFU1xyXG4tci0tICA8Yj48JT0gYCR7Y29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMub3Blbn1gLnBhZFN0YXJ0KDUpICU+PC9iPiAg4pSc4pSA4pSAIG9wZW5cclxuLXItLSAgPGI+PCU9IGAke2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAuaXNzdWVzLmNsb3NlZH1gLnBhZFN0YXJ0KDUpICU+PC9iPiAg4pSU4pSA4pSAIGNsb3NlZFxyXG5kci14ICA8Yj48JT0gYCR7Y29tcHV0ZWQucGx1Z2lucy5mb2xsb3d1cC5pc3N1ZXMuY291bnR9YC5wYWRTdGFydCg1KSAlPjwvYj4gIFBVTExfUkVRVUVTVFNcclxuLXItLSAgPGI+PCU9IGAke2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIub3Blbn1gLnBhZFN0YXJ0KDUpICU+PC9iPiAg4pSc4pSA4pSAIG9wZW5cclxuLXItLSAgPGI+PCU9IGAke2NvbXB1dGVkLnBsdWdpbnMuZm9sbG93dXAucHIubWVyZ2VkfWAucGFkU3RhcnQoNSkgJT48L2I+ICDilJTilIDilIAgbWVyZ2VkXHJcbjwlIH19IC0lPlxyXG48JSBpZiAoY29tcHV0ZWQubGljZW5zZXMuZmF2b3JpdGUubGVuZ3RoKSB7IC0lPlxyXG5kci14ICAgICAgICAgTElDRU5TRVxyXG4tci0tICAgICAgICAg4pSU4pSA4pSAIDwlPSBjb21wdXRlZC5saWNlbnNlcy5mYXZvcml0ZSAlPlxyXG48JSB9IC0lPlxyXG48JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5saW5lcykgeyBpZiAoY29tcHV0ZWQucGx1Z2lucy5saW5lcy5lcnJvcikgeyAlPlxyXG48c3BhbiBjbGFzcz1cImRpZmYgZXJyb3JcIj5AQCA8JT0gY29tcHV0ZWQucGx1Z2lucy5saW5lcy5lcnJvciAlPiBAQDwvc3Bhbj48JSB9IGVsc2UgeyAlPlxyXG48c3BhbiBjbGFzcz1cImRpZmZcIj5AQCAtPCU9IGNvbXB1dGVkLnBsdWdpbnMubGluZXMuZGVsZXRlZCAlPiArPCU9IGNvbXB1dGVkLnBsdWdpbnMubGluZXMuYWRkZWQgJT4gQEA8L3NwYW4+XHJcbjwlIH19IC0lPlxyXG48L2Rpdj48JSB9IC0lPlxyXG48JSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtJT5cclxuPCUgaWYgKGNvbXB1dGVkLnBsdWdpbnMubGFuZ3VhZ2VzKSB7ICU+XHJcbjxkaXYgY2xhc3M9XCJzdGRpblwiPjwlLSBtZXRhLiQgJT4gbG9jYWxlPC9kaXY+PCUjIC0lPlxyXG48ZGl2IGNsYXNzPVwic3Rkb3V0XCI+PCUjIC0lPlxyXG48JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMuZXJyb3IpIHsgLSU+XHJcbjxzcGFuIGNsYXNzPVwiZXJyb3JcIj48JT0gY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMuZXJyb3IgJT48L3NwYW4+PCUjIC0lPlxyXG48JSB9IGVsc2UgeyBmb3IgKGNvbnN0IHtuYW1lLCB2YWx1ZX0gb2YgY29tcHV0ZWQucGx1Z2lucy5sYW5ndWFnZXMuZmF2b3JpdGVzKSB7IC0lPlxyXG48Yj48JT0gbmFtZS50b0xvY2FsZVVwcGVyQ2FzZSgpLnBhZEVuZCgxMikgJT48L2I+IFs8JT0gXCIjXCIucmVwZWF0KE1hdGguY2VpbCgxMDAqdmFsdWUvNSkpLnBhZEVuZCgyMCkgJT5dIDwlPSAoMTAwKnZhbHVlKS50b0ZpeGVkKDIpLnBhZEVuZCg1KSAlPiVcclxuPCUgfX0gLSU+XHJcbjwvZGl2PjwlIH0gLSU+XHJcbjwlIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0lPlxyXG48JSBpZiAoY29tcHV0ZWQucGx1Z2lucy5wYWdlc3BlZWQpIHsgJT5cclxuPGRpdiBjbGFzcz1cInN0ZGluXCI+PCUtIG1ldGEuJCAlPiBjdXJsIC1JIDwlPSB1c2VyLndlYnNpdGVVcmwgJT48L2Rpdj48JSMgLSU+XHJcbjxkaXYgY2xhc3M9XCJzdGRvdXRcIj48JSMgLSU+XHJcbjwlIGlmIChjb21wdXRlZC5wbHVnaW5zLnBhZ2VzcGVlZC5lcnJvcikgeyAtJT5cclxuPHNwYW4gY2xhc3M9XCJlcnJvclwiPjwlPSBjb21wdXRlZC5wbHVnaW5zLnBhZ2VzcGVlZC5lcnJvciAlPjwvc3Bhbj48JSB9IGVsc2UgeyAtJT5cclxuPGI+VXNlci1BZ2VudDwvYj46IEdvb2dsZSBQYWdlU3BlZWQgQVBJXHJcbjxiPkxvY2F0aW9uPC9iPjogPCU9IHVzZXIud2Vic2l0ZVVybCAlPlxyXG48JSBmb3IgKGNvbnN0IHtzY29yZSwgdGl0bGV9IG9mIGNvbXB1dGVkLnBsdWdpbnMucGFnZXNwZWVkLnNjb3JlcykgeyAtJT5cclxuPGI+PCU9IGBYLSR7dGl0bGUucmVwbGFjZSgvIC9nLCBcIi1cIil9YCAlPjwvYj46IDwlPSAhTnVtYmVyLmlzTmFOKHNjb3JlKSA/IE1hdGgucm91bmQoc2NvcmUqMTAwKSA6IFwiLVwiICU+JVxyXG48JSB9fSAtJT5cclxuPC9kaXY+PCUgfSAtJT5cclxuPCUjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLSU+XHJcbjwlIGlmIChiYXNlLm1ldGFkYXRhKSB7IC0lPlxyXG5cclxuPGZvb3Rlcj5Db25uZWN0aW9uIHJlc2V0IGJ5IDEyNy4wLjAuMTwvZm9vdGVyPjwlIyAtJT5cclxuPCUgfSAtJT48L3ByZT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2ZvcmVpZ25PYmplY3Q+XHJcbjwvc3ZnPlxyXG5cclxuIiwic3R5bGUiOiIvKiBTVkcgZ2xvYmFsIGNvbnRleHQgKi9cclxuICBzdmcge1xyXG4gICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsIEFwcGxlIENvbG9yIEVtb2ppLCBTZWdvZSBVSSBFbW9qaTtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGNvbG9yOiAjNzc3Nzc3O1xyXG4gIH1cclxuXHJcbi8qIFRpdGxlIGJhciAqL1xyXG4gIC5oZWFkZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAyMHB4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIHBhZGRpbmc6IDAgOHB4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDVweDtcclxuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA1cHg7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoIzUwNGI0NSAwJSwjM2MzYjM3IDEwMCUpO1xyXG4gIH1cclxuXHJcbiAgLnRpdGxlIHtcclxuICAgIGNvbG9yOiAjZDVkMGNlO1xyXG4gICAgbGluZS1oZWlnaHQ6IDEycHg7XHJcbiAgfVxyXG5cclxuICAuYnV0dG9ucyB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9XHJcblxyXG4gIC5idXR0b24ge1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XHJcbiAgICBmb250LXNpemU6IDhweDtcclxuICAgIGhlaWdodDogMTJweDtcclxuICAgIHdpZHRoOiAxMnB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcclxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjN2Q3ODcxIDAlLCAjNTk1OTUzIDEwMCUpO1xyXG4gICAgdGV4dC1zaGFkb3c6IDBweCAxcHggMHB4IHJnYmEoMjU1LDI1NSwyNTUsMC4yKTtcclxuICB9XHJcblxyXG4gIC5idXR0b24uZXhpdCB7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2YzNzQ1OCAwJSwgI2RlNGMxMiAxMDAlKTtcclxuICB9XHJcblxyXG4vKiBUZXJtaW5hbCAqL1xyXG4gIHByZSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNDIwOTJCO1xyXG4gICAgcGFkZGluZzogMTJweDtcclxuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDVweDtcclxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA1cHg7XHJcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xyXG4gICAgY29sb3I6ICNEREREREQ7XHJcbiAgfVxyXG5cclxuICAuYmFubmVyLCBmb290ZXIge1xyXG4gICAgb3BhY2l0eTogLjc7XHJcbiAgfVxyXG5cclxuLyogUHJvbXB0ICovXHJcbiAgLnBzMS1wYXRoIHtcclxuICAgIGNvbG9yOiAjN0VEQTI5O1xyXG4gIH1cclxuXHJcbiAgLnBzMS1sb2NhdGlvbiB7XHJcbiAgICBjb2xvcjogIzQ4NzhjMDtcclxuICB9XHJcblxyXG4vKiBEaWZmICovXHJcbiAgLmRpZmYge1xyXG4gICAgY29sb3I6ICMzQTk2REQ7XHJcbiAgfVxyXG5cclxuLyogRXJyb3IgKi9cclxuICAuZXJyb3Ige1xyXG4gICAgY29sb3I6ICNjYjI0MzE7XHJcbiAgfVxyXG5cclxuLyogQW5pbWF0aW9ucyAqL1xyXG4gIC5zdGRpbiwgZm9vdGVyIHtcclxuICAgIHdpZHRoOiAwJTtcclxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgYW5pbWF0aW9uLW5hbWU6IHN0ZGluLWFuaW1hdGlvbjtcclxuICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XHJcbiAgfVxyXG5cclxuICAuc3Rkb3V0IHtcclxuICAgIG1heC1oZWlnaHQ6IDAlO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGFuaW1hdGlvbi1uYW1lOiBzdGRvdXQtYW5pbWF0aW9uO1xyXG4gICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcclxuICB9XHJcblxyXG4gIEBrZXlmcmFtZXMgc3RkaW4tYW5pbWF0aW9uIHtcclxuICAgIDAlIHsgd2lkdGg6IDAlOyB9XHJcbiAgICAxMDAlIHsgd2lkdGg6IDEwMCU7IH1cclxuICB9XHJcblxyXG4gIEBrZXlmcmFtZXMgc3Rkb3V0LWFuaW1hdGlvbiB7XHJcbiAgICAwJSB7IG1heC1oZWlnaHQ6IDA7IH1cclxuICAgIDEwMCUgeyBtYXgtaGVpZ2h0OiAzNjBweDsgfVxyXG4gIH0ifX0=`, "base64").toString("utf8")) - } - - //Conf - logger(`metrics/setup > setup > success`) - return conf - - } -// EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\ejs\lib\ejs.js -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_ejs_lib_ejs = __webpack_require__(58509); -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_ejs_lib_ejs_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_ejs_lib_ejs); - -// EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\axios\index.js -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_axios_index = __webpack_require__(2390); -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_axios_index_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_axios_index); - -// EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\svgo\lib\svgo.js -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_svgo_lib_svgo = __webpack_require__(20485); -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_svgo_lib_svgo_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_svgo_lib_svgo); - -// EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\image-to-base64\image-to-base64.min.js -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_image_to_base64_image_to_base64_min = __webpack_require__(67192); -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_image_to_base64_image_to_base64_min_default = /*#__PURE__*/__webpack_require__.n(E_Users_lecoq_Documents_GitHub_gitstats_node_modules_image_to_base64_image_to_base64_min); - -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\followup\index.mjs -//Setup - /* harmony default export */ function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_followup_index({login, data, computed, pending, q}, {enabled = false} = {}) { - //Check if plugin is enabled and requirements are met - if (!enabled) - return computed.plugins.followup = null - if (!q.followup) - return computed.plugins.followup = null - console.debug(`metrics/compute/${login}/plugins > followup`) - - //Plugin execution - pending.push(new Promise(async solve => { - try { - //Define getters - const followup = { - issues:{ - get count() { return this.open + this.closed }, - get open() { return computed.repositories.issues_open }, - get closed() { return computed.repositories.issues_closed }, - }, - pr:{ - get count() { return this.open + this.merged }, - get open() { return computed.repositories.pr_open }, - get merged() { return computed.repositories.pr_merged } - } - } - //Save results - computed.plugins.followup = followup - console.debug(`metrics/compute/${login}/plugins > followup > success`) - console.debug(JSON.stringify(computed.plugins.followup)) - solve() - } - catch (error) { - //Generic error - computed.plugins.followup = {error:`An error occured`} - console.debug(`metrics/compute/${login}/plugins > followup > error`) - console.debug(error) - solve() - } - })) - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\habits\index.mjs -//Setup - /* harmony default export */ function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_habits_index({login, rest, computed, pending, q}, {enabled = false, from = 100} = {}) { - //Check if plugin is enabled and requirements are met - if (!enabled) - return computed.plugins.habits = null - if (!q.habits) - return computed.plugins.habits = null - console.debug(`metrics/compute/${login}/plugins > habits`) - - //Parameter override - if (typeof q["habits.from"] === "number") { - from = Math.max(0, Math.min(from, q["habits.from"])) - console.debug(`metrics/compute/${login}/plugins > habits > events = ${from}`) - } - - //Plugin execution - pending.push(new Promise(async solve => { - try { - //Initialization - const habits = {commits:{hour:NaN, hours:{}}, indents:{style:"", spaces:0, tabs:0}} - //Get user recent commits from events - const events = await rest.activity.listEventsForAuthenticatedUser({username:login, per_page:from}) - const commits = events.data - .filter(({type}) => type === "PushEvent") - .filter(({actor}) => actor.login === login) - //Commit hour - { - //Compute commit hours - const hours = commits.map(({created_at}) => (new Date(created_at)).getHours()) - for (const hour of hours) - habits.commits.hours[hour] = (habits.commits.hours[hour] || 0) + 1 - //Compute hour with most commits - habits.commits.hour = hours.length ? Object.entries(habits.commits.hours).sort(([an, a], [bn, b]) => b - a).map(([hour, occurence]) => hour)[0] : NaN - } - //Indent style - { - //Retrieve edited files - const edited = await Promise.allSettled(commits - .flatMap(({payload}) => payload.commits).map(commit => commit.url) - .map(async commit => (await rest.request(commit)).data.files) - ) - //Attemp to guess whether tabs or spaces are used from patch - edited - .filter(({status}) => status === "fulfilled") - .map(({value}) => value) - .flatMap(files => files.flatMap(file => (file.patch||"").match(/(?<=^[+])((?:\t)|(?: )) /gm)||[])) - .forEach(indent => habits.indents[/^\t/.test(indent) ? "tabs" : "spaces"]++) - //Compute indent style - habits.indents.style = habits.indents.spaces > habits.indents.tabs ? "spaces" : habits.indents.tabs > habits.indents.spaces ? "tabs" : "" - } - //Save results - computed.plugins.habits = habits - console.debug(`metrics/compute/${login}/plugins > habits > success`) - console.debug(JSON.stringify(computed.plugins.habits)) - solve() - } - catch (error) { - //Generic error - computed.plugins.habits = {error:`An error occured`} - console.debug(`metrics/compute/${login}/plugins > habits > error`) - console.debug(error) - solve() - } - })) - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\languages\index.mjs -//Setup - /* harmony default export */ function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_languages_index({login, data, computed, pending, q}, {enabled = false} = {}) { - //Check if plugin is enabled and requirements are met - if (!enabled) - return computed.plugins.languages = null - if (!q.languages) - return computed.plugins.languages = null - console.debug(`metrics/compute/${login}/plugins > languages`) - - //Plugin execution - pending.push(new Promise(async solve => { - try { - //Iterate through user's repositories and retrieve languages data - const languages = {colors:{}, total:0, stats:{}} - for (const repository of data.user.repositories.nodes) { - for (const {size, node:{color, name}} of Object.values(repository.languages.edges)) { - languages.stats[name] = (languages.stats[name] || 0) + size - languages.colors[name] = color || "#ededed" - languages.total += size - } - } - //Compute languages stats - Object.keys(languages.stats).map(name => languages.stats[name] /= languages.total) - languages.favorites = Object.entries(languages.stats).sort(([an, a], [bn, b]) => b - a).slice(0, 8).map(([name, value]) => ({name, value, color:languages.colors[name], x:0})) - for (let i = 1; i < languages.favorites.length; i++) - languages.favorites[i].x = languages.favorites[i-1].x + languages.favorites[i-1].value - //Save results - computed.plugins.languages = languages - console.debug(`metrics/compute/${login}/plugins > languages > success`) - console.debug(JSON.stringify(computed.plugins.languages)) - solve() - } - catch (error) { - //Generic error - computed.plugins.languages = {error:`An error occured`} - console.debug(`metrics/compute/${login}/plugins > languages > error`) - console.debug(error) - solve() - } - })) - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\lines\index.mjs -//Formatter - function format(n) { - for (const {u, v} of [{u:"b", v:10**9}, {u:"m", v:10**6}, {u:"k", v:10**3}]) - if (n/v >= 1) - return `${(n/v).toFixed(2).substr(0, 4).replace(/[.]0*$/, "")}${u}` - return n - } - -//Setup - /* harmony default export */ function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_lines_index({login, repositories = [], rest, computed, pending, q}, {enabled = false} = {}) { - //Check if plugin is enabled and requirements are met - if (!enabled) - return computed.plugins.lines = null - if (!q.lines) - return computed.plugins.lines = null - console.debug(`metrics/compute/${login}/plugins > lines`) - - //Plugin execution - pending.push(new Promise(async solve => { - try { - //Get contributors stats from repositories - const lines = {added:0, deleted:0} - const response = await Promise.all(repositories.map(async repo => await rest.repos.getContributorsStats({owner:login, repo}))) - //Compute changed lines - response.map(({data:repository}) => { - //Check if data are available - if (!Array.isArray(repository)) - return - //Extract author - const [contributor] = repository.filter(({author}) => author.login === login) - //Compute editions - if (contributor) - contributor.weeks.forEach(({a, d}) => (lines.added += a, lines.deleted += d)) - }) - //Format values - lines.added = format(lines.added) - lines.deleted = format(lines.deleted) - //Save results - computed.plugins.lines = {...lines} - console.debug(`metrics/compute/${login}/plugins > lines > success`) - console.debug(JSON.stringify(computed.plugins.lines)) - solve() - } - catch (error) { - //Generic error - computed.plugins.lines = {error:`An error occured`} - console.debug(`metrics/compute/${login}/plugins > lines > error`) - console.debug(error) - solve() - } - })) - } - - -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\pagespeed\index.mjs -//Imports - - -//Setup - /* harmony default export */ function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_pagespeed_index({login, url, computed, pending, q}, {enabled = false, token = null} = {}) { - //Check if plugin is enabled and requirements are met - if (!enabled) - return computed.plugins.pagespeed = null - if (!url) - return computed.plugins.pagespeed = null - if (!q.pagespeed) - return computed.plugins.pagespeed = null - console.debug(`metrics/compute/${login}/plugins > pagespeed`) - - //Plugin execution - pending.push(new Promise(async solve => { - try { - //Format url if needed - if (!/^https?:[/][/]/.test(url)) - url = `https://${url}` - //Load scores from API - const scores = new Map() - await Promise.all(["performance", "accessibility", "best-practices", "seo"].map(async category => { - const {score, title} = (await E_Users_lecoq_Documents_GitHub_gitstats_node_modules_axios_index_default().get(`https://www.googleapis.com/pagespeedonline/v5/runPagespeed?category=${category}&url=${url}&key=${token}`)).data.lighthouseResult.categories[category] - scores.set(category, {score, title}) - })) - //Save results - computed.plugins.pagespeed = {url, scores:[scores.get("performance"), scores.get("accessibility"), scores.get("best-practices"), scores.get("seo")]} - console.debug(`metrics/compute/${login}/plugins > pagespeed > success`) - console.debug(JSON.stringify(computed.plugins.pagespeed)) - solve() - } - catch (error) { - //Thrown when token is incorrect - if ((error.response)&&(error.response.status)) { - computed.plugins.pagespeed = {url, error:`PageSpeed token error (code ${error.response.status})`} - console.debug(`metrics/plugins/pagespeed/${login} > ${error.response.status}`) - return solve() - } - //Generic error - computed.plugins.pagespeed = {error:`An error occured`} - console.debug(`metrics/compute/${login}/plugins > pagespeed > error`) - console.debug(error) - solve() - } - })) - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\selfskip\index.mjs -//Setup - /* harmony default export */ function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_selfskip_index({login, rest, computed, pending, q}, {enabled = false} = {}) { - //Check if plugin is enabled and requirements are met - if (!enabled) - return computed.plugins.selfskip = null - if (!q.selfskip) - return computed.plugins.selfskip = null - console.debug(`metrics/compute/${login}/plugins > selfskip`) - - //Plugin execution - pending.push(new Promise(async solve => { - try { - //Search for auto-generated commits - let commits = 0 - for (let page = 0;;page++) { - const {data} = await rest.repos.listCommits({owner:login, repo:login, author:login, per_page:100, page}) - commits += data.filter(({commit}) => /\[Skip GitHub Action\]/.test(commit.message)).length - if (!data.length) - break - } - //Save results - computed.plugins.selfskip = {commits} - computed.commits -= commits - console.debug(`metrics/compute/${login}/plugins > selfskip > success`) - console.debug(JSON.stringify(computed.plugins.selfskip)) - solve() - } - catch (error) { - //Generic error - computed.plugins.selfskip = {error:`An error occured`} - console.debug(`metrics/compute/${login}/plugins > selfskip > error`) - console.debug(error) - solve() - } - })) - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\traffic\index.mjs -//Formatter - function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_traffic_index_format(n) { - for (const {u, v} of [{u:"b", v:10**9}, {u:"m", v:10**6}, {u:"k", v:10**3}]) - if (n/v >= 1) - return `${(n/v).toFixed(2).substr(0, 4).replace(/[.]0*$/, "")}${u}` - return n - } - -//Setup - /* harmony default export */ function E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_traffic_index({login, repositories = [], rest, computed, pending, q}, {enabled = false} = {}) { - //Check if plugin is enabled and requirements are met - if (!enabled) - return computed.plugins.traffic = null - if (!q.traffic) - return computed.plugins.traffic = null - console.debug(`metrics/compute/${login}/plugins > traffic`) - - //Plugin execution - pending.push(new Promise(async solve => { - try { - //Get views stats from repositories - const views = {count:0, uniques:0} - const response = await Promise.all(repositories.map(async repo => await rest.repos.getViews({owner:login, repo}))) - //Compute views - response.filter(({data}) => data).map(({data:{count, uniques}}) => (views.count += count, views.uniques += uniques)) - //Format values - views.count = E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_traffic_index_format(views.count) - views.uniques = E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_traffic_index_format(views.uniques) - //Save results - computed.plugins.traffic = {views} - console.debug(`metrics/compute/${login}/plugins > traffic > success`) - console.debug(JSON.stringify(computed.plugins.traffic)) - solve() - } - catch (error) { - //Thrown when token has unsufficient permissions - if (error.status === 403) { - computed.plugins.traffic = {error:`Insufficient token rights`} - console.debug(`metrics/compute/${login}/plugins > error > 403 (insufficient token rights)`) - return solve() - } - //Generic error - computed.plugins.traffic = {error:`An error occured`} - console.debug(`metrics/compute/${login}/plugins > error`) - console.debug(error) - solve() - } - })) - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\plugins\index.mjs -//Imports - - - - - - - - -//Exports - /* harmony default export */ const E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_index = ({ - followup: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_followup_index, - habits: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_habits_index, - languages: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_languages_index, - lines: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_lines_index, - pagespeed: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_pagespeed_index, - selfskip: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_selfskip_index, - traffic: E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_traffic_index, - }); -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\templates\common.mjs -/** Template common processor */ - /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_templates_common({login, q}, {conf, data, rest, graphql, plugins}, {s, pending, imports}) { - - //Init - const computed = data.computed = {commits:0, sponsorships:0, licenses:{favorite:"", used:{}}, token:{}, repositories:{watchers:0, stargazers:0, issues_open:0, issues_closed:0, pr_open:0, pr_merged:0, forks:0}, plugins:{}} - const avatar = imports.imgb64(data.user.avatarUrl) - - //Plugins - if (data.user.websiteUrl) - imports.plugins.pagespeed({login, url:data.user.websiteUrl, computed, pending, q}, plugins.pagespeed) - imports.plugins.lines({login, repositories:data.user.repositories.nodes.map(({name}) => name), rest, computed, pending, q}, plugins.lines) - imports.plugins.traffic({login, repositories:data.user.repositories.nodes.map(({name}) => name), rest, computed, pending, q}, plugins.traffic) - imports.plugins.habits({login, rest, computed, pending, q}, plugins.habits) - imports.plugins.selfskip({login, rest, computed, pending, q}, plugins.selfskip) - imports.plugins.languages({login, data, computed, pending, q}, plugins.languages) - imports.plugins.followup({login, data, computed, pending, q}, plugins.followup) - - //Iterate through user's repositories - for (const repository of data.user.repositories.nodes) { - //Simple properties with totalCount - for (const property of ["watchers", "stargazers", "issues_open", "issues_closed", "pr_open", "pr_merged"]) - computed.repositories[property] += repository[property].totalCount - //Forks - computed.repositories.forks += repository.forkCount - //License - if (repository.licenseInfo) - computed.licenses.used[repository.licenseInfo.spdxId] = (computed.licenses.used[repository.licenseInfo.spdxId] || 0) + 1 - } - - //Compute licenses stats - computed.licenses.favorite = Object.entries(computed.licenses.used).sort(([an, a], [bn, b]) => b - a).slice(0, 1).map(([name, value]) => name) || "" - - //Compute total commits and sponsorships - computed.commits += data.user.contributionsCollection.totalCommitContributions + data.user.contributionsCollection.restrictedContributionsCount - computed.sponsorships = data.user.sponsorshipsAsSponsor.totalCount + data.user.sponsorshipsAsMaintainer.totalCount - - //Compute registration date - const diff = (Date.now()-(new Date(data.user.createdAt)).getTime())/(365*24*60*60*1000) - const years = Math.floor(diff) - const months = Math.ceil((diff-years)*12) - computed.registration = years ? `${years} year${s(years)} ago` : `${months} month${s(months)} ago` - - //Compute calendar - computed.calendar = data.user.calendar.contributionCalendar.weeks.flatMap(({contributionDays}) => contributionDays).slice(0, 14).reverse() - - //Avatar (base64) - computed.avatar = await avatar || "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" - - //Token scopes - computed.token.scopes = (await rest.request("HEAD /")).headers["x-oauth-scopes"].split(", ") - - //Meta - data.meta = {version:conf.package.version, author:conf.package.author} - - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\templates\classic\template.mjs -//Imports - - -/** Template processor */ - /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_templates_classic_template({login, q}, {conf, data, rest, graphql, plugins}, {s, pending, imports}) { - await E_Users_lecoq_Documents_GitHub_gitstats_src_templates_common(...arguments) - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\templates\terminal\template.mjs -//Imports - - -/** Template processor */ - /* harmony default export */ async function E_Users_lecoq_Documents_GitHub_gitstats_src_templates_terminal_template({login, q}, {conf, data, rest, graphql, plugins}, {s, pending, imports}) { - await E_Users_lecoq_Documents_GitHub_gitstats_src_templates_common(...arguments) - } -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\templates\index.mjs -//Imports - - - -//Exports - /* harmony default export */ const E_Users_lecoq_Documents_GitHub_gitstats_src_templates_index = ({ - classic: E_Users_lecoq_Documents_GitHub_gitstats_src_templates_classic_template, - terminal: E_Users_lecoq_Documents_GitHub_gitstats_src_templates_terminal_template, - }); -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\src\metrics.mjs -//Imports - - - - - - -//Setup - async function metrics({login, q}, {graphql, rest, plugins, conf}) { - //Compute rendering - try { - - //Init - console.debug(`metrics/compute/${login} > start`) - console.debug(JSON.stringify(q)) - const template = q.template || conf.settings.templates.default - const repositories = Math.max(0, Number(q.repositories)) || conf.settings.repositories || 100 - const pending = [] - const s = (value, end = "") => value > 1 ? {y:"ies", "":"s"}[end] : end - if ((!(template in E_Users_lecoq_Documents_GitHub_gitstats_src_templates_index))||(!(template in conf.templates))||((conf.settings.templates.enabled.length)&&(!conf.settings.templates.enabled.includes(template)))) - throw new Error("unsupported template") - const {query, image, style} = conf.templates[template] - - //Query data from GitHub API - console.debug(`metrics/compute/${login} > query`) - const data = await graphql(query - .replace(/[$]login/, `"${login}"`) - .replace(/[$]repositories/, `${repositories}`) - .replace(/[$]calendar.to/, `"${(new Date()).toISOString()}"`) - .replace(/[$]calendar.from/, `"${(new Date(Date.now()-14*24*60*60*1000)).toISOString()}"`) - ) - console.debug(`metrics/compute/${login} > query > success`) - - //Base parts - data.base = {} - for (const part of conf.settings.plugins.base.parts) - data.base[part] = (`base.${part}` in q) ? !!q[`base.${part}`] : true - - //Template - console.debug(`metrics/compute/${login} > compute`) - const computer = E_Users_lecoq_Documents_GitHub_gitstats_src_templates_index[template].default || E_Users_lecoq_Documents_GitHub_gitstats_src_templates_index[template] - await computer({login, q}, {conf, data, rest, graphql, plugins}, {s, pending, imports:{plugins:E_Users_lecoq_Documents_GitHub_gitstats_src_plugins_index, imgb64: (E_Users_lecoq_Documents_GitHub_gitstats_node_modules_image_to_base64_image_to_base64_min_default())}}) - await Promise.all(pending) - console.debug(`metrics/compute/${login} > compute > success`) - - //Eval rendering - console.debug(`metrics/compute/${login} > render`) - let rendered = await E_Users_lecoq_Documents_GitHub_gitstats_node_modules_ejs_lib_ejs_default().render(image, {...data, s, style}, {async:true}) - console.debug(`metrics/compute/${login} > render > success`) - - //Optimize rendering - if (conf.optimize) { - console.debug(`metrics/compute/${login} > optimize`) - const svgo = new (E_Users_lecoq_Documents_GitHub_gitstats_node_modules_svgo_lib_svgo_default())({full:true, plugins:[{cleanupAttrs:true}, {inlineStyles:false}]}) - const {data:optimized} = await svgo.optimize(rendered) - console.debug(`metrics/compute/${login} > optimize > success`) - rendered = optimized - } - - //Result - return rendered - } - //Internal error - catch (error) { - //User not found - if (((Array.isArray(error.errors))&&(error.errors[0].type === "NOT_FOUND"))) - throw new Error("user not found") - //Generic error - throw error - } - } -// EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\@octokit\graphql\dist-node\index.js -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_octokit_graphql_dist_node_index = __webpack_require__(3584); - -// EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\@actions\core\lib\core.js -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_actions_core_lib_core = __webpack_require__(32882); - -// EXTERNAL MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\node_modules\@actions\github\lib\github.js -var E_Users_lecoq_Documents_GitHub_gitstats_node_modules_actions_github_lib_github = __webpack_require__(29483); - -// CONCATENATED MODULE: E:\Users\lecoq\Documents\GitHub\gitstats\action\index.mjs -//Imports - - - - - ((async function () { - //Hack because ES modules are not correctly transpiled with ncc - const [core, github, octokit, setup, metrics] = [E_Users_lecoq_Documents_GitHub_gitstats_node_modules_actions_core_lib_core, E_Users_lecoq_Documents_GitHub_gitstats_node_modules_actions_github_lib_github, E_Users_lecoq_Documents_GitHub_gitstats_node_modules_octokit_graphql_dist_node_index, E_Users_lecoq_Documents_GitHub_gitstats_src_setup_namespaceObject, E_Users_lecoq_Documents_GitHub_gitstats_src_metrics_namespaceObject].map(m => (m && m.default) ? m.default : m) - //Yaml boolean converter - const bool = (value, defaulted = false) => typeof value === "string" ? /^(?:[Tt]rue|[Oo]n|[Yy]es)$/.test(value) : defaulted - //Runner - try { - //Initialization - console.log(`GitHub metrics as SVG image`) - console.log(`========================================================`) - console.log(`Version | 2.2.0`) - process.on("unhandledRejection", error => { throw error }) - - //Skip process if needed - if ((github.context.eventName === "push")&&(github.context.payload)&&(github.context.payload.head_commit)) { - if (/\[Skip GitHub Action\]/.test(github.context.payload.head_commit.message)) { - console.log(`Skipped because [Skip GitHub Action] is in commit message`) - process.exit(0) - } - } - - //Load configuration - const conf = await setup({log:false}) - console.log(`Configuration | loaded`) - - //Load svg template, style and query - const template = core.getInput("template") || "classic" - console.log(`Template to use | ${template}`) - - //Token for data gathering - const token = core.getInput("token") - console.log(`Github token | ${token ? "provided" : "missing"}`) - if (!token) - throw new Error("You must provide a valid GitHub token to gather your metrics") - const graphql = octokit.graphql.defaults({headers:{authorization: `token ${token}`}}) - console.log(`Github GraphQL API | ok`) - const rest = github.getOctokit(token) - console.log(`Github REST API | ok`) - - //SVG output - const filename = core.getInput("filename") || "github-metrics.svg" - console.log(`SVG output file | ${filename}`) - - //SVG optimization - const optimize = bool(core.getInput("optimize"), true) - conf.optimize = optimize - console.log(`SVG optimization | ${optimize}`) - - //GitHub user - const user = core.getInput("user") || (await rest.users.getAuthenticated()).data.login - console.log(`GitHub user | ${user}`) - - //Debug mode - const debug = bool(core.getInput("debug")) - if (!debug) - console.debug = () => null - console.log(`Debug mode | ${debug}`) - - //Base elements - const base = {} - let parts = (core.getInput("base")||"").split(",").map(part => part.trim()) - if (!parts.length) - parts = conf.settings.plugins.base.parts - for (const part of parts) - base[`base.${part}`] = true - console.log(`Base parts | ${parts.join(", ")}`) - - //Additional plugins - const plugins = { - lines:{enabled:bool(core.getInput("plugin_lines"))}, - traffic:{enabled:bool(core.getInput("plugin_traffic"))}, - pagespeed:{enabled:bool(core.getInput("plugin_pagespeed"))}, - habits:{enabled:bool(core.getInput("plugin_habits")), from:Number(core.getInput("plugin_habits_from")) || 100}, - selfskip:{enabled:bool(core.getInput("plugin_selfskip"))}, - languages:{enabled:bool(core.getInput("plugin_languages"))}, - followup:{enabled:bool(core.getInput("plugin_followup"))}, - } - const q = Object.fromEntries(Object.entries(plugins).filter(([key, plugin]) => plugin.enabled).map(([key]) => [key, true])) - console.log(`Plugins enabled | ${Object.entries(plugins).filter(([key, plugin]) => plugin.enabled).map(([key]) => key).join(", ")}`) - if (plugins.pagespeed.enabled) { - plugins.pagespeed.token = core.getInput("pagespeed_token") - console.log(`Pagespeed token | ${plugins.pagespeed.token ? "provided" : "missing"}`) - } - - //Repositories to use - const repositories = Number(core.getInput("repositories")) || 100 - console.log(`Repositories to use | ${repositories}`) - - //Render metrics - const rendered = await metrics({login:user, q:{...q, ...base, repositories, template}}, {graphql, rest, plugins, conf}) - console.log(`Render | complete`) - - //Commit to repository - { - //Committer token - const token = core.getInput("committer_token") || core.getInput("token") - console.log(`Committer token | ${token ? "provided" : "missing"}`) - if (!token) - throw new Error("You must provide a valid GitHub token to commit your metrics") - const rest = github.getOctokit(token) - console.log(`Committer REST API | ok`) - console.log(`Committer | ${(await rest.users.getAuthenticated()).data.login}`) - //Retrieve previous render SHA to be able to update file content through API - let sha = null - try { - const {data} = await rest.repos.getContent({ - owner:user, - repo:user, - path:filename, - }) - sha = data.sha - } catch (error) { } - console.log(`Previous render sha | ${sha || "none"}`) - //Update file content through API - await rest.repos.createOrUpdateFileContents({ - owner:user, repo:user, path:filename, message:`Update ${filename} - [Skip GitHub Action]`, - content:Buffer.from(rendered).toString("base64"), - ...(sha ? {sha} : {}) - }) - console.log(`Commit to repo | ok`) - } - - //Success - console.log(`Success !`) - process.exit(0) - - //Errors - } catch (error) { - console.error(error) - core.setFailed(error.message) - process.exit(1) - } -})()).catch(error => process.exit(1)) - -/***/ }), - -/***/ 12541: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -const os = __importStar(__webpack_require__(12087)); -const utils_1 = __webpack_require__(74332); -/** - * Commands - * - * Command Format: - * ::name key=value,key=value::message - * - * Examples: - * ::warning::This is the message - * ::set-env name=MY_VAR::some value - */ -function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); -} -exports.issueCommand = issueCommand; -function issue(name, message = '') { - issueCommand(name, {}, message); -} -exports.issue = issue; -const CMD_STRING = '::'; -class Command { - constructor(command, properties, message) { - if (!command) { - command = 'missing.command'; - } - this.command = command; - this.properties = properties; - this.message = message; - } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += ' '; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } - else { - cmdStr += ','; - } - cmdStr += `${key}=${escapeProperty(val)}`; - } - } - } - } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; - } -} -function escapeData(s) { - return utils_1.toCommandValue(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A'); -} -function escapeProperty(s) { - return utils_1.toCommandValue(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A') - .replace(/:/g, '%3A') - .replace(/,/g, '%2C'); -} -//# sourceMappingURL=command.js.map - -/***/ }), - -/***/ 32882: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - 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) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -const command_1 = __webpack_require__(12541); -const file_command_1 = __webpack_require__(29582); -const utils_1 = __webpack_require__(74332); -const os = __importStar(__webpack_require__(12087)); -const path = __importStar(__webpack_require__(85622)); -/** - * The code to exit an action - */ -var ExitCode; -(function (ExitCode) { - /** - * A code indicating that the action was successful - */ - ExitCode[ExitCode["Success"] = 0] = "Success"; - /** - * A code indicating that the action was a failure - */ - ExitCode[ExitCode["Failure"] = 1] = "Failure"; -})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); -//----------------------------------------------------------------------- -// Variables -//----------------------------------------------------------------------- -/** - * Sets env variable for this action and future actions in the job - * @param name the name of the variable to set - * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function exportVariable(name, val) { - const convertedVal = utils_1.toCommandValue(val); - process.env[name] = convertedVal; - const filePath = process.env['GITHUB_ENV'] || ''; - if (filePath) { - const delimiter = '_GitHubActionsFileCommandDelimeter_'; - const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`; - file_command_1.issueCommand('ENV', commandValue); - } - else { - command_1.issueCommand('set-env', { name }, convertedVal); - } -} -exports.exportVariable = exportVariable; -/** - * Registers a secret which will get masked from logs - * @param secret value of the secret - */ -function setSecret(secret) { - command_1.issueCommand('add-mask', {}, secret); -} -exports.setSecret = setSecret; -/** - * Prepends inputPath to the PATH (for this action and future actions) - * @param inputPath - */ -function addPath(inputPath) { - const filePath = process.env['GITHUB_PATH'] || ''; - if (filePath) { - file_command_1.issueCommand('PATH', inputPath); - } - else { - command_1.issueCommand('add-path', {}, inputPath); - } - process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; -} -exports.addPath = addPath; -/** - * Gets the value of an input. The value is also trimmed. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string - */ -function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - return val.trim(); -} -exports.getInput = getInput; -/** - * Sets the value of an output. - * - * @param name name of the output to set - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function setOutput(name, value) { - command_1.issueCommand('set-output', { name }, value); -} -exports.setOutput = setOutput; -/** - * Enables or disables the echoing of commands into stdout for the rest of the step. - * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. - * - */ -function setCommandEcho(enabled) { - command_1.issue('echo', enabled ? 'on' : 'off'); -} -exports.setCommandEcho = setCommandEcho; -//----------------------------------------------------------------------- -// Results -//----------------------------------------------------------------------- -/** - * Sets the action status to failed. - * When the action exits it will be with an exit code of 1 - * @param message add error issue message - */ -function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); -} -exports.setFailed = setFailed; -//----------------------------------------------------------------------- -// Logging Commands -//----------------------------------------------------------------------- -/** - * Gets whether Actions Step Debug is on or not - */ -function isDebug() { - return process.env['RUNNER_DEBUG'] === '1'; -} -exports.isDebug = isDebug; -/** - * Writes debug message to user log - * @param message debug message - */ -function debug(message) { - command_1.issueCommand('debug', {}, message); -} -exports.debug = debug; -/** - * Adds an error issue - * @param message error issue message. Errors will be converted to string via toString() - */ -function error(message) { - command_1.issue('error', message instanceof Error ? message.toString() : message); -} -exports.error = error; -/** - * Adds an warning issue - * @param message warning issue message. Errors will be converted to string via toString() - */ -function warning(message) { - command_1.issue('warning', message instanceof Error ? message.toString() : message); -} -exports.warning = warning; -/** - * Writes info to log with console.log. - * @param message info message - */ -function info(message) { - process.stdout.write(message + os.EOL); -} -exports.info = info; -/** - * Begin an output group. - * - * Output until the next `groupEnd` will be foldable in this group - * - * @param name The name of the output group - */ -function startGroup(name) { - command_1.issue('group', name); -} -exports.startGroup = startGroup; -/** - * End an output group. - */ -function endGroup() { - command_1.issue('endgroup'); -} -exports.endGroup = endGroup; -/** - * Wrap an asynchronous function call in a group. - * - * Returns the same type as the function itself. - * - * @param name The name of the group - * @param fn The function to wrap in the group - */ -function group(name, fn) { - return __awaiter(this, void 0, void 0, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } - finally { - endGroup(); - } - return result; - }); -} -exports.group = group; -//----------------------------------------------------------------------- -// Wrapper action state -//----------------------------------------------------------------------- -/** - * Saves state for current action, the state can only be retrieved by this action's post job execution. - * - * @param name name of the state to store - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function saveState(name, value) { - command_1.issueCommand('save-state', { name }, value); -} -exports.saveState = saveState; -/** - * Gets the value of an state set by this action's main execution. - * - * @param name name of the state to get - * @returns string - */ -function getState(name) { - return process.env[`STATE_${name}`] || ''; -} -exports.getState = getState; -//# sourceMappingURL=core.js.map - -/***/ }), - -/***/ 29582: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -// For internal use, subject to change. -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -// We use any as a valid input type -/* eslint-disable @typescript-eslint/no-explicit-any */ -const fs = __importStar(__webpack_require__(35747)); -const os = __importStar(__webpack_require__(12087)); -const utils_1 = __webpack_require__(74332); -function issueCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error(`Unable to find environment variable for file command ${command}`); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { - encoding: 'utf8' - }); -} -exports.issueCommand = issueCommand; -//# sourceMappingURL=file-command.js.map - -/***/ }), - -/***/ 74332: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -// We use any as a valid input type -/* eslint-disable @typescript-eslint/no-explicit-any */ -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Sanitizes an input into a string so it can be passed into issueCommand safely - * @param input input to sanitize into a string - */ -function toCommandValue(input) { - if (input === null || input === undefined) { - return ''; - } - else if (typeof input === 'string' || input instanceof String) { - return input; - } - return JSON.stringify(input); -} -exports.toCommandValue = toCommandValue; -//# sourceMappingURL=utils.js.map - -/***/ }), - -/***/ 84873: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Context = void 0; -const fs_1 = __webpack_require__(35747); -const os_1 = __webpack_require__(12087); -class Context { - /** - * Hydrate the context from the environment - */ - constructor() { - this.payload = {}; - if (process.env.GITHUB_EVENT_PATH) { - if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) { - this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); - } - else { - const path = process.env.GITHUB_EVENT_PATH; - process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); - } - } - this.eventName = process.env.GITHUB_EVENT_NAME; - this.sha = process.env.GITHUB_SHA; - this.ref = process.env.GITHUB_REF; - this.workflow = process.env.GITHUB_WORKFLOW; - this.action = process.env.GITHUB_ACTION; - this.actor = process.env.GITHUB_ACTOR; - this.job = process.env.GITHUB_JOB; - this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); - this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); - } - get issue() { - const payload = this.payload; - return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); - } - get repo() { - if (process.env.GITHUB_REPOSITORY) { - const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); - return { owner, repo }; - } - if (this.payload.repository) { - return { - owner: this.payload.repository.owner.login, - repo: this.payload.repository.name - }; - } - throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); - } -} -exports.Context = Context; -//# sourceMappingURL=context.js.map - -/***/ }), - -/***/ 29483: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getOctokit = exports.context = void 0; -const Context = __importStar(__webpack_require__(84873)); -const utils_1 = __webpack_require__(24864); -exports.context = new Context.Context(); -/** - * Returns a hydrated octokit ready to use for GitHub Actions - * - * @param token the repo PAT or GITHUB_TOKEN - * @param options other options to set - */ -function getOctokit(token, options) { - return new utils_1.GitHub(utils_1.getOctokitOptions(token, options)); -} -exports.getOctokit = getOctokit; -//# sourceMappingURL=github.js.map - -/***/ }), - -/***/ 18145: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0; -const httpClient = __importStar(__webpack_require__(66305)); -function getAuthString(token, options) { - if (!token && !options.auth) { - throw new Error('Parameter token or opts.auth is required'); - } - else if (token && options.auth) { - throw new Error('Parameters token and opts.auth may not both be specified'); - } - return typeof options.auth === 'string' ? options.auth : `token ${token}`; -} -exports.getAuthString = getAuthString; -function getProxyAgent(destinationUrl) { - const hc = new httpClient.HttpClient(); - return hc.getAgent(destinationUrl); -} -exports.getProxyAgent = getProxyAgent; -function getApiBaseUrl() { - return process.env['GITHUB_API_URL'] || 'https://api.github.com'; -} -exports.getApiBaseUrl = getApiBaseUrl; -//# sourceMappingURL=utils.js.map - -/***/ }), - -/***/ 24864: -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getOctokitOptions = exports.GitHub = exports.context = void 0; -const Context = __importStar(__webpack_require__(84873)); -const Utils = __importStar(__webpack_require__(18145)); -// octokit + plugins -const core_1 = __webpack_require__(40812); -const plugin_rest_endpoint_methods_1 = __webpack_require__(5462); -const plugin_paginate_rest_1 = __webpack_require__(19227); -exports.context = new Context.Context(); -const baseUrl = Utils.getApiBaseUrl(); -const defaults = { - baseUrl, - request: { - agent: Utils.getProxyAgent(baseUrl) - } -}; -exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults); -/** - * Convience function to correctly format Octokit Options to pass into the constructor. - * - * @param token the repo PAT or GITHUB_TOKEN - * @param options other options to set - */ -function getOctokitOptions(token, options) { - const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller - // Auth - const auth = Utils.getAuthString(token, opts); - if (auth) { - opts.auth = auth; - } - return opts; -} -exports.getOctokitOptions = getOctokitOptions; -//# sourceMappingURL=utils.js.map - -/***/ }), - -/***/ 66305: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const url = __webpack_require__(78835); -const http = __webpack_require__(98605); -const https = __webpack_require__(57211); -const pm = __webpack_require__(92901); -let tunnel; -var HttpCodes; -(function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; -})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); -var Headers; -(function (Headers) { - Headers["Accept"] = "accept"; - Headers["ContentType"] = "content-type"; -})(Headers = exports.Headers || (exports.Headers = {})); -var MediaTypes; -(function (MediaTypes) { - MediaTypes["ApplicationJson"] = "application/json"; -})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); -/** - * Returns the proxy URL, depending upon the supplied url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ -function getProxyUrl(serverUrl) { - let proxyUrl = pm.getProxyUrl(url.parse(serverUrl)); - return proxyUrl ? proxyUrl.href : ''; -} -exports.getProxyUrl = getProxyUrl; -const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect -]; -const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout -]; -const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; -const ExponentialBackoffCeiling = 10; -const ExponentialBackoffTimeSlice = 5; -class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return new Promise(async (resolve, reject) => { - let output = Buffer.alloc(0); - this.message.on('data', (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on('end', () => { - resolve(output.toString()); - }); - }); - } -} -exports.HttpClientResponse = HttpClientResponse; -function isHttps(requestUrl) { - let parsedUrl = url.parse(requestUrl); - return parsedUrl.protocol === 'https:'; -} -exports.isHttps = isHttps; -class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } - } - } - options(requestUrl, additionalHeaders) { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - } - get(requestUrl, additionalHeaders) { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - } - del(requestUrl, additionalHeaders) { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - } - post(requestUrl, data, additionalHeaders) { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - } - patch(requestUrl, data, additionalHeaders) { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - } - put(requestUrl, data, additionalHeaders) { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - } - head(requestUrl, additionalHeaders) { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return this.request(verb, requestUrl, stream, additionalHeaders); - } - /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise - */ - async getJson(requestUrl, additionalHeaders = {}) { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - let res = await this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - } - async postJson(requestUrl, obj, additionalHeaders = {}) { - let data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - let res = await this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - } - async putJson(requestUrl, obj, additionalHeaders = {}) { - let data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - let res = await this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - } - async patchJson(requestUrl, obj, additionalHeaders = {}) { - let data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - let res = await this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - async request(verb, requestUrl, data, headers) { - if (this._disposed) { - throw new Error('Client has already been disposed.'); - } - let parsedUrl = url.parse(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1 - ? this._maxRetries + 1 - : 1; - let numTries = 0; - let response; - while (numTries < maxTries) { - response = await this.requestRaw(info, data); - // Check if it's an authentication challenge - if (response && - response.message && - response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (let i = 0; i < this.handlers.length; i++) { - if (this.handlers[i].canHandleAuthentication(response)) { - authenticationHandler = this.handlers[i]; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 && - this._allowRedirects && - redirectsRemaining > 0) { - const redirectUrl = response.message.headers['location']; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - let parsedRedirectUrl = url.parse(redirectUrl); - if (parsedUrl.protocol == 'https:' && - parsedUrl.protocol != parsedRedirectUrl.protocol && - !this._allowRedirectDowngrade) { - throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - await response.readBody(); - // strip authorization header if redirected to a different hostname - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (let header in headers) { - // header names are case insensitive - if (header.toLowerCase() === 'authorization') { - delete headers[header]; - } - } - } - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = await this.requestRaw(info, data); - redirectsRemaining--; - } - if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - await response.readBody(); - await this._performExponentialBackoff(numTries); - } - } - return response; - } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; - } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return new Promise((resolve, reject) => { - let callbackForResult = function (err, res) { - if (err) { - reject(err); - } - resolve(res); - }; - this.requestRawWithCallback(info, data, callbackForResult); - }); - } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - let socket; - if (typeof data === 'string') { - info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); - } - let callbackCalled = false; - let handleResult = (err, res) => { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - }; - let req = info.httpModule.request(info.options, (msg) => { - let res = new HttpClientResponse(msg); - handleResult(null, res); - }); - req.on('socket', sock => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error('Request timeout: ' + info.options.path), null); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err, null); - }); - if (data && typeof data === 'string') { - req.write(data, 'utf8'); - } - if (data && typeof data !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); - } - else { - req.end(); - } - } - /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - getAgent(serverUrl) { - let parsedUrl = url.parse(serverUrl); - return this._getAgent(parsedUrl); - } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port - ? parseInt(info.parsedUrl.port) - : defaultPort; - info.options.path = - (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers['user-agent'] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers) { - this.handlers.forEach(handler => { - handler.prepareRequest(info.options); - }); - } - return info; - } - _mergeHeaders(headers) { - const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); - } - return lowercaseKeys(headers || {}); - } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; - } - _getAgent(parsedUrl) { - let agent; - let proxyUrl = pm.getProxyUrl(parsedUrl); - let useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (this._keepAlive && !useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (!!agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (!!this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - if (useProxy) { - // If using proxy, need tunnel - if (!tunnel) { - tunnel = __webpack_require__(34603); - } - const agentOptions = { - maxSockets: maxSockets, - keepAlive: this._keepAlive, - proxy: { - proxyAuth: proxyUrl.auth, - host: proxyUrl.hostname, - port: proxyUrl.port - } - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if reusing agent across request and tunneling agent isn't assigned create a new agent - if (this._keepAlive && !agent) { - const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - // if not using private agent and tunnel agent isn't setup then use global agent - if (!agent) { - agent = usingSsl ? https.globalAgent : http.globalAgent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; - } - _performExponentialBackoff(retryNumber) { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - } - static dateTimeDeserializer(key, value) { - if (typeof value === 'string') { - let a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - async _processResponse(res, options) { - return new Promise(async (resolve, reject) => { - const statusCode = res.message.statusCode; - const response = { - statusCode: statusCode, - result: null, - headers: {} - }; - // not found leads to null obj returned - if (statusCode == HttpCodes.NotFound) { - resolve(response); - } - let obj; - let contents; - // get the result from the body - try { - contents = await res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, HttpClient.dateTimeDeserializer); - } - else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } - catch (err) { - // Invalid resource (contents not json); leaving result obj null - } - // note that 3xx redirects are handled by the http layer. - if (statusCode > 299) { - let msg; - // if exception/error in body, attempt to get better error - if (obj && obj.message) { - msg = obj.message; - } - else if (contents && contents.length > 0) { - // it may be the case that the exception is in the body message as string - msg = contents; - } - else { - msg = 'Failed request: (' + statusCode + ')'; - } - let err = new Error(msg); - // attach statusCode and body obj (if available) to the error object - err['statusCode'] = statusCode; - if (response.result) { - err['result'] = response.result; - } - reject(err); - } - else { - resolve(response); - } - }); - } -} -exports.HttpClient = HttpClient; - - -/***/ }), - -/***/ 92901: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const url = __webpack_require__(78835); -function getProxyUrl(reqUrl) { - let usingSsl = reqUrl.protocol === 'https:'; - let proxyUrl; - if (checkBypass(reqUrl)) { - return proxyUrl; - } - let proxyVar; - if (usingSsl) { - proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY']; - } - else { - proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY']; - } - if (proxyVar) { - proxyUrl = url.parse(proxyVar); - } - return proxyUrl; -} -exports.getProxyUrl = getProxyUrl; -function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; - if (!noProxy) { - return false; - } - // Determine the request port - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } - else if (reqUrl.protocol === 'http:') { - reqPort = 80; - } - else if (reqUrl.protocol === 'https:') { - reqPort = 443; - } - // Format the request hostname and hostname with port - let upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === 'number') { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - // Compare request host against noproxy - for (let upperNoProxyItem of noProxy - .split(',') - .map(x => x.trim().toUpperCase()) - .filter(x => x)) { - if (upperReqHosts.some(x => x === upperNoProxyItem)) { - return true; - } - } - return false; -} -exports.checkBypass = checkBypass; - - -/***/ }), - -/***/ 22899: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -async function auth(token) { - const tokenType = token.split(/\./).length === 3 ? "app" : /^v\d+\./.test(token) ? "installation" : "oauth"; - return { - type: "token", - token: token, - tokenType - }; -} - -/** - * Prefix token for usage in the Authorization header - * - * @param token OAuth token or JSON Web Token - */ -function withAuthorizationPrefix(token) { - if (token.split(/\./).length === 3) { - return `bearer ${token}`; - } - - return `token ${token}`; -} - -async function hook(token, request, route, parameters) { - const endpoint = request.endpoint.merge(route, parameters); - endpoint.headers.authorization = withAuthorizationPrefix(token); - return request(endpoint); -} - -const createTokenAuth = function createTokenAuth(token) { - if (!token) { - throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); - } - - if (typeof token !== "string") { - throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); - } - - token = token.replace(/^(token|bearer) +/i, ""); - return Object.assign(auth.bind(null, token), { - hook: hook.bind(null, token) - }); -}; - -exports.createTokenAuth = createTokenAuth; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 40812: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -var universalUserAgent = __webpack_require__(1857); -var beforeAfterHook = __webpack_require__(46401); -var request = __webpack_require__(48826); -var graphql = __webpack_require__(3584); -var authToken = __webpack_require__(22899); - -function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -} - -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - }); - keys.push.apply(keys, symbols); - } - - return keys; -} - -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - - if (i % 2) { - ownKeys(Object(source), true).forEach(function (key) { - _defineProperty(target, key, source[key]); - }); - } else if (Object.getOwnPropertyDescriptors) { - Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); - } else { - ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - } - - return target; -} - -const VERSION = "3.1.2"; - -class Octokit { - constructor(options = {}) { - const hook = new beforeAfterHook.Collection(); - const requestDefaults = { - baseUrl: request.request.endpoint.DEFAULTS.baseUrl, - headers: {}, - request: Object.assign({}, options.request, { - hook: hook.bind(null, "request") - }), - mediaType: { - previews: [], - format: "" - } - }; // prepend default user agent with `options.userAgent` if set - - requestDefaults.headers["user-agent"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(" "); - - if (options.baseUrl) { - requestDefaults.baseUrl = options.baseUrl; - } - - if (options.previews) { - requestDefaults.mediaType.previews = options.previews; - } - - if (options.timeZone) { - requestDefaults.headers["time-zone"] = options.timeZone; - } - - this.request = request.request.defaults(requestDefaults); - this.graphql = graphql.withCustomRequest(this.request).defaults(_objectSpread2(_objectSpread2({}, requestDefaults), {}, { - baseUrl: requestDefaults.baseUrl.replace(/\/api\/v3$/, "/api") - })); - this.log = Object.assign({ - debug: () => {}, - info: () => {}, - warn: console.warn.bind(console), - error: console.error.bind(console) - }, options.log); - this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance - // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registred. - // (2) If only `options.auth` is set, use the default token authentication strategy. - // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance. - // TODO: type `options.auth` based on `options.authStrategy`. - - if (!options.authStrategy) { - if (!options.auth) { - // (1) - this.auth = async () => ({ - type: "unauthenticated" - }); - } else { - // (2) - const auth = authToken.createTokenAuth(options.auth); // @ts-ignore ¯\_(ツ)_/¯ - - hook.wrap("request", auth.hook); - this.auth = auth; - } - } else { - const auth = options.authStrategy(Object.assign({ - request: this.request - }, options.auth)); // @ts-ignore ¯\_(ツ)_/¯ - - hook.wrap("request", auth.hook); - this.auth = auth; - } // apply plugins - // https://stackoverflow.com/a/16345172 - - - const classConstructor = this.constructor; - classConstructor.plugins.forEach(plugin => { - Object.assign(this, plugin(this, options)); - }); - } - - static defaults(defaults) { - const OctokitWithDefaults = class extends this { - constructor(...args) { - const options = args[0] || {}; - - if (typeof defaults === "function") { - super(defaults(options)); - return; - } - - super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { - userAgent: `${options.userAgent} ${defaults.userAgent}` - } : null)); - } - - }; - return OctokitWithDefaults; - } - /** - * Attach a plugin (or many) to your Octokit instance. - * - * @example - * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) - */ - - - static plugin(...newPlugins) { - var _a; - - const currentPlugins = this.plugins; - const NewOctokit = (_a = class extends this {}, _a.plugins = currentPlugins.concat(newPlugins.filter(plugin => !currentPlugins.includes(plugin))), _a); - return NewOctokit; - } - -} -Octokit.VERSION = VERSION; -Octokit.plugins = []; - -exports.Octokit = Octokit; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 70412: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -var isPlainObject = __webpack_require__(80641); -var universalUserAgent = __webpack_require__(1857); - -function lowercaseKeys(object) { - if (!object) { - return {}; - } - - return Object.keys(object).reduce((newObj, key) => { - newObj[key.toLowerCase()] = object[key]; - return newObj; - }, {}); -} - -function mergeDeep(defaults, options) { - const result = Object.assign({}, defaults); - Object.keys(options).forEach(key => { - if (isPlainObject.isPlainObject(options[key])) { - if (!(key in defaults)) Object.assign(result, { - [key]: options[key] - });else result[key] = mergeDeep(defaults[key], options[key]); - } else { - Object.assign(result, { - [key]: options[key] - }); - } - }); - return result; -} - -function removeUndefinedProperties(obj) { - for (const key in obj) { - if (obj[key] === undefined) { - delete obj[key]; - } - } - - return obj; -} - -function merge(defaults, route, options) { - if (typeof route === "string") { - let [method, url] = route.split(" "); - options = Object.assign(url ? { - method, - url - } : { - url: method - }, options); - } else { - options = Object.assign({}, route); - } // lowercase header names before merging with defaults to avoid duplicates - - - options.headers = lowercaseKeys(options.headers); // remove properties with undefined values before merging - - removeUndefinedProperties(options); - removeUndefinedProperties(options.headers); - const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten - - if (defaults && defaults.mediaType.previews.length) { - mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); - } - - mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, "")); - return mergedOptions; -} - -function addQueryParameters(url, parameters) { - const separator = /\?/.test(url) ? "&" : "?"; - const names = Object.keys(parameters); - - if (names.length === 0) { - return url; - } - - return url + separator + names.map(name => { - if (name === "q") { - return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); - } - - return `${name}=${encodeURIComponent(parameters[name])}`; - }).join("&"); -} - -const urlVariableRegex = /\{[^}]+\}/g; - -function removeNonChars(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); -} - -function extractUrlVariableNames(url) { - const matches = url.match(urlVariableRegex); - - if (!matches) { - return []; - } - - return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); -} - -function omit(object, keysToOmit) { - return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => { - obj[key] = object[key]; - return obj; - }, {}); -} - -// Based on https://github.com/bramstein/url-template, licensed under BSD -// TODO: create separate package. -// -// Copyright (c) 2012-2014, Bram Stein -// All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// 3. The name of the author may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* istanbul ignore file */ -function encodeReserved(str) { - return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) { - if (!/%[0-9A-Fa-f]/.test(part)) { - part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); - } - - return part; - }).join(""); -} - -function encodeUnreserved(str) { - return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { - return "%" + c.charCodeAt(0).toString(16).toUpperCase(); - }); -} - -function encodeValue(operator, value, key) { - value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); - - if (key) { - return encodeUnreserved(key) + "=" + value; - } else { - return value; - } -} - -function isDefined(value) { - return value !== undefined && value !== null; -} - -function isKeyOperator(operator) { - return operator === ";" || operator === "&" || operator === "?"; -} - -function getValues(context, operator, key, modifier) { - var value = context[key], - result = []; - - if (isDefined(value) && value !== "") { - if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { - value = value.toString(); - - if (modifier && modifier !== "*") { - value = value.substring(0, parseInt(modifier, 10)); - } - - result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); - } else { - if (modifier === "*") { - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function (value) { - result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); - }); - } else { - Object.keys(value).forEach(function (k) { - if (isDefined(value[k])) { - result.push(encodeValue(operator, value[k], k)); - } - }); - } - } else { - const tmp = []; - - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function (value) { - tmp.push(encodeValue(operator, value)); - }); - } else { - Object.keys(value).forEach(function (k) { - if (isDefined(value[k])) { - tmp.push(encodeUnreserved(k)); - tmp.push(encodeValue(operator, value[k].toString())); - } - }); - } - - if (isKeyOperator(operator)) { - result.push(encodeUnreserved(key) + "=" + tmp.join(",")); - } else if (tmp.length !== 0) { - result.push(tmp.join(",")); - } - } - } - } else { - if (operator === ";") { - if (isDefined(value)) { - result.push(encodeUnreserved(key)); - } - } else if (value === "" && (operator === "&" || operator === "?")) { - result.push(encodeUnreserved(key) + "="); - } else if (value === "") { - result.push(""); - } - } - - return result; -} - -function parseUrl(template) { - return { - expand: expand.bind(null, template) - }; -} - -function expand(template, context) { - var operators = ["+", "#", ".", "/", ";", "?", "&"]; - return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { - if (expression) { - let operator = ""; - const values = []; - - if (operators.indexOf(expression.charAt(0)) !== -1) { - operator = expression.charAt(0); - expression = expression.substr(1); - } - - expression.split(/,/g).forEach(function (variable) { - var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); - values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); - }); - - if (operator && operator !== "+") { - var separator = ","; - - if (operator === "?") { - separator = "&"; - } else if (operator !== "#") { - separator = operator; - } - - return (values.length !== 0 ? operator : "") + values.join(separator); - } else { - return values.join(","); - } - } else { - return encodeReserved(literal); - } - }); -} - -function parse(options) { - // https://fetch.spec.whatwg.org/#methods - let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible - - let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); - let headers = Object.assign({}, options.headers); - let body; - let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later - - const urlVariableNames = extractUrlVariableNames(url); - url = parseUrl(url).expand(parameters); - - if (!/^http/.test(url)) { - url = options.baseUrl + url; - } - - const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl"); - const remainingParameters = omit(parameters, omittedParameters); - const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); - - if (!isBinaryRequest) { - if (options.mediaType.format) { - // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw - headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); - } - - if (options.mediaType.previews.length) { - const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; - headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => { - const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; - return `application/vnd.github.${preview}-preview${format}`; - }).join(","); - } - } // for GET/HEAD requests, set URL query parameters from remaining parameters - // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters - - - if (["GET", "HEAD"].includes(method)) { - url = addQueryParameters(url, remainingParameters); - } else { - if ("data" in remainingParameters) { - body = remainingParameters.data; - } else { - if (Object.keys(remainingParameters).length) { - body = remainingParameters; - } else { - headers["content-length"] = 0; - } - } - } // default content-type for JSON if body is set - - - if (!headers["content-type"] && typeof body !== "undefined") { - headers["content-type"] = "application/json; charset=utf-8"; - } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body. - // fetch does not allow to set `content-length` header, but we can set body to an empty string - - - if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { - body = ""; - } // Only return body/request keys if present - - - return Object.assign({ - method, - url, - headers - }, typeof body !== "undefined" ? { - body - } : null, options.request ? { - request: options.request - } : null); -} - -function endpointWithDefaults(defaults, route, options) { - return parse(merge(defaults, route, options)); -} - -function withDefaults(oldDefaults, newDefaults) { - const DEFAULTS = merge(oldDefaults, newDefaults); - const endpoint = endpointWithDefaults.bind(null, DEFAULTS); - return Object.assign(endpoint, { - DEFAULTS, - defaults: withDefaults.bind(null, DEFAULTS), - merge: merge.bind(null, DEFAULTS), - parse - }); -} - -const VERSION = "6.0.8"; - -const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url. -// So we use RequestParameters and add method as additional required property. - -const DEFAULTS = { - method: "GET", - baseUrl: "https://api.github.com", - headers: { - accept: "application/vnd.github.v3+json", - "user-agent": userAgent - }, - mediaType: { - format: "", - previews: [] - } -}; - -const endpoint = withDefaults(null, DEFAULTS); - -exports.endpoint = endpoint; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 3584: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -var request = __webpack_require__(48826); -var universalUserAgent = __webpack_require__(1857); - -const VERSION = "4.5.6"; - -class GraphqlError extends Error { - constructor(request, response) { - const message = response.data.errors[0].message; - super(message); - Object.assign(this, response.data); - Object.assign(this, { - headers: response.headers - }); - this.name = "GraphqlError"; - this.request = request; // Maintains proper stack trace (only available on V8) - - /* istanbul ignore next */ - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - } - -} - -const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"]; -const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; -function graphql(request, query, options) { - if (typeof query === "string" && options && "query" in options) { - return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); - } - - const parsedOptions = typeof query === "string" ? Object.assign({ - query - }, options) : query; - const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { - if (NON_VARIABLE_OPTIONS.includes(key)) { - result[key] = parsedOptions[key]; - return result; - } - - if (!result.variables) { - result.variables = {}; - } - - result.variables[key] = parsedOptions[key]; - return result; - }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix - // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451 - - const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl; - - if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { - requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); - } - - return request(requestOptions).then(response => { - if (response.data.errors) { - const headers = {}; - - for (const key of Object.keys(response.headers)) { - headers[key] = response.headers[key]; - } - - throw new GraphqlError(requestOptions, { - headers, - data: response.data - }); - } - - return response.data.data; - }); -} - -function withDefaults(request$1, newDefaults) { - const newRequest = request$1.defaults(newDefaults); - - const newApi = (query, options) => { - return graphql(newRequest, query, options); - }; - - return Object.assign(newApi, { - defaults: withDefaults.bind(null, newRequest), - endpoint: request.request.endpoint - }); -} - -const graphql$1 = withDefaults(request.request, { - headers: { - "user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}` - }, - method: "POST", - url: "/graphql" -}); -function withCustomRequest(customRequest) { - return withDefaults(customRequest, { - method: "POST", - url: "/graphql" - }); -} - -exports.graphql = graphql$1; -exports.withCustomRequest = withCustomRequest; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 19227: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -const VERSION = "2.4.0"; - -/** - * Some “list” response that can be paginated have a different response structure - * - * They have a `total_count` key in the response (search also has `incomplete_results`, - * /installation/repositories also has `repository_selection`), as well as a key with - * the list of the items which name varies from endpoint to endpoint. - * - * Octokit normalizes these responses so that paginated results are always returned following - * the same structure. One challenge is that if the list response has only one page, no Link - * header is provided, so this header alone is not sufficient to check wether a response is - * paginated or not. - * - * We check if a "total_count" key is present in the response data, but also make sure that - * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would - * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref - */ -function normalizePaginatedListResponse(response) { - const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); - if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way - // to retrieve the same information. - - const incompleteResults = response.data.incomplete_results; - const repositorySelection = response.data.repository_selection; - const totalCount = response.data.total_count; - delete response.data.incomplete_results; - delete response.data.repository_selection; - delete response.data.total_count; - const namespaceKey = Object.keys(response.data)[0]; - const data = response.data[namespaceKey]; - response.data = data; - - if (typeof incompleteResults !== "undefined") { - response.data.incomplete_results = incompleteResults; - } - - if (typeof repositorySelection !== "undefined") { - response.data.repository_selection = repositorySelection; - } - - response.data.total_count = totalCount; - return response; -} - -function iterator(octokit, route, parameters) { - const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); - const requestMethod = typeof route === "function" ? route : octokit.request; - const method = options.method; - const headers = options.headers; - let url = options.url; - return { - [Symbol.asyncIterator]: () => ({ - next() { - if (!url) { - return Promise.resolve({ - done: true - }); - } - - return requestMethod({ - method, - url, - headers - }).then(normalizePaginatedListResponse).then(response => { - // `response.headers.link` format: - // '; rel="next", ; rel="last"' - // sets `url` to undefined if "next" URL is not present or `link` header is not set - url = ((response.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; - return { - value: response - }; - }); - } - - }) - }; -} - -function paginate(octokit, route, parameters, mapFn) { - if (typeof parameters === "function") { - mapFn = parameters; - parameters = undefined; - } - - return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); -} - -function gather(octokit, results, iterator, mapFn) { - return iterator.next().then(result => { - if (result.done) { - return results; - } - - let earlyExit = false; - - function done() { - earlyExit = true; - } - - results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); - - if (earlyExit) { - return results; - } - - return gather(octokit, results, iterator, mapFn); - }); -} - -/** - * @param octokit Octokit instance - * @param options Options passed to Octokit constructor - */ - -function paginateRest(octokit) { - return { - paginate: Object.assign(paginate.bind(null, octokit), { - iterator: iterator.bind(null, octokit) - }) - }; -} -paginateRest.VERSION = VERSION; - -exports.paginateRest = paginateRest; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 5462: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -const Endpoints = { - actions: { - addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], - cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], - createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], - createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], - createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], - createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], - createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], - createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], - deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], - deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], - deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], - deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], - deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], - deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], - downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], - downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], - downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], - getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], - getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], - getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], - getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], - getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], - getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], - getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], - getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], - getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], - getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], - listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], - listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], - listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], - listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], - listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], - listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], - listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], - listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], - listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], - listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], - listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], - listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], - reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], - removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], - setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"] - }, - activity: { - checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], - deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], - deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], - getFeeds: ["GET /feeds"], - getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], - getThread: ["GET /notifications/threads/{thread_id}"], - getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], - listEventsForAuthenticatedUser: ["GET /users/{username}/events"], - listNotificationsForAuthenticatedUser: ["GET /notifications"], - listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], - listPublicEvents: ["GET /events"], - listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], - listPublicEventsForUser: ["GET /users/{username}/events/public"], - listPublicOrgEvents: ["GET /orgs/{org}/events"], - listReceivedEventsForUser: ["GET /users/{username}/received_events"], - listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], - listRepoEvents: ["GET /repos/{owner}/{repo}/events"], - listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], - listReposStarredByAuthenticatedUser: ["GET /user/starred"], - listReposStarredByUser: ["GET /users/{username}/starred"], - listReposWatchedByUser: ["GET /users/{username}/subscriptions"], - listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], - listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], - listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], - markNotificationsAsRead: ["PUT /notifications"], - markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], - markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], - setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], - setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], - starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], - unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] - }, - apps: { - addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], - checkToken: ["POST /applications/{client_id}/token"], - createContentAttachment: ["POST /content_references/{content_reference_id}/attachments", { - mediaType: { - previews: ["corsair"] - } - }], - createFromManifest: ["POST /app-manifests/{code}/conversions"], - createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], - deleteAuthorization: ["DELETE /applications/{client_id}/grant"], - deleteInstallation: ["DELETE /app/installations/{installation_id}"], - deleteToken: ["DELETE /applications/{client_id}/token"], - getAuthenticated: ["GET /app"], - getBySlug: ["GET /apps/{app_slug}"], - getInstallation: ["GET /app/installations/{installation_id}"], - getOrgInstallation: ["GET /orgs/{org}/installation"], - getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], - getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], - getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], - getUserInstallation: ["GET /users/{username}/installation"], - listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], - listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], - listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], - listInstallations: ["GET /app/installations"], - listInstallationsForAuthenticatedUser: ["GET /user/installations"], - listPlans: ["GET /marketplace_listing/plans"], - listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], - listReposAccessibleToInstallation: ["GET /installation/repositories"], - listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], - listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], - removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], - resetToken: ["PATCH /applications/{client_id}/token"], - revokeInstallationAccessToken: ["DELETE /installation/token"], - suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], - unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"] - }, - billing: { - getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], - getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], - getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], - getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], - getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], - getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] - }, - checks: { - create: ["POST /repos/{owner}/{repo}/check-runs", { - mediaType: { - previews: ["antiope"] - } - }], - createSuite: ["POST /repos/{owner}/{repo}/check-suites", { - mediaType: { - previews: ["antiope"] - } - }], - get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}", { - mediaType: { - previews: ["antiope"] - } - }], - getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}", { - mediaType: { - previews: ["antiope"] - } - }], - listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", { - mediaType: { - previews: ["antiope"] - } - }], - listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs", { - mediaType: { - previews: ["antiope"] - } - }], - listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", { - mediaType: { - previews: ["antiope"] - } - }], - listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites", { - mediaType: { - previews: ["antiope"] - } - }], - rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest", { - mediaType: { - previews: ["antiope"] - } - }], - setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences", { - mediaType: { - previews: ["antiope"] - } - }], - update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}", { - mediaType: { - previews: ["antiope"] - } - }] - }, - codeScanning: { - getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { - renamedParameters: { - alert_id: "alert_number" - } - }], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], - listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], - updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], - uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] - }, - codesOfConduct: { - getAllCodesOfConduct: ["GET /codes_of_conduct", { - mediaType: { - previews: ["scarlet-witch"] - } - }], - getConductCode: ["GET /codes_of_conduct/{key}", { - mediaType: { - previews: ["scarlet-witch"] - } - }], - getForRepo: ["GET /repos/{owner}/{repo}/community/code_of_conduct", { - mediaType: { - previews: ["scarlet-witch"] - } - }] - }, - emojis: { - get: ["GET /emojis"] - }, - gists: { - checkIsStarred: ["GET /gists/{gist_id}/star"], - create: ["POST /gists"], - createComment: ["POST /gists/{gist_id}/comments"], - delete: ["DELETE /gists/{gist_id}"], - deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], - fork: ["POST /gists/{gist_id}/forks"], - get: ["GET /gists/{gist_id}"], - getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], - getRevision: ["GET /gists/{gist_id}/{sha}"], - list: ["GET /gists"], - listComments: ["GET /gists/{gist_id}/comments"], - listCommits: ["GET /gists/{gist_id}/commits"], - listForUser: ["GET /users/{username}/gists"], - listForks: ["GET /gists/{gist_id}/forks"], - listPublic: ["GET /gists/public"], - listStarred: ["GET /gists/starred"], - star: ["PUT /gists/{gist_id}/star"], - unstar: ["DELETE /gists/{gist_id}/star"], - update: ["PATCH /gists/{gist_id}"], - updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] - }, - git: { - createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], - createCommit: ["POST /repos/{owner}/{repo}/git/commits"], - createRef: ["POST /repos/{owner}/{repo}/git/refs"], - createTag: ["POST /repos/{owner}/{repo}/git/tags"], - createTree: ["POST /repos/{owner}/{repo}/git/trees"], - deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], - getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], - getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], - getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], - getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], - getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], - listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], - updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] - }, - gitignore: { - getAllTemplates: ["GET /gitignore/templates"], - getTemplate: ["GET /gitignore/templates/{name}"] - }, - interactions: { - getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits", { - mediaType: { - previews: ["sombra"] - } - }], - getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits", { - mediaType: { - previews: ["sombra"] - } - }], - removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits", { - mediaType: { - previews: ["sombra"] - } - }], - removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits", { - mediaType: { - previews: ["sombra"] - } - }], - setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits", { - mediaType: { - previews: ["sombra"] - } - }], - setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits", { - mediaType: { - previews: ["sombra"] - } - }] - }, - issues: { - addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], - addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], - checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], - create: ["POST /repos/{owner}/{repo}/issues"], - createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], - createLabel: ["POST /repos/{owner}/{repo}/labels"], - createMilestone: ["POST /repos/{owner}/{repo}/milestones"], - deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], - deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], - deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], - get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], - getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], - getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], - getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], - getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], - list: ["GET /issues"], - listAssignees: ["GET /repos/{owner}/{repo}/assignees"], - listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], - listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], - listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], - listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], - listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", { - mediaType: { - previews: ["mockingbird"] - } - }], - listForAuthenticatedUser: ["GET /user/issues"], - listForOrg: ["GET /orgs/{org}/issues"], - listForRepo: ["GET /repos/{owner}/{repo}/issues"], - listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], - listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], - listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], - listMilestones: ["GET /repos/{owner}/{repo}/milestones"], - lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], - removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], - removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], - removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], - setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], - unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], - update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], - updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], - updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], - updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] - }, - licenses: { - get: ["GET /licenses/{license}"], - getAllCommonlyUsed: ["GET /licenses"], - getForRepo: ["GET /repos/{owner}/{repo}/license"] - }, - markdown: { - render: ["POST /markdown"], - renderRaw: ["POST /markdown/raw", { - headers: { - "content-type": "text/plain; charset=utf-8" - } - }] - }, - meta: { - get: ["GET /meta"] - }, - migrations: { - cancelImport: ["DELETE /repos/{owner}/{repo}/import"], - deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive", { - mediaType: { - previews: ["wyandotte"] - } - }], - deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive", { - mediaType: { - previews: ["wyandotte"] - } - }], - downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive", { - mediaType: { - previews: ["wyandotte"] - } - }], - getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive", { - mediaType: { - previews: ["wyandotte"] - } - }], - getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], - getImportStatus: ["GET /repos/{owner}/{repo}/import"], - getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], - getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}", { - mediaType: { - previews: ["wyandotte"] - } - }], - getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}", { - mediaType: { - previews: ["wyandotte"] - } - }], - listForAuthenticatedUser: ["GET /user/migrations", { - mediaType: { - previews: ["wyandotte"] - } - }], - listForOrg: ["GET /orgs/{org}/migrations", { - mediaType: { - previews: ["wyandotte"] - } - }], - listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories", { - mediaType: { - previews: ["wyandotte"] - } - }], - listReposForUser: ["GET /user/migrations/{migration_id}/repositories", { - mediaType: { - previews: ["wyandotte"] - } - }], - mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], - setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], - startForAuthenticatedUser: ["POST /user/migrations"], - startForOrg: ["POST /orgs/{org}/migrations"], - startImport: ["PUT /repos/{owner}/{repo}/import"], - unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock", { - mediaType: { - previews: ["wyandotte"] - } - }], - unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock", { - mediaType: { - previews: ["wyandotte"] - } - }], - updateImport: ["PATCH /repos/{owner}/{repo}/import"] - }, - orgs: { - blockUser: ["PUT /orgs/{org}/blocks/{username}"], - checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], - checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], - checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], - convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], - createInvitation: ["POST /orgs/{org}/invitations"], - createWebhook: ["POST /orgs/{org}/hooks"], - deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], - get: ["GET /orgs/{org}"], - getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], - getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], - getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], - list: ["GET /organizations"], - listAppInstallations: ["GET /orgs/{org}/installations"], - listBlockedUsers: ["GET /orgs/{org}/blocks"], - listForAuthenticatedUser: ["GET /user/orgs"], - listForUser: ["GET /users/{username}/orgs"], - listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], - listMembers: ["GET /orgs/{org}/members"], - listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], - listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], - listPendingInvitations: ["GET /orgs/{org}/invitations"], - listPublicMembers: ["GET /orgs/{org}/public_members"], - listWebhooks: ["GET /orgs/{org}/hooks"], - pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], - removeMember: ["DELETE /orgs/{org}/members/{username}"], - removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], - removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], - removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], - setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], - setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], - unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], - update: ["PATCH /orgs/{org}"], - updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], - updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"] - }, - projects: { - addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}", { - mediaType: { - previews: ["inertia"] - } - }], - createCard: ["POST /projects/columns/{column_id}/cards", { - mediaType: { - previews: ["inertia"] - } - }], - createColumn: ["POST /projects/{project_id}/columns", { - mediaType: { - previews: ["inertia"] - } - }], - createForAuthenticatedUser: ["POST /user/projects", { - mediaType: { - previews: ["inertia"] - } - }], - createForOrg: ["POST /orgs/{org}/projects", { - mediaType: { - previews: ["inertia"] - } - }], - createForRepo: ["POST /repos/{owner}/{repo}/projects", { - mediaType: { - previews: ["inertia"] - } - }], - delete: ["DELETE /projects/{project_id}", { - mediaType: { - previews: ["inertia"] - } - }], - deleteCard: ["DELETE /projects/columns/cards/{card_id}", { - mediaType: { - previews: ["inertia"] - } - }], - deleteColumn: ["DELETE /projects/columns/{column_id}", { - mediaType: { - previews: ["inertia"] - } - }], - get: ["GET /projects/{project_id}", { - mediaType: { - previews: ["inertia"] - } - }], - getCard: ["GET /projects/columns/cards/{card_id}", { - mediaType: { - previews: ["inertia"] - } - }], - getColumn: ["GET /projects/columns/{column_id}", { - mediaType: { - previews: ["inertia"] - } - }], - getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission", { - mediaType: { - previews: ["inertia"] - } - }], - listCards: ["GET /projects/columns/{column_id}/cards", { - mediaType: { - previews: ["inertia"] - } - }], - listCollaborators: ["GET /projects/{project_id}/collaborators", { - mediaType: { - previews: ["inertia"] - } - }], - listColumns: ["GET /projects/{project_id}/columns", { - mediaType: { - previews: ["inertia"] - } - }], - listForOrg: ["GET /orgs/{org}/projects", { - mediaType: { - previews: ["inertia"] - } - }], - listForRepo: ["GET /repos/{owner}/{repo}/projects", { - mediaType: { - previews: ["inertia"] - } - }], - listForUser: ["GET /users/{username}/projects", { - mediaType: { - previews: ["inertia"] - } - }], - moveCard: ["POST /projects/columns/cards/{card_id}/moves", { - mediaType: { - previews: ["inertia"] - } - }], - moveColumn: ["POST /projects/columns/{column_id}/moves", { - mediaType: { - previews: ["inertia"] - } - }], - removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}", { - mediaType: { - previews: ["inertia"] - } - }], - update: ["PATCH /projects/{project_id}", { - mediaType: { - previews: ["inertia"] - } - }], - updateCard: ["PATCH /projects/columns/cards/{card_id}", { - mediaType: { - previews: ["inertia"] - } - }], - updateColumn: ["PATCH /projects/columns/{column_id}", { - mediaType: { - previews: ["inertia"] - } - }] - }, - pulls: { - checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], - create: ["POST /repos/{owner}/{repo}/pulls"], - createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], - createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], - createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], - deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], - dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], - get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], - getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], - list: ["GET /repos/{owner}/{repo}/pulls"], - listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], - listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], - listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], - listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], - listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], - listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], - listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], - merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], - removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], - requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], - submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], - update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], - updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch", { - mediaType: { - previews: ["lydian"] - } - }], - updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] - }, - rateLimit: { - get: ["GET /rate_limit"] - }, - reactions: { - createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - deleteLegacy: ["DELETE /reactions/{reaction_id}", { - mediaType: { - previews: ["squirrel-girl"] - } - }, { - deprecated: "octokit.reactions.deleteLegacy() is deprecated, see https://developer.github.com/v3/reactions/#delete-a-reaction-legacy" - }], - listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }], - listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", { - mediaType: { - previews: ["squirrel-girl"] - } - }] - }, - repos: { - acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}"], - addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { - mapToData: "apps" - }], - addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], - addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { - mapToData: "contexts" - }], - addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { - mapToData: "teams" - }], - addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { - mapToData: "users" - }], - checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], - checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts", { - mediaType: { - previews: ["dorian"] - } - }], - compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], - createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], - createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { - mediaType: { - previews: ["zzzax"] - } - }], - createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], - createDeployKey: ["POST /repos/{owner}/{repo}/keys"], - createDeployment: ["POST /repos/{owner}/{repo}/deployments"], - createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], - createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], - createForAuthenticatedUser: ["POST /user/repos"], - createFork: ["POST /repos/{owner}/{repo}/forks"], - createInOrg: ["POST /orgs/{org}/repos"], - createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], - createPagesSite: ["POST /repos/{owner}/{repo}/pages", { - mediaType: { - previews: ["switcheroo"] - } - }], - createRelease: ["POST /repos/{owner}/{repo}/releases"], - createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate", { - mediaType: { - previews: ["baptiste"] - } - }], - createWebhook: ["POST /repos/{owner}/{repo}/hooks"], - declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}"], - delete: ["DELETE /repos/{owner}/{repo}"], - deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], - deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], - deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], - deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], - deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { - mediaType: { - previews: ["zzzax"] - } - }], - deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], - deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], - deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], - deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], - deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages", { - mediaType: { - previews: ["switcheroo"] - } - }], - deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], - deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], - deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], - deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], - disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes", { - mediaType: { - previews: ["london"] - } - }], - disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts", { - mediaType: { - previews: ["dorian"] - } - }], - downloadArchive: ["GET /repos/{owner}/{repo}/{archive_format}/{ref}"], - enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes", { - mediaType: { - previews: ["london"] - } - }], - enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts", { - mediaType: { - previews: ["dorian"] - } - }], - get: ["GET /repos/{owner}/{repo}"], - getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], - getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], - getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], - getAllTopics: ["GET /repos/{owner}/{repo}/topics", { - mediaType: { - previews: ["mercy"] - } - }], - getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], - getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], - getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], - getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], - getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], - getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], - getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], - getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], - getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], - getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], - getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { - mediaType: { - previews: ["zzzax"] - } - }], - getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile", { - mediaType: { - previews: ["black-panther"] - } - }], - getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], - getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], - getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], - getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], - getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], - getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], - getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], - getPages: ["GET /repos/{owner}/{repo}/pages"], - getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], - getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], - getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], - getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], - getReadme: ["GET /repos/{owner}/{repo}/readme"], - getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], - getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], - getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], - getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], - getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], - getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], - getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], - getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], - getViews: ["GET /repos/{owner}/{repo}/traffic/views"], - getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], - listBranches: ["GET /repos/{owner}/{repo}/branches"], - listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head", { - mediaType: { - previews: ["groot"] - } - }], - listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], - listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], - listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], - listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], - listCommits: ["GET /repos/{owner}/{repo}/commits"], - listContributors: ["GET /repos/{owner}/{repo}/contributors"], - listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], - listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], - listDeployments: ["GET /repos/{owner}/{repo}/deployments"], - listForAuthenticatedUser: ["GET /user/repos"], - listForOrg: ["GET /orgs/{org}/repos"], - listForUser: ["GET /users/{username}/repos"], - listForks: ["GET /repos/{owner}/{repo}/forks"], - listInvitations: ["GET /repos/{owner}/{repo}/invitations"], - listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], - listLanguages: ["GET /repos/{owner}/{repo}/languages"], - listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], - listPublic: ["GET /repositories"], - listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", { - mediaType: { - previews: ["groot"] - } - }], - listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], - listReleases: ["GET /repos/{owner}/{repo}/releases"], - listTags: ["GET /repos/{owner}/{repo}/tags"], - listTeams: ["GET /repos/{owner}/{repo}/teams"], - listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], - merge: ["POST /repos/{owner}/{repo}/merges"], - pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], - removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { - mapToData: "apps" - }], - removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], - removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { - mapToData: "contexts" - }], - removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], - removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { - mapToData: "teams" - }], - removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { - mapToData: "users" - }], - replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics", { - mediaType: { - previews: ["mercy"] - } - }], - requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], - setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], - setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { - mapToData: "apps" - }], - setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { - mapToData: "contexts" - }], - setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { - mapToData: "teams" - }], - setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { - mapToData: "users" - }], - testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], - transfer: ["POST /repos/{owner}/{repo}/transfer"], - update: ["PATCH /repos/{owner}/{repo}"], - updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], - updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], - updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], - updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], - updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], - updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], - updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], - updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], - updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], - uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { - baseUrl: "https://uploads.github.com" - }] - }, - search: { - code: ["GET /search/code"], - commits: ["GET /search/commits", { - mediaType: { - previews: ["cloak"] - } - }], - issuesAndPullRequests: ["GET /search/issues"], - labels: ["GET /search/labels"], - repos: ["GET /search/repositories"], - topics: ["GET /search/topics", { - mediaType: { - previews: ["mercy"] - } - }], - users: ["GET /search/users"] - }, - teams: { - addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], - addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}", { - mediaType: { - previews: ["inertia"] - } - }], - addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}", { - mediaType: { - previews: ["inertia"] - } - }], - checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - create: ["POST /orgs/{org}/teams"], - createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], - createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], - deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], - deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], - getByName: ["GET /orgs/{org}/teams/{team_slug}"], - getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], - getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], - list: ["GET /orgs/{org}/teams"], - listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], - listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], - listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], - listForAuthenticatedUser: ["GET /user/teams"], - listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], - listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], - listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects", { - mediaType: { - previews: ["inertia"] - } - }], - listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], - removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], - removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], - removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], - updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] - }, - users: { - addEmailForAuthenticated: ["POST /user/emails"], - block: ["PUT /user/blocks/{username}"], - checkBlocked: ["GET /user/blocks/{username}"], - checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], - checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], - createGpgKeyForAuthenticated: ["POST /user/gpg_keys"], - createPublicSshKeyForAuthenticated: ["POST /user/keys"], - deleteEmailForAuthenticated: ["DELETE /user/emails"], - deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}"], - deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}"], - follow: ["PUT /user/following/{username}"], - getAuthenticated: ["GET /user"], - getByUsername: ["GET /users/{username}"], - getContextForUser: ["GET /users/{username}/hovercard"], - getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}"], - getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}"], - list: ["GET /users"], - listBlockedByAuthenticated: ["GET /user/blocks"], - listEmailsForAuthenticated: ["GET /user/emails"], - listFollowedByAuthenticated: ["GET /user/following"], - listFollowersForAuthenticatedUser: ["GET /user/followers"], - listFollowersForUser: ["GET /users/{username}/followers"], - listFollowingForUser: ["GET /users/{username}/following"], - listGpgKeysForAuthenticated: ["GET /user/gpg_keys"], - listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], - listPublicEmailsForAuthenticated: ["GET /user/public_emails"], - listPublicKeysForUser: ["GET /users/{username}/keys"], - listPublicSshKeysForAuthenticated: ["GET /user/keys"], - setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility"], - unblock: ["DELETE /user/blocks/{username}"], - unfollow: ["DELETE /user/following/{username}"], - updateAuthenticated: ["PATCH /user"] - } -}; - -const VERSION = "4.2.0"; - -function endpointsToMethods(octokit, endpointsMap) { - const newMethods = {}; - - for (const [scope, endpoints] of Object.entries(endpointsMap)) { - for (const [methodName, endpoint] of Object.entries(endpoints)) { - const [route, defaults, decorations] = endpoint; - const [method, url] = route.split(/ /); - const endpointDefaults = Object.assign({ - method, - url - }, defaults); - - if (!newMethods[scope]) { - newMethods[scope] = {}; - } - - const scopeMethods = newMethods[scope]; - - if (decorations) { - scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); - continue; - } - - scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); - } - } - - return newMethods; -} - -function decorate(octokit, scope, methodName, defaults, decorations) { - const requestWithDefaults = octokit.request.defaults(defaults); - /* istanbul ignore next */ - - function withDecorations(...args) { - // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 - let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData` - - if (decorations.mapToData) { - options = Object.assign({}, options, { - data: options[decorations.mapToData], - [decorations.mapToData]: undefined - }); - return requestWithDefaults(options); - } - - if (decorations.renamed) { - const [newScope, newMethodName] = decorations.renamed; - octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); - } - - if (decorations.deprecated) { - octokit.log.warn(decorations.deprecated); - } - - if (decorations.renamedParameters) { - // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 - const options = requestWithDefaults.endpoint.merge(...args); - - for (const [name, alias] of Object.entries(decorations.renamedParameters)) { - if (name in options) { - octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); - - if (!(alias in options)) { - options[alias] = options[name]; - } - - delete options[name]; - } - } - - return requestWithDefaults(options); - } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 - - - return requestWithDefaults(...args); - } - - return Object.assign(withDecorations, requestWithDefaults); -} - -/** - * This plugin is a 1:1 copy of internal @octokit/rest plugins. The primary - * goal is to rebuild @octokit/rest on top of @octokit/core. Once that is - * done, we will remove the registerEndpoints methods and return the methods - * directly as with the other plugins. At that point we will also remove the - * legacy workarounds and deprecations. - * - * See the plan at - * https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/1 - */ - -function restEndpointMethods(octokit) { - return endpointsToMethods(octokit, Endpoints); -} -restEndpointMethods.VERSION = VERSION; - -exports.restEndpointMethods = restEndpointMethods; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 48364: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var deprecation = __webpack_require__(86649); -var once = _interopDefault(__webpack_require__(86343)); - -const logOnce = once(deprecation => console.warn(deprecation)); -/** - * Error with extra properties to help with debugging - */ - -class RequestError extends Error { - constructor(message, statusCode, options) { - super(message); // Maintains proper stack trace (only available on V8) - - /* istanbul ignore next */ - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = "HttpError"; - this.status = statusCode; - Object.defineProperty(this, "code", { - get() { - logOnce(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); - return statusCode; - } - - }); - this.headers = options.headers || {}; // redact request credentials without mutating original request options - - const requestCopy = Object.assign({}, options.request); - - if (options.request.headers.authorization) { - requestCopy.headers = Object.assign({}, options.request.headers, { - authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") - }); - } - - requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit - // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications - .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended - // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header - .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); - this.request = requestCopy; - } - -} - -exports.RequestError = RequestError; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 48826: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var endpoint = __webpack_require__(70412); -var universalUserAgent = __webpack_require__(1857); -var isPlainObject = __webpack_require__(80641); -var nodeFetch = _interopDefault(__webpack_require__(22434)); -var requestError = __webpack_require__(48364); - -const VERSION = "5.4.9"; - -function getBufferResponse(response) { - return response.arrayBuffer(); -} - -function fetchWrapper(requestOptions) { - if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { - requestOptions.body = JSON.stringify(requestOptions.body); - } - - let headers = {}; - let status; - let url; - const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch; - return fetch(requestOptions.url, Object.assign({ - method: requestOptions.method, - body: requestOptions.body, - headers: requestOptions.headers, - redirect: requestOptions.redirect - }, requestOptions.request)).then(response => { - url = response.url; - status = response.status; - - for (const keyAndValue of response.headers) { - headers[keyAndValue[0]] = keyAndValue[1]; - } - - if (status === 204 || status === 205) { - return; - } // GitHub API returns 200 for HEAD requests - - - if (requestOptions.method === "HEAD") { - if (status < 400) { - return; - } - - throw new requestError.RequestError(response.statusText, status, { - headers, - request: requestOptions - }); - } - - if (status === 304) { - throw new requestError.RequestError("Not modified", status, { - headers, - request: requestOptions - }); - } - - if (status >= 400) { - return response.text().then(message => { - const error = new requestError.RequestError(message, status, { - headers, - request: requestOptions - }); - - try { - let responseBody = JSON.parse(error.message); - Object.assign(error, responseBody); - let errors = responseBody.errors; // Assumption `errors` would always be in Array format - - error.message = error.message + ": " + errors.map(JSON.stringify).join(", "); - } catch (e) {// ignore, see octokit/rest.js#684 - } - - throw error; - }); - } - - const contentType = response.headers.get("content-type"); - - if (/application\/json/.test(contentType)) { - return response.json(); - } - - if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { - return response.text(); - } - - return getBufferResponse(response); - }).then(data => { - return { - status, - url, - headers, - data - }; - }).catch(error => { - if (error instanceof requestError.RequestError) { - throw error; - } - - throw new requestError.RequestError(error.message, 500, { - headers, - request: requestOptions - }); - }); -} - -function withDefaults(oldEndpoint, newDefaults) { - const endpoint = oldEndpoint.defaults(newDefaults); - - const newApi = function (route, parameters) { - const endpointOptions = endpoint.merge(route, parameters); - - if (!endpointOptions.request || !endpointOptions.request.hook) { - return fetchWrapper(endpoint.parse(endpointOptions)); - } - - const request = (route, parameters) => { - return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); - }; - - Object.assign(request, { - endpoint, - defaults: withDefaults.bind(null, endpoint) - }); - return endpointOptions.request.hook(request, endpointOptions); - }; - - return Object.assign(newApi, { - endpoint, - defaults: withDefaults.bind(null, endpoint) - }); -} - -const request = withDefaults(endpoint.endpoint, { - headers: { - "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` - } -}); - -exports.request = request; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 2390: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = __webpack_require__(64579); - -/***/ }), - -/***/ 38007: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); -var settle = __webpack_require__(29801); -var buildFullPath = __webpack_require__(92074); -var buildURL = __webpack_require__(87481); -var http = __webpack_require__(98605); -var https = __webpack_require__(57211); -var httpFollow = __webpack_require__(75955).http; -var httpsFollow = __webpack_require__(75955).https; -var url = __webpack_require__(78835); -var zlib = __webpack_require__(78761); -var pkg = __webpack_require__(35131); -var createError = __webpack_require__(3034); -var enhanceError = __webpack_require__(95261); - -var isHttps = /https:?/; - -/*eslint consistent-return:0*/ -module.exports = function httpAdapter(config) { - return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) { - var resolve = function resolve(value) { - resolvePromise(value); - }; - var reject = function reject(value) { - rejectPromise(value); - }; - var data = config.data; - var headers = config.headers; - - // Set User-Agent (required by some servers) - // Only set header if it hasn't been set in config - // See https://github.com/axios/axios/issues/69 - if (!headers['User-Agent'] && !headers['user-agent']) { - headers['User-Agent'] = 'axios/' + pkg.version; - } - - if (data && !utils.isStream(data)) { - if (Buffer.isBuffer(data)) { - // Nothing to do... - } else if (utils.isArrayBuffer(data)) { - data = Buffer.from(new Uint8Array(data)); - } else if (utils.isString(data)) { - data = Buffer.from(data, 'utf-8'); - } else { - return reject(createError( - 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', - config - )); - } - - // Add Content-Length header if data exists - headers['Content-Length'] = data.length; - } - - // HTTP basic authentication - var auth = undefined; - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - auth = username + ':' + password; - } - - // Parse url - var fullPath = buildFullPath(config.baseURL, config.url); - var parsed = url.parse(fullPath); - var protocol = parsed.protocol || 'http:'; - - if (!auth && parsed.auth) { - var urlAuth = parsed.auth.split(':'); - var urlUsername = urlAuth[0] || ''; - var urlPassword = urlAuth[1] || ''; - auth = urlUsername + ':' + urlPassword; - } - - if (auth) { - delete headers.Authorization; - } - - var isHttpsRequest = isHttps.test(protocol); - var agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; - - var options = { - path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''), - method: config.method.toUpperCase(), - headers: headers, - agent: agent, - agents: { http: config.httpAgent, https: config.httpsAgent }, - auth: auth - }; - - if (config.socketPath) { - options.socketPath = config.socketPath; - } else { - options.hostname = parsed.hostname; - options.port = parsed.port; - } - - var proxy = config.proxy; - if (!proxy && proxy !== false) { - var proxyEnv = protocol.slice(0, -1) + '_proxy'; - var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()]; - if (proxyUrl) { - var parsedProxyUrl = url.parse(proxyUrl); - var noProxyEnv = process.env.no_proxy || process.env.NO_PROXY; - var shouldProxy = true; - - if (noProxyEnv) { - var noProxy = noProxyEnv.split(',').map(function trim(s) { - return s.trim(); - }); - - shouldProxy = !noProxy.some(function proxyMatch(proxyElement) { - if (!proxyElement) { - return false; - } - if (proxyElement === '*') { - return true; - } - if (proxyElement[0] === '.' && - parsed.hostname.substr(parsed.hostname.length - proxyElement.length) === proxyElement) { - return true; - } - - return parsed.hostname === proxyElement; - }); - } - - - if (shouldProxy) { - proxy = { - host: parsedProxyUrl.hostname, - port: parsedProxyUrl.port - }; - - if (parsedProxyUrl.auth) { - var proxyUrlAuth = parsedProxyUrl.auth.split(':'); - proxy.auth = { - username: proxyUrlAuth[0], - password: proxyUrlAuth[1] - }; - } - } - } - } - - if (proxy) { - options.hostname = proxy.host; - options.host = proxy.host; - options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : ''); - options.port = proxy.port; - options.path = protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path; - - // Basic proxy authorization - if (proxy.auth) { - var base64 = Buffer.from(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64'); - options.headers['Proxy-Authorization'] = 'Basic ' + base64; - } - } - - var transport; - var isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol) : true); - if (config.transport) { - transport = config.transport; - } else if (config.maxRedirects === 0) { - transport = isHttpsProxy ? https : http; - } else { - if (config.maxRedirects) { - options.maxRedirects = config.maxRedirects; - } - transport = isHttpsProxy ? httpsFollow : httpFollow; - } - - if (config.maxBodyLength > -1) { - options.maxBodyLength = config.maxBodyLength; - } - - // Create the request - var req = transport.request(options, function handleResponse(res) { - if (req.aborted) return; - - // uncompress the response body transparently if required - var stream = res; - - // return the last request in case of redirects - var lastRequest = res.req || req; - - - // if no content, is HEAD request or decompress disabled we should not decompress - if (res.statusCode !== 204 && lastRequest.method !== 'HEAD' && config.decompress !== false) { - switch (res.headers['content-encoding']) { - /*eslint default-case:0*/ - case 'gzip': - case 'compress': - case 'deflate': - // add the unzipper to the body stream processing pipeline - stream = stream.pipe(zlib.createUnzip()); - - // remove the content-encoding in order to not confuse downstream operations - delete res.headers['content-encoding']; - break; - } - } - - var response = { - status: res.statusCode, - statusText: res.statusMessage, - headers: res.headers, - config: config, - request: lastRequest - }; - - if (config.responseType === 'stream') { - response.data = stream; - settle(resolve, reject, response); - } else { - var responseBuffer = []; - stream.on('data', function handleStreamData(chunk) { - responseBuffer.push(chunk); - - // make sure the content length is not over the maxContentLength if specified - if (config.maxContentLength > -1 && Buffer.concat(responseBuffer).length > config.maxContentLength) { - stream.destroy(); - reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded', - config, null, lastRequest)); - } - }); - - stream.on('error', function handleStreamError(err) { - if (req.aborted) return; - reject(enhanceError(err, config, null, lastRequest)); - }); - - stream.on('end', function handleStreamEnd() { - var responseData = Buffer.concat(responseBuffer); - if (config.responseType !== 'arraybuffer') { - responseData = responseData.toString(config.responseEncoding); - if (!config.responseEncoding || config.responseEncoding === 'utf8') { - responseData = utils.stripBOM(responseData); - } - } - - response.data = responseData; - settle(resolve, reject, response); - }); - } - }); - - // Handle errors - req.on('error', function handleRequestError(err) { - if (req.aborted && err.code !== 'ERR_FR_TOO_MANY_REDIRECTS') return; - reject(enhanceError(err, config, null, req)); - }); - - // Handle request timeout - if (config.timeout) { - // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. - // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. - // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. - // And then these socket which be hang up will devoring CPU little by little. - // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. - req.setTimeout(config.timeout, function handleRequestTimeout() { - req.abort(); - reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', req)); - }); - } - - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (req.aborted) return; - - req.abort(); - reject(cancel); - }); - } - - // Send the request - if (utils.isStream(data)) { - data.on('error', function handleStreamError(err) { - reject(enhanceError(err, config, null, req)); - }).pipe(req); - } else { - req.end(data); - } - }); -}; - - -/***/ }), - -/***/ 63500: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); -var settle = __webpack_require__(29801); -var cookies = __webpack_require__(47536); -var buildURL = __webpack_require__(87481); -var buildFullPath = __webpack_require__(92074); -var parseHeaders = __webpack_require__(77912); -var isURLSameOrigin = __webpack_require__(11682); -var createError = __webpack_require__(3034); - -module.exports = function xhrAdapter(config) { - return new Promise(function dispatchXhrRequest(resolve, reject) { - var requestData = config.data; - var requestHeaders = config.headers; - - if (utils.isFormData(requestData)) { - delete requestHeaders['Content-Type']; // Let the browser set it - } - - if ( - (utils.isBlob(requestData) || utils.isFile(requestData)) && - requestData.type - ) { - delete requestHeaders['Content-Type']; // Let the browser set it - } - - var request = new XMLHttpRequest(); - - // HTTP basic authentication - if (config.auth) { - var username = config.auth.username || ''; - var password = unescape(encodeURIComponent(config.auth.password)) || ''; - requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); - } - - var fullPath = buildFullPath(config.baseURL, config.url); - request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); - - // Set the request timeout in MS - request.timeout = config.timeout; - - // Listen for ready state - request.onreadystatechange = function handleLoad() { - if (!request || request.readyState !== 4) { - return; - } - - // The request errored out and we didn't get a response, this will be - // handled by onerror instead - // With one exception: request that using file: protocol, most browsers - // will return status as 0 even though it's a successful request - if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { - return; - } - - // Prepare the response - var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; - var response = { - data: responseData, - status: request.status, - statusText: request.statusText, - headers: responseHeaders, - config: config, - request: request - }; - - settle(resolve, reject, response); - - // Clean up request - request = null; - }; - - // Handle browser request cancellation (as opposed to a manual cancellation) - request.onabort = function handleAbort() { - if (!request) { - return; - } - - reject(createError('Request aborted', config, 'ECONNABORTED', request)); - - // Clean up request - request = null; - }; - - // Handle low level network errors - request.onerror = function handleError() { - // Real errors are hidden from us by the browser - // onerror should only fire if it's a network error - reject(createError('Network Error', config, null, request)); - - // Clean up request - request = null; - }; - - // Handle timeout - request.ontimeout = function handleTimeout() { - var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; - if (config.timeoutErrorMessage) { - timeoutErrorMessage = config.timeoutErrorMessage; - } - reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', - request)); - - // Clean up request - request = null; - }; - - // Add xsrf header - // This is only done if running in a standard browser environment. - // Specifically not if we're in a web worker, or react-native. - if (utils.isStandardBrowserEnv()) { - // Add xsrf header - var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? - cookies.read(config.xsrfCookieName) : - undefined; - - if (xsrfValue) { - requestHeaders[config.xsrfHeaderName] = xsrfValue; - } - } - - // Add headers to the request - if ('setRequestHeader' in request) { - utils.forEach(requestHeaders, function setRequestHeader(val, key) { - if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { - // Remove Content-Type if data is undefined - delete requestHeaders[key]; - } else { - // Otherwise add header to the request - request.setRequestHeader(key, val); - } - }); - } - - // Add withCredentials to request if needed - if (!utils.isUndefined(config.withCredentials)) { - request.withCredentials = !!config.withCredentials; - } - - // Add responseType to request if needed - if (config.responseType) { - try { - request.responseType = config.responseType; - } catch (e) { - // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. - // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. - if (config.responseType !== 'json') { - throw e; - } - } - } - - // Handle progress if needed - if (typeof config.onDownloadProgress === 'function') { - request.addEventListener('progress', config.onDownloadProgress); - } - - // Not all browsers support upload events - if (typeof config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', config.onUploadProgress); - } - - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (!request) { - return; - } - - request.abort(); - reject(cancel); - // Clean up request - request = null; - }); - } - - if (!requestData) { - requestData = null; - } - - // Send the request - request.send(requestData); - }); -}; - - -/***/ }), - -/***/ 64579: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); -var bind = __webpack_require__(69339); -var Axios = __webpack_require__(10353); -var mergeConfig = __webpack_require__(59807); -var defaults = __webpack_require__(6769); - -/** - * Create an instance of Axios - * - * @param {Object} defaultConfig The default config for the instance - * @return {Axios} A new instance of Axios - */ -function createInstance(defaultConfig) { - var context = new Axios(defaultConfig); - var instance = bind(Axios.prototype.request, context); - - // Copy axios.prototype to instance - utils.extend(instance, Axios.prototype, context); - - // Copy context to instance - utils.extend(instance, context); - - return instance; -} - -// Create the default instance to be exported -var axios = createInstance(defaults); - -// Expose Axios class to allow class inheritance -axios.Axios = Axios; - -// Factory for creating new instances -axios.create = function create(instanceConfig) { - return createInstance(mergeConfig(axios.defaults, instanceConfig)); -}; - -// Expose Cancel & CancelToken -axios.Cancel = __webpack_require__(56305); -axios.CancelToken = __webpack_require__(99576); -axios.isCancel = __webpack_require__(57822); - -// Expose all/spread -axios.all = function all(promises) { - return Promise.all(promises); -}; -axios.spread = __webpack_require__(83202); - -module.exports = axios; - -// Allow use of default import syntax in TypeScript -module.exports.default = axios; - - -/***/ }), - -/***/ 56305: -/***/ ((module) => { - -"use strict"; - - -/** - * A `Cancel` is an object that is thrown when an operation is canceled. - * - * @class - * @param {string=} message The message. - */ -function Cancel(message) { - this.message = message; -} - -Cancel.prototype.toString = function toString() { - return 'Cancel' + (this.message ? ': ' + this.message : ''); -}; - -Cancel.prototype.__CANCEL__ = true; - -module.exports = Cancel; - - -/***/ }), - -/***/ 99576: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var Cancel = __webpack_require__(56305); - -/** - * A `CancelToken` is an object that can be used to request cancellation of an operation. - * - * @class - * @param {Function} executor The executor function. - */ -function CancelToken(executor) { - if (typeof executor !== 'function') { - throw new TypeError('executor must be a function.'); - } - - var resolvePromise; - this.promise = new Promise(function promiseExecutor(resolve) { - resolvePromise = resolve; - }); - - var token = this; - executor(function cancel(message) { - if (token.reason) { - // Cancellation has already been requested - return; - } - - token.reason = new Cancel(message); - resolvePromise(token.reason); - }); -} - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -CancelToken.prototype.throwIfRequested = function throwIfRequested() { - if (this.reason) { - throw this.reason; - } -}; - -/** - * Returns an object that contains a new `CancelToken` and a function that, when called, - * cancels the `CancelToken`. - */ -CancelToken.source = function source() { - var cancel; - var token = new CancelToken(function executor(c) { - cancel = c; - }); - return { - token: token, - cancel: cancel - }; -}; - -module.exports = CancelToken; - - -/***/ }), - -/***/ 57822: -/***/ ((module) => { - -"use strict"; - - -module.exports = function isCancel(value) { - return !!(value && value.__CANCEL__); -}; - - -/***/ }), - -/***/ 10353: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); -var buildURL = __webpack_require__(87481); -var InterceptorManager = __webpack_require__(88030); -var dispatchRequest = __webpack_require__(18944); -var mergeConfig = __webpack_require__(59807); - -/** - * Create a new instance of Axios - * - * @param {Object} instanceConfig The default config for the instance - */ -function Axios(instanceConfig) { - this.defaults = instanceConfig; - this.interceptors = { - request: new InterceptorManager(), - response: new InterceptorManager() - }; -} - -/** - * Dispatch a request - * - * @param {Object} config The config specific for this request (merged with this.defaults) - */ -Axios.prototype.request = function request(config) { - /*eslint no-param-reassign:0*/ - // Allow for axios('example/url'[, config]) a la fetch API - if (typeof config === 'string') { - config = arguments[1] || {}; - config.url = arguments[0]; - } else { - config = config || {}; - } - - config = mergeConfig(this.defaults, config); - - // Set config.method - if (config.method) { - config.method = config.method.toLowerCase(); - } else if (this.defaults.method) { - config.method = this.defaults.method.toLowerCase(); - } else { - config.method = 'get'; - } - - // Hook up interceptors middleware - var chain = [dispatchRequest, undefined]; - var promise = Promise.resolve(config); - - this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { - chain.unshift(interceptor.fulfilled, interceptor.rejected); - }); - - this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { - chain.push(interceptor.fulfilled, interceptor.rejected); - }); - - while (chain.length) { - promise = promise.then(chain.shift(), chain.shift()); - } - - return promise; -}; - -Axios.prototype.getUri = function getUri(config) { - config = mergeConfig(this.defaults, config); - return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); -}; - -// Provide aliases for supported request methods -utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, config) { - return this.request(mergeConfig(config || {}, { - method: method, - url: url - })); - }; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, data, config) { - return this.request(mergeConfig(config || {}, { - method: method, - url: url, - data: data - })); - }; -}); - -module.exports = Axios; - - -/***/ }), - -/***/ 88030: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); - -function InterceptorManager() { - this.handlers = []; -} - -/** - * Add a new interceptor to the stack - * - * @param {Function} fulfilled The function to handle `then` for a `Promise` - * @param {Function} rejected The function to handle `reject` for a `Promise` - * - * @return {Number} An ID used to remove interceptor later - */ -InterceptorManager.prototype.use = function use(fulfilled, rejected) { - this.handlers.push({ - fulfilled: fulfilled, - rejected: rejected - }); - return this.handlers.length - 1; -}; - -/** - * Remove an interceptor from the stack - * - * @param {Number} id The ID that was returned by `use` - */ -InterceptorManager.prototype.eject = function eject(id) { - if (this.handlers[id]) { - this.handlers[id] = null; - } -}; - -/** - * Iterate over all the registered interceptors - * - * This method is particularly useful for skipping over any - * interceptors that may have become `null` calling `eject`. - * - * @param {Function} fn The function to call for each interceptor - */ -InterceptorManager.prototype.forEach = function forEach(fn) { - utils.forEach(this.handlers, function forEachHandler(h) { - if (h !== null) { - fn(h); - } - }); -}; - -module.exports = InterceptorManager; - - -/***/ }), - -/***/ 92074: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAbsoluteURL = __webpack_require__(55470); -var combineURLs = __webpack_require__(65824); - -/** - * Creates a new URL by combining the baseURL with the requestedURL, - * only when the requestedURL is not already an absolute URL. - * If the requestURL is absolute, this function returns the requestedURL untouched. - * - * @param {string} baseURL The base URL - * @param {string} requestedURL Absolute or relative URL to combine - * @returns {string} The combined full path - */ -module.exports = function buildFullPath(baseURL, requestedURL) { - if (baseURL && !isAbsoluteURL(requestedURL)) { - return combineURLs(baseURL, requestedURL); - } - return requestedURL; -}; - - -/***/ }), - -/***/ 3034: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var enhanceError = __webpack_require__(95261); - -/** - * Create an Error with the specified message, config, error code, request and response. - * - * @param {string} message The error message. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The created error. - */ -module.exports = function createError(message, config, code, request, response) { - var error = new Error(message); - return enhanceError(error, config, code, request, response); -}; - - -/***/ }), - -/***/ 18944: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); -var transformData = __webpack_require__(62479); -var isCancel = __webpack_require__(57822); -var defaults = __webpack_require__(6769); - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -function throwIfCancellationRequested(config) { - if (config.cancelToken) { - config.cancelToken.throwIfRequested(); - } -} - -/** - * Dispatch a request to the server using the configured adapter. - * - * @param {object} config The config that is to be used for the request - * @returns {Promise} The Promise to be fulfilled - */ -module.exports = function dispatchRequest(config) { - throwIfCancellationRequested(config); - - // Ensure headers exist - config.headers = config.headers || {}; - - // Transform request data - config.data = transformData( - config.data, - config.headers, - config.transformRequest - ); - - // Flatten headers - config.headers = utils.merge( - config.headers.common || {}, - config.headers[config.method] || {}, - config.headers - ); - - utils.forEach( - ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], - function cleanHeaderConfig(method) { - delete config.headers[method]; - } - ); - - var adapter = config.adapter || defaults.adapter; - - return adapter(config).then(function onAdapterResolution(response) { - throwIfCancellationRequested(config); - - // Transform response data - response.data = transformData( - response.data, - response.headers, - config.transformResponse - ); - - return response; - }, function onAdapterRejection(reason) { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); - - // Transform response data - if (reason && reason.response) { - reason.response.data = transformData( - reason.response.data, - reason.response.headers, - config.transformResponse - ); - } - } - - return Promise.reject(reason); - }); -}; - - -/***/ }), - -/***/ 95261: -/***/ ((module) => { - -"use strict"; - - -/** - * Update an Error with the specified config, error code, and response. - * - * @param {Error} error The error to update. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The error. - */ -module.exports = function enhanceError(error, config, code, request, response) { - error.config = config; - if (code) { - error.code = code; - } - - error.request = request; - error.response = response; - error.isAxiosError = true; - - error.toJSON = function toJSON() { - return { - // Standard - message: this.message, - name: this.name, - // Microsoft - description: this.description, - number: this.number, - // Mozilla - fileName: this.fileName, - lineNumber: this.lineNumber, - columnNumber: this.columnNumber, - stack: this.stack, - // Axios - config: this.config, - code: this.code - }; - }; - return error; -}; - - -/***/ }), - -/***/ 59807: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); - -/** - * Config-specific merge-function which creates a new config-object - * by merging two configuration objects together. - * - * @param {Object} config1 - * @param {Object} config2 - * @returns {Object} New object resulting from merging config2 to config1 - */ -module.exports = function mergeConfig(config1, config2) { - // eslint-disable-next-line no-param-reassign - config2 = config2 || {}; - var config = {}; - - var valueFromConfig2Keys = ['url', 'method', 'data']; - var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params']; - var defaultToConfig2Keys = [ - 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer', - 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', - 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress', - 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent', - 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding' - ]; - var directMergeKeys = ['validateStatus']; - - function getMergedValue(target, source) { - if (utils.isPlainObject(target) && utils.isPlainObject(source)) { - return utils.merge(target, source); - } else if (utils.isPlainObject(source)) { - return utils.merge({}, source); - } else if (utils.isArray(source)) { - return source.slice(); - } - return source; - } - - function mergeDeepProperties(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(config1[prop], config2[prop]); - } else if (!utils.isUndefined(config1[prop])) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - } - - utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(undefined, config2[prop]); - } - }); - - utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties); - - utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(undefined, config2[prop]); - } else if (!utils.isUndefined(config1[prop])) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - }); - - utils.forEach(directMergeKeys, function merge(prop) { - if (prop in config2) { - config[prop] = getMergedValue(config1[prop], config2[prop]); - } else if (prop in config1) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - }); - - var axiosKeys = valueFromConfig2Keys - .concat(mergeDeepPropertiesKeys) - .concat(defaultToConfig2Keys) - .concat(directMergeKeys); - - var otherKeys = Object - .keys(config1) - .concat(Object.keys(config2)) - .filter(function filterAxiosKeys(key) { - return axiosKeys.indexOf(key) === -1; - }); - - utils.forEach(otherKeys, mergeDeepProperties); - - return config; -}; - - -/***/ }), - -/***/ 29801: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var createError = __webpack_require__(3034); - -/** - * Resolve or reject a Promise based on response status. - * - * @param {Function} resolve A function that resolves the promise. - * @param {Function} reject A function that rejects the promise. - * @param {object} response The response. - */ -module.exports = function settle(resolve, reject, response) { - var validateStatus = response.config.validateStatus; - if (!response.status || !validateStatus || validateStatus(response.status)) { - resolve(response); - } else { - reject(createError( - 'Request failed with status code ' + response.status, - response.config, - null, - response.request, - response - )); - } -}; - - -/***/ }), - -/***/ 62479: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); - -/** - * Transform the data for a request or a response - * - * @param {Object|String} data The data to be transformed - * @param {Array} headers The headers for the request or response - * @param {Array|Function} fns A single function or Array of functions - * @returns {*} The resulting transformed data - */ -module.exports = function transformData(data, headers, fns) { - /*eslint no-param-reassign:0*/ - utils.forEach(fns, function transform(fn) { - data = fn(data, headers); - }); - - return data; -}; - - -/***/ }), - -/***/ 6769: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); -var normalizeHeaderName = __webpack_require__(53293); - -var DEFAULT_CONTENT_TYPE = { - 'Content-Type': 'application/x-www-form-urlencoded' -}; - -function setContentTypeIfUnset(headers, value) { - if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { - headers['Content-Type'] = value; - } -} - -function getDefaultAdapter() { - var adapter; - if (typeof XMLHttpRequest !== 'undefined') { - // For browsers use XHR adapter - adapter = __webpack_require__(63500); - } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { - // For node use HTTP adapter - adapter = __webpack_require__(38007); - } - return adapter; -} - -var defaults = { - adapter: getDefaultAdapter(), - - transformRequest: [function transformRequest(data, headers) { - normalizeHeaderName(headers, 'Accept'); - normalizeHeaderName(headers, 'Content-Type'); - if (utils.isFormData(data) || - utils.isArrayBuffer(data) || - utils.isBuffer(data) || - utils.isStream(data) || - utils.isFile(data) || - utils.isBlob(data) - ) { - return data; - } - if (utils.isArrayBufferView(data)) { - return data.buffer; - } - if (utils.isURLSearchParams(data)) { - setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); - return data.toString(); - } - if (utils.isObject(data)) { - setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); - return JSON.stringify(data); - } - return data; - }], - - transformResponse: [function transformResponse(data) { - /*eslint no-param-reassign:0*/ - if (typeof data === 'string') { - try { - data = JSON.parse(data); - } catch (e) { /* Ignore */ } - } - return data; - }], - - /** - * A timeout in milliseconds to abort a request. If set to 0 (default) a - * timeout is not created. - */ - timeout: 0, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - maxContentLength: -1, - maxBodyLength: -1, - - validateStatus: function validateStatus(status) { - return status >= 200 && status < 300; - } -}; - -defaults.headers = { - common: { - 'Accept': 'application/json, text/plain, */*' - } -}; - -utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { - defaults.headers[method] = {}; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); -}); - -module.exports = defaults; - - -/***/ }), - -/***/ 69339: -/***/ ((module) => { - -"use strict"; - - -module.exports = function bind(fn, thisArg) { - return function wrap() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - return fn.apply(thisArg, args); - }; -}; - - -/***/ }), - -/***/ 87481: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); - -function encode(val) { - return encodeURIComponent(val). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, '+'). - replace(/%5B/gi, '['). - replace(/%5D/gi, ']'); -} - -/** - * Build a URL by appending params to the end - * - * @param {string} url The base of the url (e.g., http://www.google.com) - * @param {object} [params] The params to be appended - * @returns {string} The formatted url - */ -module.exports = function buildURL(url, params, paramsSerializer) { - /*eslint no-param-reassign:0*/ - if (!params) { - return url; - } - - var serializedParams; - if (paramsSerializer) { - serializedParams = paramsSerializer(params); - } else if (utils.isURLSearchParams(params)) { - serializedParams = params.toString(); - } else { - var parts = []; - - utils.forEach(params, function serialize(val, key) { - if (val === null || typeof val === 'undefined') { - return; - } - - if (utils.isArray(val)) { - key = key + '[]'; - } else { - val = [val]; - } - - utils.forEach(val, function parseValue(v) { - if (utils.isDate(v)) { - v = v.toISOString(); - } else if (utils.isObject(v)) { - v = JSON.stringify(v); - } - parts.push(encode(key) + '=' + encode(v)); - }); - }); - - serializedParams = parts.join('&'); - } - - if (serializedParams) { - var hashmarkIndex = url.indexOf('#'); - if (hashmarkIndex !== -1) { - url = url.slice(0, hashmarkIndex); - } - - url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; - } - - return url; -}; - - -/***/ }), - -/***/ 65824: -/***/ ((module) => { - -"use strict"; - - -/** - * Creates a new URL by combining the specified URLs - * - * @param {string} baseURL The base URL - * @param {string} relativeURL The relative URL - * @returns {string} The combined URL - */ -module.exports = function combineURLs(baseURL, relativeURL) { - return relativeURL - ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; -}; - - -/***/ }), - -/***/ 47536: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); - -module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs support document.cookie - (function standardBrowserEnv() { - return { - write: function write(name, value, expires, path, domain, secure) { - var cookie = []; - cookie.push(name + '=' + encodeURIComponent(value)); - - if (utils.isNumber(expires)) { - cookie.push('expires=' + new Date(expires).toGMTString()); - } - - if (utils.isString(path)) { - cookie.push('path=' + path); - } - - if (utils.isString(domain)) { - cookie.push('domain=' + domain); - } - - if (secure === true) { - cookie.push('secure'); - } - - document.cookie = cookie.join('; '); - }, - - read: function read(name) { - var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); - return (match ? decodeURIComponent(match[3]) : null); - }, - - remove: function remove(name) { - this.write(name, '', Date.now() - 86400000); - } - }; - })() : - - // Non standard browser env (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return { - write: function write() {}, - read: function read() { return null; }, - remove: function remove() {} - }; - })() -); - - -/***/ }), - -/***/ 55470: -/***/ ((module) => { - -"use strict"; - - -/** - * Determines whether the specified URL is absolute - * - * @param {string} url The URL to test - * @returns {boolean} True if the specified URL is absolute, otherwise false - */ -module.exports = function isAbsoluteURL(url) { - // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). - // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed - // by any combination of letters, digits, plus, period, or hyphen. - return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); -}; - - -/***/ }), - -/***/ 11682: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); - -module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs have full support of the APIs needed to test - // whether the request URL is of the same origin as current location. - (function standardBrowserEnv() { - var msie = /(msie|trident)/i.test(navigator.userAgent); - var urlParsingNode = document.createElement('a'); - var originURL; - - /** - * Parse a URL to discover it's components - * - * @param {String} url The URL to be parsed - * @returns {Object} - */ - function resolveURL(url) { - var href = url; - - if (msie) { - // IE needs attribute set twice to normalize properties - urlParsingNode.setAttribute('href', href); - href = urlParsingNode.href; - } - - urlParsingNode.setAttribute('href', href); - - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') ? - urlParsingNode.pathname : - '/' + urlParsingNode.pathname - }; - } - - originURL = resolveURL(window.location.href); - - /** - * Determine if a URL shares the same origin as the current location - * - * @param {String} requestURL The URL to test - * @returns {boolean} True if URL shares the same origin, otherwise false - */ - return function isURLSameOrigin(requestURL) { - var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; - return (parsed.protocol === originURL.protocol && - parsed.host === originURL.host); - }; - })() : - - // Non standard browser envs (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return function isURLSameOrigin() { - return true; - }; - })() -); - - -/***/ }), - -/***/ 53293: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); - -module.exports = function normalizeHeaderName(headers, normalizedName) { - utils.forEach(headers, function processHeader(value, name) { - if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { - headers[normalizedName] = value; - delete headers[name]; - } - }); -}; - - -/***/ }), - -/***/ 77912: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(19520); - -// Headers whose duplicates are ignored by node -// c.f. https://nodejs.org/api/http.html#http_message_headers -var ignoreDuplicateOf = [ - 'age', 'authorization', 'content-length', 'content-type', 'etag', - 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', - 'last-modified', 'location', 'max-forwards', 'proxy-authorization', - 'referer', 'retry-after', 'user-agent' -]; - -/** - * Parse headers into an object - * - * ``` - * Date: Wed, 27 Aug 2014 08:58:49 GMT - * Content-Type: application/json - * Connection: keep-alive - * Transfer-Encoding: chunked - * ``` - * - * @param {String} headers Headers needing to be parsed - * @returns {Object} Headers parsed into an object - */ -module.exports = function parseHeaders(headers) { - var parsed = {}; - var key; - var val; - var i; - - if (!headers) { return parsed; } - - utils.forEach(headers.split('\n'), function parser(line) { - i = line.indexOf(':'); - key = utils.trim(line.substr(0, i)).toLowerCase(); - val = utils.trim(line.substr(i + 1)); - - if (key) { - if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { - return; - } - if (key === 'set-cookie') { - parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); - } else { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - }); - - return parsed; -}; - - -/***/ }), - -/***/ 83202: -/***/ ((module) => { - -"use strict"; - - -/** - * Syntactic sugar for invoking a function and expanding an array for arguments. - * - * Common use case would be to use `Function.prototype.apply`. - * - * ```js - * function f(x, y, z) {} - * var args = [1, 2, 3]; - * f.apply(null, args); - * ``` - * - * With `spread` this example can be re-written. - * - * ```js - * spread(function(x, y, z) {})([1, 2, 3]); - * ``` - * - * @param {Function} callback - * @returns {Function} - */ -module.exports = function spread(callback) { - return function wrap(arr) { - return callback.apply(null, arr); - }; -}; - - -/***/ }), - -/***/ 19520: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var bind = __webpack_require__(69339); - -/*global toString:true*/ - -// utils is a library of generic helper functions non-specific to axios - -var toString = Object.prototype.toString; - -/** - * Determine if a value is an Array - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Array, otherwise false - */ -function isArray(val) { - return toString.call(val) === '[object Array]'; -} - -/** - * Determine if a value is undefined - * - * @param {Object} val The value to test - * @returns {boolean} True if the value is undefined, otherwise false - */ -function isUndefined(val) { - return typeof val === 'undefined'; -} - -/** - * Determine if a value is a Buffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Buffer, otherwise false - */ -function isBuffer(val) { - return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) - && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); -} - -/** - * Determine if a value is an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an ArrayBuffer, otherwise false - */ -function isArrayBuffer(val) { - return toString.call(val) === '[object ArrayBuffer]'; -} - -/** - * Determine if a value is a FormData - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an FormData, otherwise false - */ -function isFormData(val) { - return (typeof FormData !== 'undefined') && (val instanceof FormData); -} - -/** - * Determine if a value is a view on an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false - */ -function isArrayBufferView(val) { - var result; - if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { - result = ArrayBuffer.isView(val); - } else { - result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); - } - return result; -} - -/** - * Determine if a value is a String - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a String, otherwise false - */ -function isString(val) { - return typeof val === 'string'; -} - -/** - * Determine if a value is a Number - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Number, otherwise false - */ -function isNumber(val) { - return typeof val === 'number'; -} - -/** - * Determine if a value is an Object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Object, otherwise false - */ -function isObject(val) { - return val !== null && typeof val === 'object'; -} - -/** - * Determine if a value is a plain Object - * - * @param {Object} val The value to test - * @return {boolean} True if value is a plain Object, otherwise false - */ -function isPlainObject(val) { - if (toString.call(val) !== '[object Object]') { - return false; - } - - var prototype = Object.getPrototypeOf(val); - return prototype === null || prototype === Object.prototype; -} - -/** - * Determine if a value is a Date - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Date, otherwise false - */ -function isDate(val) { - return toString.call(val) === '[object Date]'; -} - -/** - * Determine if a value is a File - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a File, otherwise false - */ -function isFile(val) { - return toString.call(val) === '[object File]'; -} - -/** - * Determine if a value is a Blob - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Blob, otherwise false - */ -function isBlob(val) { - return toString.call(val) === '[object Blob]'; -} - -/** - * Determine if a value is a Function - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Function, otherwise false - */ -function isFunction(val) { - return toString.call(val) === '[object Function]'; -} - -/** - * Determine if a value is a Stream - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Stream, otherwise false - */ -function isStream(val) { - return isObject(val) && isFunction(val.pipe); -} - -/** - * Determine if a value is a URLSearchParams object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a URLSearchParams object, otherwise false - */ -function isURLSearchParams(val) { - return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; -} - -/** - * Trim excess whitespace off the beginning and end of a string - * - * @param {String} str The String to trim - * @returns {String} The String freed of excess whitespace - */ -function trim(str) { - return str.replace(/^\s*/, '').replace(/\s*$/, ''); -} - -/** - * Determine if we're running in a standard browser environment - * - * This allows axios to run in a web worker, and react-native. - * Both environments support XMLHttpRequest, but not fully standard globals. - * - * web workers: - * typeof window -> undefined - * typeof document -> undefined - * - * react-native: - * navigator.product -> 'ReactNative' - * nativescript - * navigator.product -> 'NativeScript' or 'NS' - */ -function isStandardBrowserEnv() { - if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || - navigator.product === 'NativeScript' || - navigator.product === 'NS')) { - return false; - } - return ( - typeof window !== 'undefined' && - typeof document !== 'undefined' - ); -} - -/** - * Iterate over an Array or an Object invoking a function for each item. - * - * If `obj` is an Array callback will be called passing - * the value, index, and complete array for each item. - * - * If 'obj' is an Object callback will be called passing - * the value, key, and complete object for each property. - * - * @param {Object|Array} obj The object to iterate - * @param {Function} fn The callback to invoke for each item - */ -function forEach(obj, fn) { - // Don't bother if no value provided - if (obj === null || typeof obj === 'undefined') { - return; - } - - // Force an array if not already something iterable - if (typeof obj !== 'object') { - /*eslint no-param-reassign:0*/ - obj = [obj]; - } - - if (isArray(obj)) { - // Iterate over array values - for (var i = 0, l = obj.length; i < l; i++) { - fn.call(null, obj[i], i, obj); - } - } else { - // Iterate over object keys - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - fn.call(null, obj[key], key, obj); - } - } - } -} - -/** - * Accepts varargs expecting each argument to be an object, then - * immutably merges the properties of each object and returns result. - * - * When multiple objects contain the same key the later object in - * the arguments list will take precedence. - * - * Example: - * - * ```js - * var result = merge({foo: 123}, {foo: 456}); - * console.log(result.foo); // outputs 456 - * ``` - * - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function merge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (isPlainObject(result[key]) && isPlainObject(val)) { - result[key] = merge(result[key], val); - } else if (isPlainObject(val)) { - result[key] = merge({}, val); - } else if (isArray(val)) { - result[key] = val.slice(); - } else { - result[key] = val; - } - } - - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} - -/** - * Extends object a by mutably adding to it the properties of object b. - * - * @param {Object} a The object to be extended - * @param {Object} b The object to copy properties from - * @param {Object} thisArg The object to bind function to - * @return {Object} The resulting value of object a - */ -function extend(a, b, thisArg) { - forEach(b, function assignValue(val, key) { - if (thisArg && typeof val === 'function') { - a[key] = bind(val, thisArg); - } else { - a[key] = val; - } - }); - return a; -} - -/** - * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) - * - * @param {string} content with BOM - * @return {string} content value without BOM - */ -function stripBOM(content) { - if (content.charCodeAt(0) === 0xFEFF) { - content = content.slice(1); - } - return content; -} - -module.exports = { - isArray: isArray, - isArrayBuffer: isArrayBuffer, - isBuffer: isBuffer, - isFormData: isFormData, - isArrayBufferView: isArrayBufferView, - isString: isString, - isNumber: isNumber, - isObject: isObject, - isPlainObject: isPlainObject, - isUndefined: isUndefined, - isDate: isDate, - isFile: isFile, - isBlob: isBlob, - isFunction: isFunction, - isStream: isStream, - isURLSearchParams: isURLSearchParams, - isStandardBrowserEnv: isStandardBrowserEnv, - forEach: forEach, - merge: merge, - extend: extend, - trim: trim, - stripBOM: stripBOM -}; - - -/***/ }), - -/***/ 46401: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var register = __webpack_require__(27798) -var addHook = __webpack_require__(82446) -var removeHook = __webpack_require__(16436) - -// bind with array of arguments: https://stackoverflow.com/a/21792913 -var bind = Function.bind -var bindable = bind.bind(bind) - -function bindApi (hook, state, name) { - var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) - hook.api = { remove: removeHookRef } - hook.remove = removeHookRef - - ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { - var args = name ? [state, kind, name] : [state, kind] - hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) - }) -} - -function HookSingular () { - var singularHookName = 'h' - var singularHookState = { - registry: {} - } - var singularHook = register.bind(null, singularHookState, singularHookName) - bindApi(singularHook, singularHookState, singularHookName) - return singularHook -} - -function HookCollection () { - var state = { - registry: {} - } - - var hook = register.bind(null, state) - bindApi(hook, state) - - return hook -} - -var collectionHookDeprecationMessageDisplayed = false -function Hook () { - if (!collectionHookDeprecationMessageDisplayed) { - console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') - collectionHookDeprecationMessageDisplayed = true - } - return HookCollection() -} - -Hook.Singular = HookSingular.bind() -Hook.Collection = HookCollection.bind() - -module.exports = Hook -// expose constructors as a named property for TypeScript -module.exports.Hook = Hook -module.exports.Singular = Hook.Singular -module.exports.Collection = Hook.Collection - - -/***/ }), - -/***/ 82446: -/***/ ((module) => { - -module.exports = addHook - -function addHook (state, kind, name, hook) { - var orig = hook - if (!state.registry[name]) { - state.registry[name] = [] - } - - if (kind === 'before') { - hook = function (method, options) { - return Promise.resolve() - .then(orig.bind(null, options)) - .then(method.bind(null, options)) - } - } - - if (kind === 'after') { - hook = function (method, options) { - var result - return Promise.resolve() - .then(method.bind(null, options)) - .then(function (result_) { - result = result_ - return orig(result, options) - }) - .then(function () { - return result - }) - } - } - - if (kind === 'error') { - hook = function (method, options) { - return Promise.resolve() - .then(method.bind(null, options)) - .catch(function (error) { - return orig(error, options) - }) - } - } - - state.registry[name].push({ - hook: hook, - orig: orig - }) -} - - -/***/ }), - -/***/ 27798: -/***/ ((module) => { - -module.exports = register - -function register (state, name, method, options) { - if (typeof method !== 'function') { - throw new Error('method for before hook must be a function') - } - - if (!options) { - options = {} - } - - if (Array.isArray(name)) { - return name.reverse().reduce(function (callback, name) { - return register.bind(null, state, name, callback, options) - }, method)() - } - - return Promise.resolve() - .then(function () { - if (!state.registry[name]) { - return method(options) - } - - return (state.registry[name]).reduce(function (method, registered) { - return registered.hook.bind(null, method, options) - }, method)() - }) -} - - -/***/ }), - -/***/ 16436: -/***/ ((module) => { - -module.exports = removeHook - -function removeHook (state, name, method) { - if (!state.registry[name]) { - return - } - - var index = state.registry[name] - .map(function (registered) { return registered.orig }) - .indexOf(method) - - if (index === -1) { - return - } - - state.registry[name].splice(index, 1) -} - - -/***/ }), - -/***/ 27510: -/***/ ((module) => { - -module.exports = { - trueFunc: function trueFunc(){ - return true; - }, - falseFunc: function falseFunc(){ - return false; - } -}; - -/***/ }), - -/***/ 89072: -/***/ ((module) => { - -"use strict"; - - -module.exports = adapterFactory; - -function adapterFactory(implementation){ - ensureImplementation(implementation); - - var adapter = {} - - var baseAdapter = { - removeSubsets: function (nodes){ - return removeSubsets(adapter, nodes); - }, - existsOne: function(test, elems){ - return existsOne(adapter, test, elems); - }, - getSiblings: function(elem){ - return getSiblings(adapter, elem); - }, - hasAttrib: function(elem, name){ - return hasAttrib(adapter, elem, name); - }, - findOne: function(test, arr){ - return findOne(adapter, test, arr); - }, - findAll: function(test, elems){ - return findAll(adapter, test, elems) - } - }; - - Object.assign(adapter, baseAdapter, implementation); - - return adapter; -} - -var expectImplemented = [ - "isTag", "getAttributeValue", "getChildren", "getName", "getParent", - "getText" -]; - -function ensureImplementation(implementation){ - if(!implementation) throw new TypeError("Expected implementation") - - var notImplemented = expectImplemented.filter(function(fname){ - return typeof implementation[fname] !== "function"; - }); - - if(notImplemented.length){ - var notList = "(" + notImplemented.join(", ") + ")"; - var message = "Expected functions " + notList + " to be implemented"; - throw new Error(message); - } -} - -function removeSubsets(adapter, nodes){ - var idx = nodes.length, node, ancestor, replace; - - // Check if each node (or one of its ancestors) is already contained in the - // array. - while(--idx > -1){ - node = ancestor = nodes[idx]; - - // Temporarily remove the node under consideration - nodes[idx] = null; - replace = true; - - while(ancestor){ - if(nodes.indexOf(ancestor) > -1){ - replace = false; - nodes.splice(idx, 1); - break; - } - ancestor = adapter.getParent(ancestor) - } - - // If the node has been found to be unique, re-insert it. - if(replace){ - nodes[idx] = node; - } - } - - return nodes; -} - -function existsOne(adapter, test, elems){ - return elems.some(function(elem){ - return adapter.isTag(elem) ? - test(elem) || adapter.existsOne(test, adapter.getChildren(elem)) : - false; - }); -} - -function getSiblings(adapter, elem){ - var parent = adapter.getParent(elem); - return parent && adapter.getChildren(parent); -} - - -function hasAttrib(adapter, elem, name){ - return adapter.getAttributeValue(elem,name) !== undefined -} - -function findOne(adapter, test, arr){ - var elem = null; - - for(var i = 0, l = arr.length; i < l && !elem; i++){ - if(test(arr[i])){ - elem = arr[i]; - } else { - var childs = adapter.getChildren(arr[i]); - if(childs && childs.length > 0){ - elem = adapter.findOne(test, childs); - } - } - } - - return elem; -} - -function findAll(adapter, test, elems){ - var result = []; - - for(var i = 0, j = elems.length; i < j; i++){ - if(!adapter.isTag(elems[i])) continue; - if(test(elems[i])) result.push(elems[i]); - var childs = adapter.getChildren(elems[i]); - if(childs) result = result.concat(adapter.findAll(test, childs)); - } - - return result; -} - - -/***/ }), - -/***/ 32825: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = CSSselect; - -var DomUtils = __webpack_require__(43370); -var falseFunc = __webpack_require__(27510).falseFunc; -var compileRaw = __webpack_require__(22365); - -function wrapCompile(func) { - return function addAdapter(selector, options, context) { - options = options || {}; - options.adapter = options.adapter || DomUtils; - - return func(selector, options, context); - }; -} - -var compile = wrapCompile(compileRaw); -var compileUnsafe = wrapCompile(compileRaw.compileUnsafe); - -function getSelectorFunc(searchFunc) { - return function select(query, elems, options) { - options = options || {}; - options.adapter = options.adapter || DomUtils; - - if (typeof query !== "function") { - query = compileUnsafe(query, options, elems); - } - if (query.shouldTestNextSiblings) { - elems = appendNextSiblings((options && options.context) || elems, options.adapter); - } - if (!Array.isArray(elems)) elems = options.adapter.getChildren(elems); - else elems = options.adapter.removeSubsets(elems); - return searchFunc(query, elems, options); - }; -} - -function getNextSiblings(elem, adapter) { - var siblings = adapter.getSiblings(elem); - if (!Array.isArray(siblings)) return []; - siblings = siblings.slice(0); - while (siblings.shift() !== elem); - return siblings; -} - -function appendNextSiblings(elems, adapter) { - // Order matters because jQuery seems to check the children before the siblings - if (!Array.isArray(elems)) elems = [elems]; - var newElems = elems.slice(0); - - for (var i = 0, len = elems.length; i < len; i++) { - var nextSiblings = getNextSiblings(newElems[i], adapter); - newElems.push.apply(newElems, nextSiblings); - } - return newElems; -} - -var selectAll = getSelectorFunc(function selectAll(query, elems, options) { - return query === falseFunc || !elems || elems.length === 0 ? [] : options.adapter.findAll(query, elems); -}); - -var selectOne = getSelectorFunc(function selectOne(query, elems, options) { - return query === falseFunc || !elems || elems.length === 0 ? null : options.adapter.findOne(query, elems); -}); - -function is(elem, query, options) { - options = options || {}; - options.adapter = options.adapter || DomUtils; - return (typeof query === "function" ? query : compile(query, options))(elem); -} - -/* - the exported interface -*/ -function CSSselect(query, elems, options) { - return selectAll(query, elems, options); -} - -CSSselect.compile = compile; -CSSselect.filters = compileRaw.Pseudos.filters; -CSSselect.pseudos = compileRaw.Pseudos.pseudos; - -CSSselect.selectAll = selectAll; -CSSselect.selectOne = selectOne; - -CSSselect.is = is; - -//legacy methods (might be removed) -CSSselect.parse = compile; -CSSselect.iterate = selectAll; - -//hooks -CSSselect._compileUnsafe = compileUnsafe; -CSSselect._compileToken = compileRaw.compileToken; - - -/***/ }), - -/***/ 91221: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var falseFunc = __webpack_require__(27510).falseFunc; - -//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469 -var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g; - -/* - attribute selectors -*/ -var attributeRules = { - __proto__: null, - equals: function(next, data, options) { - var name = data.name; - var value = data.value; - var adapter = options.adapter; - - if (data.ignoreCase) { - value = value.toLowerCase(); - - return function equalsIC(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && attr.toLowerCase() === value && next(elem); - }; - } - - return function equals(elem) { - return adapter.getAttributeValue(elem, name) === value && next(elem); - }; - }, - hyphen: function(next, data, options) { - var name = data.name; - var value = data.value; - var len = value.length; - var adapter = options.adapter; - - if (data.ignoreCase) { - value = value.toLowerCase(); - - return function hyphenIC(elem) { - var attr = adapter.getAttributeValue(elem, name); - return ( - attr != null && - (attr.length === len || attr.charAt(len) === "-") && - attr.substr(0, len).toLowerCase() === value && - next(elem) - ); - }; - } - - return function hyphen(elem) { - var attr = adapter.getAttributeValue(elem, name); - return ( - attr != null && - attr.substr(0, len) === value && - (attr.length === len || attr.charAt(len) === "-") && - next(elem) - ); - }; - }, - element: function(next, data, options) { - var name = data.name; - var value = data.value; - var adapter = options.adapter; - - if (/\s/.test(value)) { - return falseFunc; - } - - value = value.replace(reChars, "\\$&"); - - var pattern = "(?:^|\\s)" + value + "(?:$|\\s)", - flags = data.ignoreCase ? "i" : "", - regex = new RegExp(pattern, flags); - - return function element(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && regex.test(attr) && next(elem); - }; - }, - exists: function(next, data, options) { - var name = data.name; - var adapter = options.adapter; - - return function exists(elem) { - return adapter.hasAttrib(elem, name) && next(elem); - }; - }, - start: function(next, data, options) { - var name = data.name; - var value = data.value; - var len = value.length; - var adapter = options.adapter; - - if (len === 0) { - return falseFunc; - } - - if (data.ignoreCase) { - value = value.toLowerCase(); - - return function startIC(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && attr.substr(0, len).toLowerCase() === value && next(elem); - }; - } - - return function start(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && attr.substr(0, len) === value && next(elem); - }; - }, - end: function(next, data, options) { - var name = data.name; - var value = data.value; - var len = -value.length; - var adapter = options.adapter; - - if (len === 0) { - return falseFunc; - } - - if (data.ignoreCase) { - value = value.toLowerCase(); - - return function endIC(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && attr.substr(len).toLowerCase() === value && next(elem); - }; - } - - return function end(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && attr.substr(len) === value && next(elem); - }; - }, - any: function(next, data, options) { - var name = data.name; - var value = data.value; - var adapter = options.adapter; - - if (value === "") { - return falseFunc; - } - - if (data.ignoreCase) { - var regex = new RegExp(value.replace(reChars, "\\$&"), "i"); - - return function anyIC(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && regex.test(attr) && next(elem); - }; - } - - return function any(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && attr.indexOf(value) >= 0 && next(elem); - }; - }, - not: function(next, data, options) { - var name = data.name; - var value = data.value; - var adapter = options.adapter; - - if (value === "") { - return function notEmpty(elem) { - return !!adapter.getAttributeValue(elem, name) && next(elem); - }; - } else if (data.ignoreCase) { - value = value.toLowerCase(); - - return function notIC(elem) { - var attr = adapter.getAttributeValue(elem, name); - return attr != null && attr.toLowerCase() !== value && next(elem); - }; - } - - return function not(elem) { - return adapter.getAttributeValue(elem, name) !== value && next(elem); - }; - } -}; - -module.exports = { - compile: function(next, data, options) { - if (options && options.strict && (data.ignoreCase || data.action === "not")) { - throw new Error("Unsupported attribute selector"); - } - return attributeRules[data.action](next, data, options); - }, - rules: attributeRules -}; - - -/***/ }), - -/***/ 22365: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* - compiles a selector to an executable function -*/ - -module.exports = compile; - -var parse = __webpack_require__(17525).parse; -var BaseFuncs = __webpack_require__(27510); -var sortRules = __webpack_require__(65426); -var procedure = __webpack_require__(86721); -var Rules = __webpack_require__(35890); -var Pseudos = __webpack_require__(65582); -var trueFunc = BaseFuncs.trueFunc; -var falseFunc = BaseFuncs.falseFunc; - -var filters = Pseudos.filters; - -function compile(selector, options, context) { - var next = compileUnsafe(selector, options, context); - return wrap(next, options); -} - -function wrap(next, options) { - var adapter = options.adapter; - - return function base(elem) { - return adapter.isTag(elem) && next(elem); - }; -} - -function compileUnsafe(selector, options, context) { - var token = parse(selector, options); - return compileToken(token, options, context); -} - -function includesScopePseudo(t) { - return ( - t.type === "pseudo" && - (t.name === "scope" || - (Array.isArray(t.data) && - t.data.some(function(data) { - return data.some(includesScopePseudo); - }))) - ); -} - -var DESCENDANT_TOKEN = { type: "descendant" }; -var FLEXIBLE_DESCENDANT_TOKEN = { type: "_flexibleDescendant" }; -var SCOPE_TOKEN = { type: "pseudo", name: "scope" }; -var PLACEHOLDER_ELEMENT = {}; - -//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector -//http://www.w3.org/TR/selectors4/#absolutizing -function absolutize(token, options, context) { - var adapter = options.adapter; - - //TODO better check if context is document - var hasContext = - !!context && - !!context.length && - context.every(function(e) { - return e === PLACEHOLDER_ELEMENT || !!adapter.getParent(e); - }); - - token.forEach(function(t) { - if (t.length > 0 && isTraversal(t[0]) && t[0].type !== "descendant") { - //don't return in else branch - } else if (hasContext && !(Array.isArray(t) ? t.some(includesScopePseudo) : includesScopePseudo(t))) { - t.unshift(DESCENDANT_TOKEN); - } else { - return; - } - - t.unshift(SCOPE_TOKEN); - }); -} - -function compileToken(token, options, context) { - token = token.filter(function(t) { - return t.length > 0; - }); - - token.forEach(sortRules); - - var isArrayContext = Array.isArray(context); - - context = (options && options.context) || context; - - if (context && !isArrayContext) context = [context]; - - absolutize(token, options, context); - - var shouldTestNextSiblings = false; - - var query = token - .map(function(rules) { - if (rules[0] && rules[1] && rules[0].name === "scope") { - var ruleType = rules[1].type; - if (isArrayContext && ruleType === "descendant") { - rules[1] = FLEXIBLE_DESCENDANT_TOKEN; - } else if (ruleType === "adjacent" || ruleType === "sibling") { - shouldTestNextSiblings = true; - } - } - return compileRules(rules, options, context); - }) - .reduce(reduceRules, falseFunc); - - query.shouldTestNextSiblings = shouldTestNextSiblings; - - return query; -} - -function isTraversal(t) { - return procedure[t.type] < 0; -} - -function compileRules(rules, options, context) { - return rules.reduce(function(func, rule) { - if (func === falseFunc) return func; - - if (!(rule.type in Rules)) { - throw new Error("Rule type " + rule.type + " is not supported by css-select"); - } - - return Rules[rule.type](func, rule, options, context); - }, (options && options.rootFunc) || trueFunc); -} - -function reduceRules(a, b) { - if (b === falseFunc || a === trueFunc) { - return a; - } - if (a === falseFunc || b === trueFunc) { - return b; - } - - return function combine(elem) { - return a(elem) || b(elem); - }; -} - -function containsTraversal(t) { - return t.some(isTraversal); -} - -//:not, :has and :matches have to compile selectors -//doing this in lib/pseudos.js would lead to circular dependencies, -//so we add them here -filters.not = function(next, token, options, context) { - var opts = { - xmlMode: !!(options && options.xmlMode), - strict: !!(options && options.strict), - adapter: options.adapter - }; - - if (opts.strict) { - if (token.length > 1 || token.some(containsTraversal)) { - throw new Error("complex selectors in :not aren't allowed in strict mode"); - } - } - - var func = compileToken(token, opts, context); - - if (func === falseFunc) return next; - if (func === trueFunc) return falseFunc; - - return function not(elem) { - return !func(elem) && next(elem); - }; -}; - -filters.has = function(next, token, options) { - var adapter = options.adapter; - var opts = { - xmlMode: !!(options && options.xmlMode), - strict: !!(options && options.strict), - adapter: adapter - }; - - //FIXME: Uses an array as a pointer to the current element (side effects) - var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null; - - var func = compileToken(token, opts, context); - - if (func === falseFunc) return falseFunc; - if (func === trueFunc) { - return function hasChild(elem) { - return adapter.getChildren(elem).some(adapter.isTag) && next(elem); - }; - } - - func = wrap(func, options); - - if (context) { - return function has(elem) { - return next(elem) && ((context[0] = elem), adapter.existsOne(func, adapter.getChildren(elem))); - }; - } - - return function has(elem) { - return next(elem) && adapter.existsOne(func, adapter.getChildren(elem)); - }; -}; - -filters.matches = function(next, token, options, context) { - var opts = { - xmlMode: !!(options && options.xmlMode), - strict: !!(options && options.strict), - rootFunc: next, - adapter: options.adapter - }; - - return compileToken(token, opts, context); -}; - -compile.compileToken = compileToken; -compile.compileUnsafe = compileUnsafe; -compile.Pseudos = Pseudos; - - -/***/ }), - -/***/ 35890: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var attributes = __webpack_require__(91221); -var Pseudos = __webpack_require__(65582); - -/* - all available rules -*/ -module.exports = { - __proto__: null, - - attribute: attributes.compile, - pseudo: Pseudos.compile, - - //tags - tag: function(next, data, options) { - var name = data.name; - var adapter = options.adapter; - - return function tag(elem) { - return adapter.getName(elem) === name && next(elem); - }; - }, - - //traversal - descendant: function(next, data, options) { - // eslint-disable-next-line no-undef - var isFalseCache = typeof WeakSet !== "undefined" ? new WeakSet() : null; - var adapter = options.adapter; - - return function descendant(elem) { - var found = false; - - while (!found && (elem = adapter.getParent(elem))) { - if (!isFalseCache || !isFalseCache.has(elem)) { - found = next(elem); - if (!found && isFalseCache) { - isFalseCache.add(elem); - } - } - } - - return found; - }; - }, - _flexibleDescendant: function(next, data, options) { - var adapter = options.adapter; - - // Include element itself, only used while querying an array - return function descendant(elem) { - var found = next(elem); - - while (!found && (elem = adapter.getParent(elem))) { - found = next(elem); - } - - return found; - }; - }, - parent: function(next, data, options) { - if (options && options.strict) { - throw new Error("Parent selector isn't part of CSS3"); - } - - var adapter = options.adapter; - - return function parent(elem) { - return adapter.getChildren(elem).some(test); - }; - - function test(elem) { - return adapter.isTag(elem) && next(elem); - } - }, - child: function(next, data, options) { - var adapter = options.adapter; - - return function child(elem) { - var parent = adapter.getParent(elem); - return !!parent && next(parent); - }; - }, - sibling: function(next, data, options) { - var adapter = options.adapter; - - return function sibling(elem) { - var siblings = adapter.getSiblings(elem); - - for (var i = 0; i < siblings.length; i++) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) break; - if (next(siblings[i])) return true; - } - } - - return false; - }; - }, - adjacent: function(next, data, options) { - var adapter = options.adapter; - - return function adjacent(elem) { - var siblings = adapter.getSiblings(elem), - lastElement; - - for (var i = 0; i < siblings.length; i++) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) break; - lastElement = siblings[i]; - } - } - - return !!lastElement && next(lastElement); - }; - }, - universal: function(next) { - return next; - } -}; - - -/***/ }), - -/***/ 65582: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* - pseudo selectors - - --- - - they are available in two forms: - * filters called when the selector - is compiled and return a function - that needs to return next() - * pseudos get called on execution - they need to return a boolean -*/ - -var getNCheck = __webpack_require__(88970); -var BaseFuncs = __webpack_require__(27510); -var attributes = __webpack_require__(91221); -var trueFunc = BaseFuncs.trueFunc; -var falseFunc = BaseFuncs.falseFunc; - -var checkAttrib = attributes.rules.equals; - -function getAttribFunc(name, value) { - var data = { name: name, value: value }; - return function attribFunc(next, rule, options) { - return checkAttrib(next, data, options); - }; -} - -function getChildFunc(next, adapter) { - return function(elem) { - return !!adapter.getParent(elem) && next(elem); - }; -} - -var filters = { - contains: function(next, text, options) { - var adapter = options.adapter; - - return function contains(elem) { - return next(elem) && adapter.getText(elem).indexOf(text) >= 0; - }; - }, - icontains: function(next, text, options) { - var itext = text.toLowerCase(); - var adapter = options.adapter; - - return function icontains(elem) { - return ( - next(elem) && - adapter - .getText(elem) - .toLowerCase() - .indexOf(itext) >= 0 - ); - }; - }, - - //location specific methods - "nth-child": function(next, rule, options) { - var func = getNCheck(rule); - var adapter = options.adapter; - - if (func === falseFunc) return func; - if (func === trueFunc) return getChildFunc(next, adapter); - - return function nthChild(elem) { - var siblings = adapter.getSiblings(elem); - - for (var i = 0, pos = 0; i < siblings.length; i++) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) break; - else pos++; - } - } - - return func(pos) && next(elem); - }; - }, - "nth-last-child": function(next, rule, options) { - var func = getNCheck(rule); - var adapter = options.adapter; - - if (func === falseFunc) return func; - if (func === trueFunc) return getChildFunc(next, adapter); - - return function nthLastChild(elem) { - var siblings = adapter.getSiblings(elem); - - for (var pos = 0, i = siblings.length - 1; i >= 0; i--) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) break; - else pos++; - } - } - - return func(pos) && next(elem); - }; - }, - "nth-of-type": function(next, rule, options) { - var func = getNCheck(rule); - var adapter = options.adapter; - - if (func === falseFunc) return func; - if (func === trueFunc) return getChildFunc(next, adapter); - - return function nthOfType(elem) { - var siblings = adapter.getSiblings(elem); - - for (var pos = 0, i = 0; i < siblings.length; i++) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) break; - if (adapter.getName(siblings[i]) === adapter.getName(elem)) pos++; - } - } - - return func(pos) && next(elem); - }; - }, - "nth-last-of-type": function(next, rule, options) { - var func = getNCheck(rule); - var adapter = options.adapter; - - if (func === falseFunc) return func; - if (func === trueFunc) return getChildFunc(next, adapter); - - return function nthLastOfType(elem) { - var siblings = adapter.getSiblings(elem); - - for (var pos = 0, i = siblings.length - 1; i >= 0; i--) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) break; - if (adapter.getName(siblings[i]) === adapter.getName(elem)) pos++; - } - } - - return func(pos) && next(elem); - }; - }, - - //TODO determine the actual root element - root: function(next, rule, options) { - var adapter = options.adapter; - - return function(elem) { - return !adapter.getParent(elem) && next(elem); - }; - }, - - scope: function(next, rule, options, context) { - var adapter = options.adapter; - - if (!context || context.length === 0) { - //equivalent to :root - return filters.root(next, rule, options); - } - - function equals(a, b) { - if (typeof adapter.equals === "function") return adapter.equals(a, b); - - return a === b; - } - - if (context.length === 1) { - //NOTE: can't be unpacked, as :has uses this for side-effects - return function(elem) { - return equals(context[0], elem) && next(elem); - }; - } - - return function(elem) { - return context.indexOf(elem) >= 0 && next(elem); - }; - }, - - //jQuery extensions (others follow as pseudos) - checkbox: getAttribFunc("type", "checkbox"), - file: getAttribFunc("type", "file"), - password: getAttribFunc("type", "password"), - radio: getAttribFunc("type", "radio"), - reset: getAttribFunc("type", "reset"), - image: getAttribFunc("type", "image"), - submit: getAttribFunc("type", "submit"), - - //dynamic state pseudos. These depend on optional Adapter methods. - hover: function(next, rule, options) { - var adapter = options.adapter; - - if (typeof adapter.isHovered === 'function') { - return function hover(elem) { - return next(elem) && adapter.isHovered(elem); - }; - } - - return falseFunc; - }, - visited: function(next, rule, options) { - var adapter = options.adapter; - - if (typeof adapter.isVisited === 'function') { - return function visited(elem) { - return next(elem) && adapter.isVisited(elem); - }; - } - - return falseFunc; - }, - active: function(next, rule, options) { - var adapter = options.adapter; - - if (typeof adapter.isActive === 'function') { - return function active(elem) { - return next(elem) && adapter.isActive(elem); - }; - } - - return falseFunc; - } -}; - -//helper methods -function getFirstElement(elems, adapter) { - for (var i = 0; elems && i < elems.length; i++) { - if (adapter.isTag(elems[i])) return elems[i]; - } -} - -//while filters are precompiled, pseudos get called when they are needed -var pseudos = { - empty: function(elem, adapter) { - return !adapter.getChildren(elem).some(function(elem) { - return adapter.isTag(elem) || elem.type === "text"; - }); - }, - - "first-child": function(elem, adapter) { - return getFirstElement(adapter.getSiblings(elem), adapter) === elem; - }, - "last-child": function(elem, adapter) { - var siblings = adapter.getSiblings(elem); - - for (var i = siblings.length - 1; i >= 0; i--) { - if (siblings[i] === elem) return true; - if (adapter.isTag(siblings[i])) break; - } - - return false; - }, - "first-of-type": function(elem, adapter) { - var siblings = adapter.getSiblings(elem); - - for (var i = 0; i < siblings.length; i++) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) return true; - if (adapter.getName(siblings[i]) === adapter.getName(elem)) break; - } - } - - return false; - }, - "last-of-type": function(elem, adapter) { - var siblings = adapter.getSiblings(elem); - - for (var i = siblings.length - 1; i >= 0; i--) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) return true; - if (adapter.getName(siblings[i]) === adapter.getName(elem)) break; - } - } - - return false; - }, - "only-of-type": function(elem, adapter) { - var siblings = adapter.getSiblings(elem); - - for (var i = 0, j = siblings.length; i < j; i++) { - if (adapter.isTag(siblings[i])) { - if (siblings[i] === elem) continue; - if (adapter.getName(siblings[i]) === adapter.getName(elem)) { - return false; - } - } - } - - return true; - }, - "only-child": function(elem, adapter) { - var siblings = adapter.getSiblings(elem); - - for (var i = 0; i < siblings.length; i++) { - if (adapter.isTag(siblings[i]) && siblings[i] !== elem) return false; - } - - return true; - }, - - //:matches(a, area, link)[href] - link: function(elem, adapter) { - return adapter.hasAttrib(elem, "href"); - }, - //TODO: :any-link once the name is finalized (as an alias of :link) - - //forms - //to consider: :target - - //:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type) - selected: function(elem, adapter) { - if (adapter.hasAttrib(elem, "selected")) return true; - else if (adapter.getName(elem) !== "option") return false; - - //the first